[Bf-blender-cvs] [7cc3243ca8d] cycles-x: Fix Cycles X crash using a BSDF in a light shader

Brecht Van Lommel noreply at git.blender.org
Wed May 5 14:27:27 CEST 2021


Commit: 7cc3243ca8d64ba472885ead655c0d779623a68b
Author: Brecht Van Lommel
Date:   Tue May 4 18:37:08 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB7cc3243ca8d64ba472885ead655c0d779623a68b

Fix Cycles X crash using a BSDF in a light shader

* Move BSDF feature test so the right offset is applied
* Exclude BSDFs from volume shaders, and volumes from surface shaders,
  to prevent a similar issues.

It would be most efficient to exclude BSDFs entirely from light shaders, but
this is difficult since Cycles does not make a distinction. A shader can be used
by both a Mesh and Light and is compiled only once. We do make a distinction
between surface/volume/displacement shaders, so for that case we can ignore
the node during shader compilation.

Differential Revision: https://developer.blender.org/D11164

===================================================================

M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/svm_closure.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/nodes.h
M	intern/cycles/render/svm.cpp
M	intern/cycles/render/svm.h

===================================================================

diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index aee6e2a5823..9ae19c3fa38 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -258,9 +258,7 @@ ccl_device_noinline void svm_eval_nodes(INTEGRATOR_STATE_CONST_ARGS,
         break;
       }
       case NODE_CLOSURE_BSDF:
-        if (NODES_FEATURE(BSDF)) {
-          svm_node_closure_bsdf(kg, sd, stack, node, type, path_flag, &offset);
-        }
+        svm_node_closure_bsdf<node_feature_mask>(kg, sd, stack, node, type, path_flag, &offset);
         break;
       case NODE_CLOSURE_EMISSION:
         if (NODES_FEATURE(EMISSION)) {
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 80a87d5c2f8..a62616b3f85 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -57,6 +57,7 @@ ccl_device void svm_node_glass_setup(
   }
 }
 
+template<uint node_feature_mask>
 ccl_device void svm_node_closure_bsdf(const KernelGlobals *kg,
                                       ShaderData *sd,
                                       float *stack,
@@ -76,7 +77,7 @@ ccl_device void svm_node_closure_bsdf(const KernelGlobals *kg,
   uint4 data_node = read_node(kg, offset);
 
   /* Only compute BSDF for surfaces, transparent variable is shared with volume extinction. */
-  if (mix_weight == 0.0f || shader_type != SHADER_TYPE_SURFACE) {
+  if (!NODES_FEATURE(BSDF) || mix_weight == 0.0f || shader_type != SHADER_TYPE_SURFACE) {
     if (type == CLOSURE_BSDF_PRINCIPLED_ID) {
       /* Read all principled BSDF extra data to get the right offset. */
       read_node(kg, offset);
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index c246220e27c..107fc1851ce 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -64,6 +64,7 @@ enum SvmNodeFeatureFlag {
   (NODE_FEATURE_EMISSION | NODE_FEATURE_VOLUME | NODE_FEATURE_VORONOI_EXTRA)
 #define NODE_FEATURE_MASK_DISPLACEMENT \
   (NODE_FEATURE_VORONOI_EXTRA | NODE_FEATURE_BUMP | NODE_FEATURE_BUMP_STATE)
+#define NODE_FEATURE_MASK_BUMP NODE_FEATURE_MASK_DISPLACEMENT
 
 #define NODES_GROUP(group) ((group) <= __NODES_MAX_GROUP__)
 #define NODES_FEATURE(feature) \
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index fb9cf0c9836..280296218cb 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -546,6 +546,11 @@ class BsdfBaseNode : public ShaderNode {
     return false;
   }
 
+  virtual int get_feature()
+  {
+    return ShaderNode::get_feature() | NODE_FEATURE_BSDF;
+  }
+
  protected:
   ClosureType closure;
 };
@@ -782,6 +787,11 @@ class EmissionNode : public ShaderNode {
     return true;
   }
 
+  virtual int get_feature()
+  {
+    return ShaderNode::get_feature() | NODE_FEATURE_EMISSION;
+  }
+
   NODE_SOCKET_API(float3, color)
   NODE_SOCKET_API(float, strength)
   NODE_SOCKET_API(float, surface_mix_weight)
@@ -792,6 +802,11 @@ class BackgroundNode : public ShaderNode {
   SHADER_NODE_CLASS(BackgroundNode)
   void constant_fold(const ConstantFolder &folder);
 
+  virtual int get_feature()
+  {
+    return ShaderNode::get_feature() | NODE_FEATURE_EMISSION;
+  }
+
   NODE_SOCKET_API(float3, color)
   NODE_SOCKET_API(float, strength)
   NODE_SOCKET_API(float, surface_mix_weight)
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index fce604234f1..902034dd069 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -492,6 +492,13 @@ void SVMCompiler::generate_svm_nodes(const ShaderNodeSet &nodes, CompilerState *
 
 void SVMCompiler::generate_closure_node(ShaderNode *node, CompilerState *state)
 {
+  /* Skip generating closure that are not supported or needed for a particular
+   * type of shader. For example a BSDF in a volume shader. */
+  const int node_feature = node->get_feature();
+  if ((state->node_feature_mask & node_feature) != node_feature) {
+    return;
+  }
+
   /* execute dependencies for closure */
   foreach (ShaderInput *in, node->inputs) {
     if (in->link != NULL) {
@@ -785,17 +792,21 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
         case SHADER_TYPE_SURFACE: /* generate surface shader */
           generate = true;
           shader->has_surface = true;
+          state.node_feature_mask = NODE_FEATURE_MASK_SURFACE;
           break;
         case SHADER_TYPE_VOLUME: /* generate volume shader */
           generate = true;
           shader->has_volume = true;
+          state.node_feature_mask = NODE_FEATURE_MASK_VOLUME;
           break;
         case SHADER_TYPE_DISPLACEMENT: /* generate displacement shader */
           generate = true;
           shader->has_displacement = true;
+          state.node_feature_mask = NODE_FEATURE_MASK_DISPLACEMENT;
           break;
         case SHADER_TYPE_BUMP: /* generate bump shader */
           generate = true;
+          state.node_feature_mask = NODE_FEATURE_MASK_BUMP;
           break;
         default:
           break;
@@ -964,6 +975,7 @@ SVMCompiler::CompilerState::CompilerState(ShaderGraph *graph)
     max_id = max(node->id, max_id);
   }
   nodes_done_flag.resize(max_id + 1, false);
+  node_feature_mask = NODE_FEATURE_ALL;
 }
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h
index a4ca68e1d8d..320bd40ae98 100644
--- a/intern/cycles/render/svm.h
+++ b/intern/cycles/render/svm.h
@@ -189,6 +189,9 @@ class SVMCompiler {
      * all areas to use this flags array.
      */
     vector<bool> nodes_done_flag;
+
+    /* Node features that can be compiled. */
+    uint node_feature_mask;
   };
 
   void stack_clear_temporary(ShaderNode *node);



More information about the Bf-blender-cvs mailing list