[Bf-blender-cvs] [5653c5fcdd9] master: Cycles: keep track of SVM nodes used in kernels

Michael Jones noreply at git.blender.org
Fri Jul 15 14:14:51 CEST 2022


Commit: 5653c5fcdd9f424dc05ddf73b18ba8294daf4788
Author: Michael Jones
Date:   Tue Jul 12 17:22:36 2022 +0200
Branches: master
https://developer.blender.org/rB5653c5fcdd9f424dc05ddf73b18ba8294daf4788

Cycles: keep track of SVM nodes used in kernels

To be used for specialization in Metal, to automatically leave out unused nodes
from the kernel.

Ref D14645

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

M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/data_template.h
A	intern/cycles/kernel/svm/node_types_template.h
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/types.h
M	intern/cycles/scene/shader_nodes.cpp
M	intern/cycles/scene/svm.cpp
M	intern/cycles/scene/svm.h

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

diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index 4ff947e7136..527cc4ec111 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -154,6 +154,7 @@ set(SRC_KERNEL_SVM_HEADERS
   svm/math_util.h
   svm/mix.h
   svm/musgrave.h
+  svm/node_types_template.h
   svm/noise.h
   svm/noisetex.h
   svm/normal.h
diff --git a/intern/cycles/kernel/data_template.h b/intern/cycles/kernel/data_template.h
index 22f945f1335..b06ac62a5d8 100644
--- a/intern/cycles/kernel/data_template.h
+++ b/intern/cycles/kernel/data_template.h
@@ -194,6 +194,13 @@ KERNEL_STRUCT_MEMBER(integrator, int, direct_light_sampling_type)
 KERNEL_STRUCT_MEMBER(integrator, int, pad1)
 KERNEL_STRUCT_END(KernelIntegrator)
 
+/* SVM. For shader specialization. */
+
+KERNEL_STRUCT_BEGIN(KernelSVMUsage, svm_usage)
+#define SHADER_NODE_TYPE(type) KERNEL_STRUCT_MEMBER(svm_usage, int, type)
+#include "kernel/svm/node_types_template.h"
+KERNEL_STRUCT_END(KernelSVMUsage)
+
 #undef KERNEL_STRUCT_BEGIN
 #undef KERNEL_STRUCT_MEMBER
 #undef KERNEL_STRUCT_END
diff --git a/intern/cycles/kernel/svm/node_types_template.h b/intern/cycles/kernel/svm/node_types_template.h
new file mode 100644
index 00000000000..39d279be4cb
--- /dev/null
+++ b/intern/cycles/kernel/svm/node_types_template.h
@@ -0,0 +1,110 @@
+/* SPDX-License-Identifier: Apache-2.0
+ * Copyright 2011-2022 Blender Foundation */
+
+#ifndef SHADER_NODE_TYPE
+#  define SHADER_NODE_TYPE(name)
+#endif
+
+/* NOTE: for best OpenCL performance, item definition in the enum must
+ * match the switch case order in `svm.h`. */
+
+SHADER_NODE_TYPE(NODE_END)
+SHADER_NODE_TYPE(NODE_SHADER_JUMP)
+SHADER_NODE_TYPE(NODE_CLOSURE_BSDF)
+SHADER_NODE_TYPE(NODE_CLOSURE_EMISSION)
+SHADER_NODE_TYPE(NODE_CLOSURE_BACKGROUND)
+SHADER_NODE_TYPE(NODE_CLOSURE_SET_WEIGHT)
+SHADER_NODE_TYPE(NODE_CLOSURE_WEIGHT)
+SHADER_NODE_TYPE(NODE_EMISSION_WEIGHT)
+SHADER_NODE_TYPE(NODE_MIX_CLOSURE)
+SHADER_NODE_TYPE(NODE_JUMP_IF_ZERO)
+SHADER_NODE_TYPE(NODE_JUMP_IF_ONE)
+SHADER_NODE_TYPE(NODE_GEOMETRY)
+SHADER_NODE_TYPE(NODE_CONVERT)
+SHADER_NODE_TYPE(NODE_TEX_COORD)
+SHADER_NODE_TYPE(NODE_VALUE_F)
+SHADER_NODE_TYPE(NODE_VALUE_V)
+SHADER_NODE_TYPE(NODE_ATTR)
+SHADER_NODE_TYPE(NODE_VERTEX_COLOR)
+SHADER_NODE_TYPE(NODE_GEOMETRY_BUMP_DX)
+SHADER_NODE_TYPE(NODE_GEOMETRY_BUMP_DY)
+SHADER_NODE_TYPE(NODE_SET_DISPLACEMENT)
+SHADER_NODE_TYPE(NODE_DISPLACEMENT)
+SHADER_NODE_TYPE(NODE_VECTOR_DISPLACEMENT)
+SHADER_NODE_TYPE(NODE_TEX_IMAGE)
+SHADER_NODE_TYPE(NODE_TEX_IMAGE_BOX)
+SHADER_NODE_TYPE(NODE_TEX_NOISE)
+SHADER_NODE_TYPE(NODE_SET_BUMP)
+SHADER_NODE_TYPE(NODE_ATTR_BUMP_DX)
+SHADER_NODE_TYPE(NODE_ATTR_BUMP_DY)
+SHADER_NODE_TYPE(NODE_VERTEX_COLOR_BUMP_DX)
+SHADER_NODE_TYPE(NODE_VERTEX_COLOR_BUMP_DY)
+SHADER_NODE_TYPE(NODE_TEX_COORD_BUMP_DX)
+SHADER_NODE_TYPE(NODE_TEX_COORD_BUMP_DY)
+SHADER_NODE_TYPE(NODE_CLOSURE_SET_NORMAL)
+SHADER_NODE_TYPE(NODE_ENTER_BUMP_EVAL)
+SHADER_NODE_TYPE(NODE_LEAVE_BUMP_EVAL)
+SHADER_NODE_TYPE(NODE_HSV)
+SHADER_NODE_TYPE(NODE_CLOSURE_HOLDOUT)
+SHADER_NODE_TYPE(NODE_FRESNEL)
+SHADER_NODE_TYPE(NODE_LAYER_WEIGHT)
+SHADER_NODE_TYPE(NODE_CLOSURE_VOLUME)
+SHADER_NODE_TYPE(NODE_PRINCIPLED_VOLUME)
+SHADER_NODE_TYPE(NODE_MATH)
+SHADER_NODE_TYPE(NODE_VECTOR_MATH)
+SHADER_NODE_TYPE(NODE_RGB_RAMP)
+SHADER_NODE_TYPE(NODE_GAMMA)
+SHADER_NODE_TYPE(NODE_BRIGHTCONTRAST)
+SHADER_NODE_TYPE(NODE_LIGHT_PATH)
+SHADER_NODE_TYPE(NODE_OBJECT_INFO)
+SHADER_NODE_TYPE(NODE_PARTICLE_INFO)
+SHADER_NODE_TYPE(NODE_HAIR_INFO)
+SHADER_NODE_TYPE(NODE_POINT_INFO)
+SHADER_NODE_TYPE(NODE_TEXTURE_MAPPING)
+SHADER_NODE_TYPE(NODE_MAPPING)
+SHADER_NODE_TYPE(NODE_MIN_MAX)
+SHADER_NODE_TYPE(NODE_CAMERA)
+SHADER_NODE_TYPE(NODE_TEX_ENVIRONMENT)
+SHADER_NODE_TYPE(NODE_TEX_SKY)
+SHADER_NODE_TYPE(NODE_TEX_GRADIENT)
+SHADER_NODE_TYPE(NODE_TEX_VORONOI)
+SHADER_NODE_TYPE(NODE_TEX_MUSGRAVE)
+SHADER_NODE_TYPE(NODE_TEX_WAVE)
+SHADER_NODE_TYPE(NODE_TEX_MAGIC)
+SHADER_NODE_TYPE(NODE_TEX_CHECKER)
+SHADER_NODE_TYPE(NODE_TEX_BRICK)
+SHADER_NODE_TYPE(NODE_TEX_WHITE_NOISE)
+SHADER_NODE_TYPE(NODE_NORMAL)
+SHADER_NODE_TYPE(NODE_LIGHT_FALLOFF)
+SHADER_NODE_TYPE(NODE_IES)
+SHADER_NODE_TYPE(NODE_CURVES)
+SHADER_NODE_TYPE(NODE_TANGENT)
+SHADER_NODE_TYPE(NODE_NORMAL_MAP)
+SHADER_NODE_TYPE(NODE_INVERT)
+SHADER_NODE_TYPE(NODE_MIX)
+SHADER_NODE_TYPE(NODE_SEPARATE_COLOR)
+SHADER_NODE_TYPE(NODE_COMBINE_COLOR)
+SHADER_NODE_TYPE(NODE_SEPARATE_VECTOR)
+SHADER_NODE_TYPE(NODE_COMBINE_VECTOR)
+SHADER_NODE_TYPE(NODE_SEPARATE_HSV)
+SHADER_NODE_TYPE(NODE_COMBINE_HSV)
+SHADER_NODE_TYPE(NODE_VECTOR_ROTATE)
+SHADER_NODE_TYPE(NODE_VECTOR_TRANSFORM)
+SHADER_NODE_TYPE(NODE_WIREFRAME)
+SHADER_NODE_TYPE(NODE_WAVELENGTH)
+SHADER_NODE_TYPE(NODE_BLACKBODY)
+SHADER_NODE_TYPE(NODE_MAP_RANGE)
+SHADER_NODE_TYPE(NODE_VECTOR_MAP_RANGE)
+SHADER_NODE_TYPE(NODE_CLAMP)
+SHADER_NODE_TYPE(NODE_BEVEL)
+SHADER_NODE_TYPE(NODE_AMBIENT_OCCLUSION)
+SHADER_NODE_TYPE(NODE_TEX_VOXEL)
+SHADER_NODE_TYPE(NODE_AOV_START)
+SHADER_NODE_TYPE(NODE_AOV_COLOR)
+SHADER_NODE_TYPE(NODE_AOV_VALUE)
+SHADER_NODE_TYPE(NODE_FLOAT_CURVE)
+
+/* Padding for struct alignment. */
+SHADER_NODE_TYPE(NODE_PAD1)
+
+#undef SHADER_NODE_TYPE
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 8fd41ec8531..9840cda3655 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -204,6 +204,8 @@ CCL_NAMESPACE_END
 
 CCL_NAMESPACE_BEGIN
 
+#define SVM_CASE(node) case node:
+
 /* Main Interpreter Loop */
 template<uint node_feature_mask, ShaderType type, typename ConstIntegratorGenericState>
 ccl_device void svm_eval_nodes(KernelGlobals kg,
@@ -219,9 +221,10 @@ ccl_device void svm_eval_nodes(KernelGlobals kg,
     uint4 node = read_node(kg, &offset);
 
     switch (node.x) {
-      case NODE_END:
-        return;
-      case NODE_SHADER_JUMP: {
+      SVM_CASE(NODE_END)
+      return;
+      SVM_CASE(NODE_SHADER_JUMP)
+      {
         if (type == SHADER_TYPE_SURFACE)
           offset = node.y;
         else if (type == SHADER_TYPE_VOLUME)
@@ -232,351 +235,349 @@ ccl_device void svm_eval_nodes(KernelGlobals kg,
           return;
         break;
       }
-      case NODE_CLOSURE_BSDF:
-        offset = svm_node_closure_bsdf<node_feature_mask, type>(
-            kg, sd, stack, node, path_flag, offset);
-        break;
-      case NODE_CLOSURE_EMISSION:
-        IF_KERNEL_NODES_FEATURE(EMISSION)
-        {
-          svm_node_closure_emission(sd, stack, node);
-        }
-        break;
-      case NODE_CLOSURE_BACKGROUND:
-        IF_KERNEL_NODES_FEATURE(EMISSION)
-        {
-          svm_node_closure_background(sd, stack, node);
-        }
-        break;
-      case NODE_CLOSURE_SET_WEIGHT:
-        svm_node_closure_set_weight(sd, node.y, node.z, node.w);
-        break;
-      case NODE_CLOSURE_WEIGHT:
-        svm_node_closure_weight(sd, stack, node.y);
-        break;
-      case NODE_EMISSION_WEIGHT:
-        IF_KERNEL_NODES_FEATURE(EMISSION)
-        {
-          svm_node_emission_weight(kg, sd, stack, node);
-        }
-        break;
-      case NODE_MIX_CLOSURE:
-        svm_node_mix_closure(sd, stack, node);
-        break;
-      case NODE_JUMP_IF_ZERO:
-        if (stack_load_float(stack, node.z) <= 0.0f)
-          offset += node.y;
-        break;
-      case NODE_JUMP_IF_ONE:
-        if (stack_load_float(stack, node.z) >= 1.0f)
-          offset += node.y;
-        break;
-      case NODE_GEOMETRY:
-        svm_node_geometry(kg, sd, stack, node.y, node.z);
-        break;
-      case NODE_CONVERT:
-        svm_node_convert(kg, sd, stack, node.y, node.z, node.w);
-        break;
-      case NODE_TEX_COORD:
-        offset = svm_node_tex_coord(kg, sd, path_flag, stack, node, offset);
-        break;
-      case NODE_VALUE_F:
-        svm_node_value_f(kg, sd, stack, node.y, node.z);
-        break;
-      case NODE_VALUE_V:
-        offset = svm_node_value_v(kg, sd, stack, node.y, offset);
-        break;
-      case NODE_ATTR:
-        svm_node_attr<node_feature_mask>(kg, sd, stack, node);
-        break;
-      case NODE_VERTEX_COLOR:
-        svm_node_vertex_color(kg, sd, stack, node.y, node.z, node.w);
-        break;
-      case NODE_GEOMETRY_BUMP_DX:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z);
-        }
-        break;
-      case NODE_GEOMETRY_BUMP_DY:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z);
-        }
-        break;
-      case NODE_SET_DISPLACEMENT:
-        svm_node_set_displacement<node_feature_mask>(kg, sd, stack, node.y);
-        break;
-      case NODE_DISPLACEMENT:
-        svm_node_displacement<node_feature_mask>(kg, sd, stack, node);
-        break;
-      case NODE_VECTOR_DISPLACEMENT:
-        offset = svm_node_vector_displacement<node_feature_mask>(kg, sd, stack, node, offset);
-        break;
-      case NODE_TEX_IMAGE:
-        offset = svm_node_tex_image(kg, sd, stack, node, offset);
-        break;
-      case NODE_TEX_IMAGE_BOX:
-        svm_node_tex_image_box(kg, sd, stack, node);
-        break;
-      case NODE_TEX_NOISE:
-        offset = svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, offset);
-        break;
-      case NODE_SET_BUMP:
-        svm_node_set_bump<node_feature_mask>(kg, sd, stack, node);
-        break;
-      case NODE_ATTR_BUMP_DX:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          svm_node_attr_bump_dx(kg, sd, stack, node);
-        }
-        break;
-      case NODE_ATTR_BUMP_DY:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          svm_node_attr_bump_dy(kg, sd, stack, node);
-        }
-        break;
-      case NODE_VERTEX_COLOR_BUMP_DX:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          svm_node_vertex_color_bump_dx(kg, sd, stack, node.y, node.z, node.w);
-        }
-        break;
-      case NODE_VERTEX_COLOR_BUMP_DY:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          svm_node_vertex_color_bump_dy(kg, sd, stack, node.y, node.z, node.w);
-        }
-        break;
-      case NODE_TEX_COORD_BUMP_DX:
-        IF_KERNEL_NODES_FEATURE(BUMP)
-        {
-          offset = svm_node_tex_coord_bump_dx(kg, sd, path_flag, stac

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list