[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