[Bf-blender-cvs] [358c383] cycles_kernel_split: Cycles kernel split: Begin reworking selective node compilation

Sergey Sharybin noreply at git.blender.org
Thu May 7 15:53:54 CEST 2015


Commit: 358c383a272fa746d4723b6b3c4c6f5a7182c56d
Author: Sergey Sharybin
Date:   Thu May 7 15:54:48 2015 +0500
Branches: cycles_kernel_split
https://developer.blender.org/rB358c383a272fa746d4723b6b3c4c6f5a7182c56d

Cycles kernel split: Begin reworking selective node compilation

The idea is to replace previous approach based on parsing SVN nodes stack with
approach which will let us gather required nodes set prior to device update.

The new idea is:

- Have few node groups, starting with a group which contains nodes are used
  really often, and then couple of groups which will be extension of this one.

- Have feature-based nodes disabling, so it's possible to disable nodes related
  to features which are not used with the currently used nodes group.

This commit only lays down needed routines for this approach, actual split will
happen later after gathering statistics from bunch of production scenes.

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

M	intern/cycles/device/device.h
M	intern/cycles/device/device_opencl.cpp
M	intern/cycles/kernel/kernel_compat_cpu.h
M	intern/cycles/kernel/kernel_compat_cuda.h
M	intern/cycles/kernel/kernel_compat_opencl.h
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/graph.h
M	intern/cycles/render/nodes.h
M	intern/cycles/render/svm.cpp

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

diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 3242a3b..8d422dc 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -97,11 +97,16 @@ public:
 	/* statistics */
 	Stats &stats;
 
+	/* TODO(sergey): Move this to RequestedFeatureset argument of
+	 * load_kernels method.
+	 */
 	/* variables/functions used exclusively for split kernel */
 	/* Maximum closure count */
 	int clos_max;
 	/* Get all closure nodes associated with the scene */
 	set<int> closure_nodes;
+	int nodes_max_group;
+	int nodes_features;
 	/* Return background */
 	bool get_background() { return background; }
 
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index 481adb0..bec0747 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -1899,7 +1899,8 @@ public:
 				svm_build_options += " -D" + get_node_type_as_string((NodeType)node_iter);
 			}
 		}
-		svm_build_options += " ";
+		svm_build_options += " -D__NODES_MAX_GROUP__=" + string_printf("%d", nodes_max_group);
+		svm_build_options += " -D__NODES_FEATURES__=" + string_printf("%d", nodes_features);
 		/* Set max closure build option */
 #ifdef __MULTI_CLOSURE__
 		max_closure_build_option += string_printf("-DMAX_CLOSURE=%d ", clos_max);
diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h
index 0fa9ef6..7a5f70f 100644
--- a/intern/cycles/kernel/kernel_compat_cpu.h
+++ b/intern/cycles/kernel/kernel_compat_cpu.h
@@ -26,6 +26,14 @@
 #  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
 #endif
 
+/* Selective nodes compilation. */
+#ifndef __NODES_MAX_GROUP__
+#  define __NODES_MAX_GROUP__ NODE_GROUP_LEVEL_MAX
+#endif
+#ifndef __NODES_FEATURES__
+#  define __NODES_FEATURES__ NODE_FEATURE_ALL
+#endif
+
 #include "util_debug.h"
 #include "util_math.h"
 #include "util_simd.h"
diff --git a/intern/cycles/kernel/kernel_compat_cuda.h b/intern/cycles/kernel/kernel_compat_cuda.h
index 476d74d..9fdd3ab 100644
--- a/intern/cycles/kernel/kernel_compat_cuda.h
+++ b/intern/cycles/kernel/kernel_compat_cuda.h
@@ -22,6 +22,14 @@
 #define CCL_NAMESPACE_BEGIN
 #define CCL_NAMESPACE_END
 
+/* Selective nodes compilation. */
+#ifndef __NODES_MAX_GROUP__
+#  define __NODES_MAX_GROUP__ NODE_GROUP_LEVEL_MAX
+#endif
+#ifndef __NODES_FEATURES__
+#  define __NODES_FEATURES__ NODE_FEATURE_ALL
+#endif
+
 #include <cuda.h>
 #include <float.h>
 
