[Bf-blender-cvs] [2bec6f1f06d] master: Cycles: work around OpenCL performance regression after AOVs and vector rotate

Brecht Van Lommel noreply at git.blender.org
Tue Mar 24 16:49:55 CET 2020


Commit: 2bec6f1f06dff400d3b5abd08064ef05312a29bf
Author: Brecht Van Lommel
Date:   Tue Mar 24 01:27:38 2020 +0100
Branches: master
https://developer.blender.org/rB2bec6f1f06dff400d3b5abd08064ef05312a29bf

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

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

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

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

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();



More information about the Bf-blender-cvs mailing list