From 7f215a0323051db129760b1869f8369dfb61081a Mon Sep 17 00:00:00 2001 From: Alaska Date: Mon, 22 Apr 2024 15:00:29 +1200 Subject: [PATCH 1/6] Cycles: Replace the fixed Tangent input with variable input --- intern/cycles/scene/shader_nodes.cpp | 30 +++++++++++++++++++--------- intern/cycles/scene/shader_nodes.h | 3 ++- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index 304eab9ddbe..e2bf9c469d5 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -2286,11 +2286,11 @@ void BsdfNode::compile(SVMCompiler &compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3, - ShaderInput *param4) + ShaderInput *param4, + ShaderInput *param5) { ShaderInput *color_in = input("Color"); ShaderInput *normal_in = input("Normal"); - ShaderInput *tangent_in = input("Tangent"); if (color_in->link) { compiler.add_node(NODE_CLOSURE_WEIGHT, compiler.stack_assign(color_in)); @@ -2300,10 +2300,9 @@ void BsdfNode::compile(SVMCompiler &compiler, } int normal_offset = (normal_in) ? compiler.stack_assign_if_linked(normal_in) : SVM_STACK_INVALID; - int tangent_offset = (tangent_in) ? compiler.stack_assign_if_linked(tangent_in) : - SVM_STACK_INVALID; int param3_offset = (param3) ? compiler.stack_assign(param3) : SVM_STACK_INVALID; int param4_offset = (param4) ? compiler.stack_assign(param4) : SVM_STACK_INVALID; + int param5_offset = (param5) ? compiler.stack_assign(param5) : SVM_STACK_INVALID; compiler.add_node( NODE_CLOSURE_BSDF, @@ -2314,7 +2313,7 @@ void BsdfNode::compile(SVMCompiler &compiler, __float_as_int((param1) ? get_float(param1->socket_type) : 0.0f), __float_as_int((param2) ? get_float(param2->socket_type) : 0.0f)); - compiler.add_node(normal_offset, tangent_offset, param3_offset, param4_offset); + compiler.add_node(normal_offset, param5_offset, param3_offset, param4_offset); } void BsdfNode::compile(SVMCompiler &compiler) @@ -2394,11 +2393,20 @@ void GlossyBsdfNode::compile(SVMCompiler &compiler) /* TODO: Just use weight for legacy MultiGGX? Would also simplify OSL. */ if (closure == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) { - BsdfNode::compile( - compiler, input("Roughness"), input("Anisotropy"), input("Rotation"), input("Color")); + BsdfNode::compile(compiler, + input("Roughness"), + input("Anisotropy"), + input("Rotation"), + input("Color"), + input("Tangent")); } else { - BsdfNode::compile(compiler, input("Roughness"), input("Anisotropy"), input("Rotation")); + BsdfNode::compile(compiler, + input("Roughness"), + input("Anisotropy"), + input("Rotation"), + NULL, + input("Tangent")); } } @@ -3535,7 +3543,11 @@ void HairBsdfNode::compile(SVMCompiler &compiler) { closure = component; - BsdfNode::compile(compiler, input("RoughnessU"), input("RoughnessV"), input("Offset")); + ShaderInput *tangent = input("Tangent"); + tangent = tangent->link || tangent->constant_folded_in ? tangent : NULL; + + BsdfNode::compile( + compiler, input("RoughnessU"), input("RoughnessV"), input("Offset"), NULL, tangent); } void HairBsdfNode::compile(OSLCompiler &compiler) diff --git a/intern/cycles/scene/shader_nodes.h b/intern/cycles/scene/shader_nodes.h index 842a7feb5b2..7d77ac0e5cd 100644 --- a/intern/cycles/scene/shader_nodes.h +++ b/intern/cycles/scene/shader_nodes.h @@ -482,7 +482,8 @@ class BsdfNode : public BsdfBaseNode { ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, - ShaderInput *param4 = NULL); + ShaderInput *param4 = NULL, + ShaderInput *param5 = NULL); NODE_SOCKET_API(float3, color) NODE_SOCKET_API(float3, normal) -- 2.30.2 From 50110d22fcbd9b4032ea8442129521054a507b33 Mon Sep 17 00:00:00 2001 From: Alaska Date: Mon, 22 Apr 2024 23:56:26 +1200 Subject: [PATCH 2/6] Reduce state usage with isotropic glossy bsdf --- intern/cycles/scene/shader_nodes.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index e2bf9c469d5..936d2d428b9 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -2391,6 +2391,9 @@ void GlossyBsdfNode::compile(SVMCompiler &compiler) { closure = distribution; + ShaderInput *tangent = input("Tangent"); + tangent = tangent->link || tangent->constant_folded_in ? tangent : NULL; + /* TODO: Just use weight for legacy MultiGGX? Would also simplify OSL. */ if (closure == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) { BsdfNode::compile(compiler, @@ -2398,15 +2401,11 @@ void GlossyBsdfNode::compile(SVMCompiler &compiler) input("Anisotropy"), input("Rotation"), input("Color"), - input("Tangent")); + tangent); } else { - BsdfNode::compile(compiler, - input("Roughness"), - input("Anisotropy"), - input("Rotation"), - NULL, - input("Tangent")); + BsdfNode::compile( + compiler, input("Roughness"), input("Anisotropy"), input("Rotation"), NULL, tangent); } } -- 2.30.2 From 26d9cda92ca3f90da4386b513119de1f00ef6774 Mon Sep 17 00:00:00 2001 From: Alaska Date: Tue, 23 Apr 2024 12:47:50 +1200 Subject: [PATCH 3/6] address Lukas comments --- intern/cycles/scene/shader_nodes.cpp | 8 ++++---- intern/cycles/scene/shader_nodes.h | 6 +++--- intern/cycles/scene/svm.cpp | 7 ++++++- intern/cycles/scene/svm.h | 1 + 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index 936d2d428b9..3cbcb3920c7 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -2392,7 +2392,7 @@ void GlossyBsdfNode::compile(SVMCompiler &compiler) closure = distribution; ShaderInput *tangent = input("Tangent"); - tangent = tangent->link || tangent->constant_folded_in ? tangent : NULL; + tangent = compiler.is_linked(tangent) ? tangent : nullptr; /* TODO: Just use weight for legacy MultiGGX? Would also simplify OSL. */ if (closure == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) { @@ -2405,7 +2405,7 @@ void GlossyBsdfNode::compile(SVMCompiler &compiler) } else { BsdfNode::compile( - compiler, input("Roughness"), input("Anisotropy"), input("Rotation"), NULL, tangent); + compiler, input("Roughness"), input("Anisotropy"), input("Rotation"), nullptr, tangent); } } @@ -3543,10 +3543,10 @@ void HairBsdfNode::compile(SVMCompiler &compiler) closure = component; ShaderInput *tangent = input("Tangent"); - tangent = tangent->link || tangent->constant_folded_in ? tangent : NULL; + tangent = compiler.is_linked(tangent) ? tangent : nullptr; BsdfNode::compile( - compiler, input("RoughnessU"), input("RoughnessV"), input("Offset"), NULL, tangent); + compiler, input("RoughnessU"), input("RoughnessV"), input("Offset"), nullptr, tangent); } void HairBsdfNode::compile(OSLCompiler &compiler) diff --git a/intern/cycles/scene/shader_nodes.h b/intern/cycles/scene/shader_nodes.h index 7d77ac0e5cd..953331cb983 100644 --- a/intern/cycles/scene/shader_nodes.h +++ b/intern/cycles/scene/shader_nodes.h @@ -481,9 +481,9 @@ class BsdfNode : public BsdfBaseNode { void compile(SVMCompiler &compiler, ShaderInput *param1, ShaderInput *param2, - ShaderInput *param3 = NULL, - ShaderInput *param4 = NULL, - ShaderInput *param5 = NULL); + ShaderInput *param3 = nullptr, + ShaderInput *param4 = nullptr, + ShaderInput *param5 = nullptr); NODE_SOCKET_API(float3, color) NODE_SOCKET_API(float3, normal) diff --git a/intern/cycles/scene/svm.cpp b/intern/cycles/scene/svm.cpp index 4f589db087c..88855c503c3 100644 --- a/intern/cycles/scene/svm.cpp +++ b/intern/cycles/scene/svm.cpp @@ -294,9 +294,14 @@ int SVMCompiler::stack_assign(ShaderOutput *output) return output->stack_offset; } +bool SVMCompiler::is_linked(ShaderInput *input) +{ + return (input->link || input->constant_folded_in); +} + int SVMCompiler::stack_assign_if_linked(ShaderInput *input) { - if (input->link || input->constant_folded_in) { + if (is_linked(input)) { return stack_assign(input); } diff --git a/intern/cycles/scene/svm.h b/intern/cycles/scene/svm.h index aa4f40b2577..986018a59ad 100644 --- a/intern/cycles/scene/svm.h +++ b/intern/cycles/scene/svm.h @@ -87,6 +87,7 @@ class SVMCompiler { int stack_assign(ShaderOutput *output); int stack_assign(ShaderInput *input); + bool is_linked(ShaderInput *input); int stack_assign_if_linked(ShaderInput *input); int stack_assign_if_linked(ShaderOutput *output); int stack_find_offset(int size); -- 2.30.2 From d0f2c53411689c5a7d50e80149009012178145d7 Mon Sep 17 00:00:00 2001 From: Alaska Date: Tue, 23 Apr 2024 15:32:00 +1200 Subject: [PATCH 4/6] Re-arrange params to be numerical --- intern/cycles/kernel/svm/closure.h | 20 ++++++++++---------- intern/cycles/scene/shader_nodes.cpp | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/intern/cycles/kernel/svm/closure.h b/intern/cycles/kernel/svm/closure.h index a19e371779a..6465c601899 100644 --- a/intern/cycles/kernel/svm/closure.h +++ b/intern/cycles/kernel/svm/closure.h @@ -477,17 +477,17 @@ ccl_device /* compute roughness */ float anisotropy = clamp(param2, -0.99f, 0.99f); - if (data_node.y == SVM_STACK_INVALID || fabsf(anisotropy) <= 1e-4f) { + if (data_node.w == SVM_STACK_INVALID || fabsf(anisotropy) <= 1e-4f) { /* Isotropic case. */ bsdf->T = zero_float3(); bsdf->alpha_x = roughness; bsdf->alpha_y = roughness; } else { - bsdf->T = stack_load_float3(stack, data_node.y); + bsdf->T = stack_load_float3(stack, data_node.w); /* rotate tangent */ - float rotation = stack_load_float(stack, data_node.z); + float rotation = stack_load_float(stack, data_node.y); if (rotation != 0.0f) { bsdf->T = rotate_around_axis(bsdf->T, bsdf->N, rotation * M_2PI_F); } @@ -513,7 +513,7 @@ ccl_device sd->flag |= bsdf_microfacet_ggx_setup(bsdf); if (type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) { kernel_assert(stack_valid(data_node.w)); - const Spectrum color = rgb_to_spectrum(stack_load_float3(stack, data_node.w)); + const Spectrum color = rgb_to_spectrum(stack_load_float3(stack, data_node.z)); bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd, color); } } @@ -585,7 +585,7 @@ ccl_device fresnel->f0 = make_float3(F0_from_ior(ior)); fresnel->f90 = one_spectrum(); fresnel->exponent = -ior; - const float3 color = stack_load_float3(stack, data_node.z); + const float3 color = stack_load_float3(stack, data_node.y); fresnel->reflection_tint = reflective_caustics ? rgb_to_spectrum(color) : zero_spectrum(); fresnel->transmission_tint = refractive_caustics ? rgb_to_spectrum(color) : zero_spectrum(); @@ -834,10 +834,10 @@ ccl_device bsdf->N = maybe_ensure_valid_specular_reflection(sd, N); bsdf->roughness1 = param1; bsdf->roughness2 = param2; - bsdf->offset = -stack_load_float(stack, data_node.z); + bsdf->offset = -stack_load_float(stack, data_node.y); - if (stack_valid(data_node.y)) { - bsdf->T = normalize(stack_load_float3(stack, data_node.y)); + if (stack_valid(data_node.w)) { + bsdf->T = normalize(stack_load_float3(stack, data_node.w)); } else if (!(sd->type & PRIMITIVE_CURVE)) { bsdf->T = normalize(sd->dPdv); @@ -866,12 +866,12 @@ ccl_device ccl_private Bssrdf *bssrdf = bssrdf_alloc(sd, weight); if (bssrdf) { - bssrdf->radius = rgb_to_spectrum(stack_load_float3(stack, data_node.z) * param1); + bssrdf->radius = rgb_to_spectrum(stack_load_float3(stack, data_node.y) * param1); bssrdf->albedo = closure_weight; bssrdf->N = maybe_ensure_valid_specular_reflection(sd, N); bssrdf->ior = param2; bssrdf->alpha = 1.0f; - bssrdf->anisotropy = stack_load_float(stack, data_node.w); + bssrdf->anisotropy = stack_load_float(stack, data_node.z); sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, (ClosureType)type); } diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index 3cbcb3920c7..114a1d6d2d5 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -2313,7 +2313,7 @@ void BsdfNode::compile(SVMCompiler &compiler, __float_as_int((param1) ? get_float(param1->socket_type) : 0.0f), __float_as_int((param2) ? get_float(param2->socket_type) : 0.0f)); - compiler.add_node(normal_offset, param5_offset, param3_offset, param4_offset); + compiler.add_node(normal_offset, param3_offset, param4_offset, param5_offset); } void BsdfNode::compile(SVMCompiler &compiler) -- 2.30.2 From 7ed235690a5a057fd8dbc825cd5e3914015f036b Mon Sep 17 00:00:00 2001 From: Alaska Date: Tue, 23 Apr 2024 20:38:36 +1200 Subject: [PATCH 5/6] Change param name to bsdf/data name --- intern/cycles/scene/shader_nodes.cpp | 26 +++++++++++++------------- intern/cycles/scene/shader_nodes.h | 10 +++++----- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index 114a1d6d2d5..96f879f728a 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -2283,11 +2283,11 @@ bool BsdfBaseNode::has_bump() BsdfNode::BsdfNode(const NodeType *node_type) : BsdfBaseNode(node_type) {} void BsdfNode::compile(SVMCompiler &compiler, - ShaderInput *param1, - ShaderInput *param2, - ShaderInput *param3, - ShaderInput *param4, - ShaderInput *param5) + ShaderInput *bsdf_y, + ShaderInput *bsdf_z, + ShaderInput *data_y, + ShaderInput *data_z, + ShaderInput *data_w) { ShaderInput *color_in = input("Color"); ShaderInput *normal_in = input("Normal"); @@ -2300,20 +2300,20 @@ void BsdfNode::compile(SVMCompiler &compiler, } int normal_offset = (normal_in) ? compiler.stack_assign_if_linked(normal_in) : SVM_STACK_INVALID; - int param3_offset = (param3) ? compiler.stack_assign(param3) : SVM_STACK_INVALID; - int param4_offset = (param4) ? compiler.stack_assign(param4) : SVM_STACK_INVALID; - int param5_offset = (param5) ? compiler.stack_assign(param5) : SVM_STACK_INVALID; + int data_y_offset = (data_y) ? compiler.stack_assign(data_y) : SVM_STACK_INVALID; + int data_z_offset = (data_z) ? compiler.stack_assign(data_z) : SVM_STACK_INVALID; + int data_w_offset = (data_w) ? compiler.stack_assign(data_w) : SVM_STACK_INVALID; compiler.add_node( NODE_CLOSURE_BSDF, compiler.encode_uchar4(closure, - (param1) ? compiler.stack_assign(param1) : SVM_STACK_INVALID, - (param2) ? compiler.stack_assign(param2) : SVM_STACK_INVALID, + (bsdf_y) ? compiler.stack_assign(bsdf_y) : SVM_STACK_INVALID, + (bsdf_z) ? compiler.stack_assign(bsdf_z) : SVM_STACK_INVALID, compiler.closure_mix_weight_offset()), - __float_as_int((param1) ? get_float(param1->socket_type) : 0.0f), - __float_as_int((param2) ? get_float(param2->socket_type) : 0.0f)); + __float_as_int((bsdf_y) ? get_float(bsdf_y->socket_type) : 0.0f), + __float_as_int((bsdf_z) ? get_float(bsdf_z->socket_type) : 0.0f)); - compiler.add_node(normal_offset, param3_offset, param4_offset, param5_offset); + compiler.add_node(normal_offset, data_y_offset, data_z_offset, data_w_offset); } void BsdfNode::compile(SVMCompiler &compiler) diff --git a/intern/cycles/scene/shader_nodes.h b/intern/cycles/scene/shader_nodes.h index 953331cb983..bbb38477a89 100644 --- a/intern/cycles/scene/shader_nodes.h +++ b/intern/cycles/scene/shader_nodes.h @@ -479,11 +479,11 @@ class BsdfNode : public BsdfBaseNode { SHADER_NODE_BASE_CLASS(BsdfNode) void compile(SVMCompiler &compiler, - ShaderInput *param1, - ShaderInput *param2, - ShaderInput *param3 = nullptr, - ShaderInput *param4 = nullptr, - ShaderInput *param5 = nullptr); + ShaderInput *bsdf_y, + ShaderInput *bsdf_z, + ShaderInput *data_y = nullptr, + ShaderInput *data_z = nullptr, + ShaderInput *data_w = nullptr); NODE_SOCKET_API(float3, color) NODE_SOCKET_API(float3, normal) -- 2.30.2 From 698da133d483e4a52cf9b0139a6a12878304e532 Mon Sep 17 00:00:00 2001 From: Alaska Date: Fri, 26 Apr 2024 05:40:00 +1200 Subject: [PATCH 6/6] Fix failing tests Was caused by a missed code change --- intern/cycles/kernel/svm/closure.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/kernel/svm/closure.h b/intern/cycles/kernel/svm/closure.h index 6465c601899..ad158e2f1d4 100644 --- a/intern/cycles/kernel/svm/closure.h +++ b/intern/cycles/kernel/svm/closure.h @@ -512,7 +512,7 @@ ccl_device else { sd->flag |= bsdf_microfacet_ggx_setup(bsdf); if (type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID) { - kernel_assert(stack_valid(data_node.w)); + kernel_assert(stack_valid(data_node.z)); const Spectrum color = rgb_to_spectrum(stack_load_float3(stack, data_node.z)); bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd, color); } -- 2.30.2