diff --git a/intern/cycles/kernel/kernel_compat_opencl.h b/intern/cycles/kernel/kernel_compat_opencl.h
index 29de7dd..e8b36d2 100644
--- a/intern/cycles/kernel/kernel_compat_opencl.h
+++ b/intern/cycles/kernel/kernel_compat_opencl.h
@@ -46,6 +46,14 @@
 #define ccl_addr_space
 #endif
 
+/* Selective nodes compilation. */
+#ifndef __NODES_MAX_GROUP__
+#  define __NODES_MAX_GROUP__ NODE_GROUP_LEVEL_MAX
+#endif
+#ifndef __NODES_FEATURES__
+#  define __NODES_FEATURES__ NODE_FEATURE_ALL
+#endif
+
 /* no assert in opencl */
 #define kernel_assert(cond)
 
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index a93fe60..16c3891 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -182,6 +182,9 @@ CCL_NAMESPACE_END
 
 CCL_NAMESPACE_BEGIN
 
+#define NODES_GROUP(group) ((group) <= __NODES_MAX_GROUP__)
+#define NODES_FEATURE(feature) (__NODES_FEATURES__ & (feature) != 0)
+
 /* Main Interpreter Loop */
 ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderType type, int path_flag)
 {
@@ -192,7 +195,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade
 		uint4 node = read_node(kg, &offset);
 
 		switch(node.x) {
-#if defined(__NODE_SHADER_JUMP__) || !defined(__SPLIT_KERNEL__)
+#if NODES_GROUP(NODE_GROUP_LEVEL_0)
 			case NODE_SHADER_JUMP: {
 				if(type == SHADER_TYPE_SURFACE) offset = node.y;
 				else if(type == SHADER_TYPE_VOLUME) offset = node.z;
@@ -200,382 +203,248 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade
 				else return;
 				break;
 			}
-#endif
-#if defined(__NODE_CLOSURE_BSDF__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CLOSURE_BSDF:
 				svm_node_closure_bsdf(kg, sd, stack, node, path_flag, &offset);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_EMISSION__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CLOSURE_EMISSION:
 				svm_node_closure_emission(sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_BACKGROUND__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CLOSURE_BACKGROUND:
 				svm_node_closure_background(sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_HOLDOUT__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CLOSURE_HOLDOUT:
 				svm_node_closure_holdout(sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_AMBIENT_OCCLUSION__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CLOSURE_AMBIENT_OCCLUSION:
 				svm_node_closure_ambient_occlusion(sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_VOLUME__) || !defined(__SPLIT_KERNEL__)
+#if NODES_FEATURE(NODE_FEATURE_VOLUME)
 			case NODE_CLOSURE_VOLUME:
 				svm_node_closure_volume(kg, sd, stack, node, path_flag);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_SET_WEIGHT__) || !defined(__SPLIT_KERNEL__)
+#endif  /* NODES_FEATURE(NODE_FEATURE_VOLUME) */
 			case NODE_CLOSURE_SET_WEIGHT:
 				svm_node_closure_set_weight(sd, node.y, node.z, node.w);
 				break;
-#endif
-#if defined(__NODE_CLOSURE_WEIGHT__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CLOSURE_WEIGHT:
 				svm_node_closure_weight(sd, stack, node.y);
 				break;
-#endif
-#if defined(__NODE_EMISSION_WEIGHT__) || !defined(__SPLIT_KERNEL__)
 			case NODE_EMISSION_WEIGHT:
 				svm_node_emission_weight(kg, sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_MIX_CLOSURE__) || !defined(__SPLIT_KERNEL__)
 			case NODE_MIX_CLOSURE:
 				svm_node_mix_closure(sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_JUMP_IF_ZERO__) || !defined(__SPLIT_KERNEL__)
+#endif  /* NODES_GROUP(NODE_GROUP_LEVEL_0) */
 			case NODE_JUMP_IF_ZERO:
 				if(stack_load_float(stack, node.z) == 0.0f)
 					offset += node.y;
 				break;
-#endif
-#if defined(__NODE_JUMP_IF_ONE__) || !defined(__SPLIT_KERNEL__)
 			case NODE_JUMP_IF_ONE:
 				if(stack_load_float(stack, node.z) == 1.0f)
 					offset += node.y;
 				break;
-#endif
 #ifdef __TEXTURES__
-#if defined(__NODE_TEX_IMAGE__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_IMAGE:
 				svm_node_tex_image(kg, sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_TEX_IMAGE_BOX__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_IMAGE_BOX:
 				svm_node_tex_image_box(kg, sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_TEX_ENVIRONMENT__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_ENVIRONMENT:
 				svm_node_tex_environment(kg, sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_TEX_SKY__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_SKY:
 				svm_node_tex_sky(kg, sd, stack, node, &offset);
 				break;
-#endif
-#if defined(__NODE_TEX_GRADIENT__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_GRADIENT:
 				svm_node_tex_gradient(sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_TEX_NOISE__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_NOISE:
 				svm_node_tex_noise(kg, sd, stack, node, &offset);
 				break;
-#endif
-#if defined(__NODE_TEX_VORONOI__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_VORONOI:
 				svm_node_tex_voronoi(kg, sd, stack, node, &offset);
 				break;
-#endif
-#if defined(__NODE_TEX_MUSGRAVE__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_MUSGRAVE:
 				svm_node_tex_musgrave(kg, sd, stack, node, &offset);
 				break;
-#endif
-#if defined(__NODE_TEX_WAVE__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_WAVE:
 				svm_node_tex_wave(kg, sd, stack, node, &offset);
 				break;
-#endif
-#if defined(__NODE_TEX_MAGIC__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_MAGIC:
 				svm_node_tex_magic(kg, sd, stack, node, &offset);
 				break;
-#endif
-#if defined(__NODE_TEX_CHECKER__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_CHECKER:
 				svm_node_tex_checker(kg, sd, stack, node);
 				break;
-#endif
-#if defined(__NODE_TEX_BRICK__) || !defined(__SPLIT_KERNEL__)
 			case NODE_TEX_BRICK:
 				svm_node_tex_brick(kg, sd, stack, node, &offset);
 				break;
-#endif
 #endif  /* __TEXTURES__ */
-#if defined(__NODE_CAMERA__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CAMERA:
 				svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
 				break;
-#endif
-#if defined(__NODE_GEOMETRY__) || !defined(__SPLIT_KERNEL__)
 			case NODE_GEOMETRY:
 				svm_node_geometry(kg, sd, stack, node.y, node.z);
 				break;
-#endif
 #ifdef __EXTRA_NODES__
-#if defined(__NODE_GEOMETRY_BUMP_DX__) || !defined(__SPLIT_KERNEL__)
 			case NODE_GEOMETRY_BUMP_DX:
 				svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z);
 				break;
-#endif
-#if defined(__NODE_GEOMETRY_BUMP_DY__) || !defined(__SPLIT_KERNEL__)
 			case NODE_GEOMETRY_BUMP_DY:
 				svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z);
 				break;
-#endif
-#if defined(__NODE_LIGHT_PATH__) || !defined(__SPLIT_KERNEL__)
 			case NODE_LIGHT_PATH:
 				svm_node_light_path(sd, stack, node.y, node.z, path_flag);
 				break;
-#endif
-#if defined(__NODE_OBJECT_INFO__) || !defined(__SPLIT_KERNEL__)
 			case NODE_OBJECT_INFO:
 				svm_node_object_info(kg, sd, stack, node.y, node.z);
 				break;
-#endif
-#if defined(__NODE_PARTICLE_INFO__) || !defined(__SPLIT_KERNEL__)
 			case NODE_PARTICLE_INFO:
 				svm_node_particle_info(kg, sd, stack, node.y, node.z);
 				break;
-#endif
 #ifdef __HAIR__
-#if defined(__NODE_HAIR_INFO__) || !defined(__SPLIT_KERNEL__)
+#  if NODES_FEATURE(NODE_FEATURE_HAIR)
 			case NODE_HAIR_INFO:
 				svm_node_hair_info(kg, sd, stack, node.y, node.z);
 				break;
-#endif
+#  endif  /* NODES_FEATURE(NODE_FEATURE_HAIR) */
 #endif  /* __HAIR__ */
 
 #endif  /* __EXTRA_NODES__ */
-#if defined(__NODE_CONVERT__) || !defined(__SPLIT_KERNEL__)
 			case NODE_CONVERT:
 				svm_node_convert(sd, stack, node.y, node.z, node.w);
 				break;
-#endif
-#if defined(__NODE_VALUE_F__) || !defined(__SPLIT_KERNEL__)
 			case NODE_VALUE_F:
 				svm_node_value_f(kg, sd, stack, node.y, node.z)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list