From 2bec6f1f06dff400d3b5abd08064ef05312a29bf Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 24 Mar 2020 01:27:38 +0100 Subject: Cycles: work around OpenCL performance regression after AOVs and vector rotate We appear to be hitting some limit where adding any amount of code causes a significant performance regression, no matter what it does. To work around that a new node level was added. Ref T71479 --- intern/cycles/kernel/svm/svm.h | 35 +++++++++++++++++++---------------- intern/cycles/kernel/svm/svm_types.h | 3 ++- intern/cycles/render/nodes.h | 7 ++++++- 3 files changed, 27 insertions(+), 18 deletions(-) (limited to 'intern') diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 2ce4456250f..0b2cbad4ff8 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -459,17 +459,6 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, case NODE_IES: svm_node_ies(kg, sd, stack, node, &offset); break; - case NODE_AOV_START: - if (!svm_node_aov_check(state, buffer)) { - return; - } - break; - case NODE_AOV_COLOR: - svm_node_aov_color(kg, sd, stack, node, buffer); - break; - case NODE_AOV_VALUE: - svm_node_aov_value(kg, sd, stack, node, buffer); - break; #endif /* NODES_GROUP(NODE_GROUP_LEVEL_2) */ #if NODES_GROUP(NODE_GROUP_LEVEL_3) @@ -522,11 +511,6 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, case NODE_CLAMP: svm_node_clamp(kg, sd, stack, node.y, node.z, node.w, &offset); break; -# if NODES_FEATURE(NODE_FEATURE_VOLUME) - case NODE_TEX_VOXEL: - svm_node_tex_voxel(kg, sd, stack, node, &offset); - break; -# endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */ # ifdef __SHADER_RAYTRACE__ case NODE_BEVEL: svm_node_bevel(kg, sd, state, stack, node); @@ -536,6 +520,25 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, break; # endif /* __SHADER_RAYTRACE__ */ #endif /* NODES_GROUP(NODE_GROUP_LEVEL_3) */ + +#if NODES_GROUP(NODE_GROUP_LEVEL_4) +# if NODES_FEATURE(NODE_FEATURE_VOLUME) + case NODE_TEX_VOXEL: + svm_node_tex_voxel(kg, sd, stack, node, &offset); + break; +# endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */ + case NODE_AOV_START: + if (!svm_node_aov_check(state, buffer)) { + return; + } + break; + case NODE_AOV_COLOR: + svm_node_aov_color(kg, sd, stack, node, buffer); + break; + case NODE_AOV_VALUE: + svm_node_aov_value(kg, sd, stack, node, buffer); + break; +#endif /* NODES_GROUP(NODE_GROUP_LEVEL_4) */ case NODE_END: return; default: diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 38f12ebdf48..86e5a52174a 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -42,7 +42,8 @@ CCL_NAMESPACE_BEGIN #define NODE_GROUP_LEVEL_1 1 #define NODE_GROUP_LEVEL_2 2 #define NODE_GROUP_LEVEL_3 3 -#define NODE_GROUP_LEVEL_MAX NODE_GROUP_LEVEL_3 +#define NODE_GROUP_LEVEL_4 4 +#define NODE_GROUP_LEVEL_MAX NODE_GROUP_LEVEL_4 #define NODE_FEATURE_VOLUME (1 << 0) #define NODE_FEATURE_HAIR (1 << 1) diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index e79de34bc2c..e201118574b 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -197,6 +197,11 @@ class OutputAOVNode : public ShaderNode { ustring name; + virtual int get_group() + { + return NODE_GROUP_LEVEL_4; + } + /* Don't allow output node de-duplication. */ virtual bool equals(const ShaderNode & /*other*/) { @@ -339,7 +344,7 @@ class PointDensityTextureNode : public ShaderNode { SHADER_NODE_NO_CLONE_CLASS(PointDensityTextureNode) virtual int get_group() { - return NODE_GROUP_LEVEL_3; + return NODE_GROUP_LEVEL_4; } ~PointDensityTextureNode(); -- cgit v1.2.3