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
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user