[Bf-blender-cvs] [37070ab35e0] split-kernel-faster-building: Cycles: Move ShaderEvalTask to kernel_types.h for use outside of split kernel

Mai Lavelle noreply at git.blender.org
Sat Nov 11 12:48:27 CET 2017


Commit: 37070ab35e0fc4e7622641ded66c0d1355fd79a9
Author: Mai Lavelle
Date:   Sat Nov 11 04:07:11 2017 -0500
Branches: split-kernel-faster-building
https://developer.blender.org/rB37070ab35e0fc4e7622641ded66c0d1355fd79a9

Cycles: Move ShaderEvalTask to kernel_types.h for use outside of split kernel

Also make usage slightly more generic.

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

M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/split/kernel_shader_eval.h
M	intern/cycles/kernel/split/kernel_shader_setup.h
M	intern/cycles/kernel/split/kernel_split_data_types.h

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

diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index 82456f7263c..6096239ac2b 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -33,6 +33,15 @@
 
 CCL_NAMESPACE_BEGIN
 
+ccl_device void shader_eval_task_setup(KernelGlobals *kg, ShaderEvalTask *task, ShaderData *sd, ShaderEvalIntent intent, int path_flag, int max_closure) {
+	task->intent = intent;
+	task->path_flag = path_flag;
+	task->max_closure = max_closure;
+#ifdef __SPLIT_KERNEL__
+	task->sd_offset = ((ccl_global char*)sd) - ((ccl_global char*)&kernel_split_state);
+#endif  /* __SPLIT_KERNEL__ */
+}
+
 /* ShaderData setup from incoming ray */
 
 #ifdef __OBJECT_MOTION__
@@ -952,28 +961,29 @@ ccl_device float3 shader_holdout_eval(KernelGlobals *kg, ShaderData *sd)
 	return weight;
 }
 
-ccl_device float3 shader_eval(KernelGlobals *kg, ShaderData *sd,
-	ccl_addr_space PathState *state, int path_flag, ShaderEvalIntent intent, int max_closure)
+ccl_device void shader_eval(KernelGlobals *kg, ShaderData *sd,
+	ccl_addr_space PathState *state, ShaderEvalTask *eval_task)
 {
 	sd->num_closure = 0;
-	sd->num_closure_left = max_closure;
+	sd->num_closure_left = eval_task->max_closure;
 
 	/* constant shader value */
-	if(intent == SHADER_EVAL_INTENT_CONSTANT) {
+	if(eval_task->intent == SHADER_EVAL_INTENT_CONSTANT) {
 		float3 eval;
 		eval.x = __int_as_float(kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*SHADER_SIZE + 2));
 		eval.y = __int_as_float(kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*SHADER_SIZE + 3));
 		eval.z = __int_as_float(kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*SHADER_SIZE + 4));
-		return eval;
+		eval_task->eval_result = eval;
+		return;
 	}
 
 #ifdef __OSL__
 	/* OSL */
 	if(kg->osl) {
-		if(intent == SHADER_EVAL_INTENT_SURFACE) {
-			OSLShader::eval_surface(kg, sd, state, path_flag);
-		else if(sd->intent == SHADER_EVAL_INTENT_BACKGROUND) {
-			OSLShader::eval_background(kg, sd, state, path_flag);
+		if(eval_task->intent == SHADER_EVAL_INTENT_SURFACE) {
+			OSLShader::eval_surface(kg, sd, state, eval_task->path_flag);
+		else if(eval_task->intent == SHADER_EVAL_INTENT_BACKGROUND) {
+			OSLShader::eval_background(kg, sd, state, eval_task->path_flag);
 		}
 	}
 	else
@@ -981,38 +991,41 @@ ccl_device float3 shader_eval(KernelGlobals *kg, ShaderData *sd,
 	{
 #ifdef __SVM__
 		/* eval nodes */
-		svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag);
+		svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, eval_task->path_flag);
 #else
 		/* defaults when svm not built in */
-		if(intent == SHADER_EVAL_INTENT_SURFACE) {
+		if(eval_task->intent == SHADER_EVAL_INTENT_SURFACE) {
 			DiffuseBsdf *bsdf = (DiffuseBsdf*)bsdf_alloc(sd,
 				                                         sizeof(DiffuseBsdf),
 				                                         make_float3(0.8f, 0.8f, 0.8f));
 			bsdf->N = sd->N;
 			sd->flag |= bsdf_diffuse_setup(bsdf);
 		}
-		else if(intent == SHADER_EVAL_INTENT_BACKGROUND) {
-			return make_float3(0.8f, 0.8f, 0.8f);
+		else if(eval_task->intent == SHADER_EVAL_INTENT_BACKGROUND) {
+			eval_task->eval_result = make_float3(0.8f, 0.8f, 0.8f);
+			return;
 		}
 #endif
 	}
 
 	/* finalization */
-	if(intent == SHADER_EVAL_INTENT_SURFACE) {
+	if(eval_task->intent == SHADER_EVAL_INTENT_SURFACE) {
 		if(sd->flag & SD_BSDF_NEEDS_LCG) {
 			sd->lcg_state = lcg_state_init_addrspace(state, 0xb4bc3953);
 		}
 	}
-	else if(intent == SHADER_EVAL_INTENT_BACKGROUND) {
+	else if(eval_task->intent == SHADER_EVAL_INTENT_BACKGROUND) {
 		if(sd->flag & SD_EMISSION) {
-			return sd->closure_emission_background;
+			eval_task->eval_result = sd->closure_emission_background;
+			return;
 		}
 		else {
-			return make_float3(0.0f, 0.0f, 0.0f);
+			eval_task->eval_result = make_float3(0.0f, 0.0f, 0.0f);
+			return;
 		}
 	}
 
-	return make_float3(0.0f, 0.0f, 0.0f);
+	eval_task->eval_result = make_float3(0.0f, 0.0f, 0.0f);
 }
 
 /* Surface Evaluation */
@@ -1020,7 +1033,9 @@ ccl_device float3 shader_eval(KernelGlobals *kg, ShaderData *sd,
 ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
 	ccl_addr_space PathState *state, int path_flag, int max_closure)
 {
-	shader_eval(kg, sd, state, path_flag, SHADER_EVAL_INTENT_SURFACE, max_closure);
+	MAKE_POINTER_TO_LOCAL_OBJ(ShaderEvalTask, shader_eval_task);
+	shader_eval_task_setup(kg, shader_eval_task, sd, SHADER_EVAL_INTENT_SURFACE, path_flag, max_closure);
+	shader_eval(kg, sd, state, shader_eval_task);
 }
 
 /* Background Evaluation */
@@ -1028,7 +1043,10 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
 ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
 	ccl_addr_space PathState *state, int path_flag)
 {
-	return shader_eval(kg, sd, state, path_flag, SHADER_EVAL_INTENT_BACKGROUND, 0);
+	MAKE_POINTER_TO_LOCAL_OBJ(ShaderEvalTask, shader_eval_task);
+	shader_eval_task_setup(kg, shader_eval_task, sd, SHADER_EVAL_INTENT_BACKGROUND, path_flag, 0);
+	shader_eval(kg, sd, state, shader_eval_task);
+	return shader_eval_task->eval_result;
 }
 
 /* Volume */
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 7be5b6ee607..6b0b86ad257 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1025,6 +1025,21 @@ typedef ccl_addr_space struct ShaderDataTinyStorage {
 } ShaderDataTinyStorage;
 #define AS_SHADER_DATA(shader_data_tiny_storage) ((ShaderData*)shader_data_tiny_storage)
 
+typedef ccl_addr_space struct ShaderEvalTask {
+#ifdef __cplusplus
+	ShaderEvalTask() {}; /* needed to work around default constructor being deleted */
+#endif
+	union {
+		struct {
+			ShaderEvalIntent intent;
+			uint path_flag;
+			uint max_closure;
+			uint sd_offset; /* offset into split_data when using split kernel */
+		};
+		float3 eval_result;
+	};
+} ShaderEvalTask;
+
 /* Path State */
 
 #ifdef __VOLUME__
@@ -1498,6 +1513,16 @@ typedef struct WorkTile {
 	ccl_global float *buffer;
 } WorkTile;
 
+/* Utility macro to get a pointer to an object that can be used locally, while avoiding
+ * address space issues of the split kernel. `name` must exist in split data entries.
+ */
+
+#ifdef __SPLIT_KERNEL__
+#  define MAKE_POINTER_TO_LOCAL_OBJ(type, name) type *name = &kernel_split_state.name[ccl_global_id(0) + ccl_global_id(1) * ccl_global_size(0)];
+#else
+#  define MAKE_POINTER_TO_LOCAL_OBJ(type, name) type _local_##name; type *name = &_local_##name;
+#endif
+
 CCL_NAMESPACE_END
 
 #endif /*  __KERNEL_TYPES_H__ */
diff --git a/intern/cycles/kernel/split/kernel_shader_eval.h b/intern/cycles/kernel/split/kernel_shader_eval.h
index 00dc3c49560..e72c483c6ca 100644
--- a/intern/cycles/kernel/split/kernel_shader_eval.h
+++ b/intern/cycles/kernel/split/kernel_shader_eval.h
@@ -44,7 +44,7 @@ ccl_device void kernel_shader_eval(KernelGlobals *kg)
 		ShaderData *sd = (ShaderData*)(((ccl_global char*)&kernel_split_state) + eval_task->sd_offset);
 		ccl_global PathState *state = &kernel_split_state.path_state[ray_index];
 
-		eval_task->eval_result = shader_eval(kg, sd, state, state->flag, eval_task->intent, eval_task->max_closure);
+		shader_eval(kg, sd, state, eval_task);
 	}
 }
 
diff --git a/intern/cycles/kernel/split/kernel_shader_setup.h b/intern/cycles/kernel/split/kernel_shader_setup.h
index a7ebdefff95..9fe20cd5d6f 100644
--- a/intern/cycles/kernel/split/kernel_shader_setup.h
+++ b/intern/cycles/kernel/split/kernel_shader_setup.h
@@ -66,10 +66,9 @@ ccl_device void kernel_shader_setup(KernelGlobals *kg,
 		                      &ray);
 
 		ShaderEvalTask *eval_task = &kernel_split_state.shader_eval_task[ray_index];
+		ccl_global PathState *state = &kernel_split_state.path_state[ray_index];
 
-		eval_task->sd_offset = ((ccl_global char*)kernel_split_sd(sd, ray_index)) - ((ccl_global char*)&kernel_split_state);
-		eval_task->intent = SHADER_EVAL_INTENT_SURFACE;
-		eval_task->max_closure = kernel_data.integrator.max_closures;
+		shader_eval_task_setup(kg, eval_task, kernel_split_sd(sd, ray_index), SHADER_EVAL_INTENT_SURFACE, state->flag, kernel_data.integrator.max_closures);
 	}
 }
 
diff --git a/intern/cycles/kernel/split/kernel_split_data_types.h b/intern/cycles/kernel/split/kernel_split_data_types.h
index 5ffeb3e6965..ae5b7d15692 100644
--- a/intern/cycles/kernel/split/kernel_split_data_types.h
+++ b/intern/cycles/kernel/split/kernel_split_data_types.h
@@ -104,17 +104,6 @@ typedef ccl_global struct SplitBranchedState {
 #  define SPLIT_DATA_VOLUME_ENTRIES
 #endif /* __VOLUME__ */
 
-typedef ccl_global struct ShaderEvalTask {
-	union {
-		struct {
-			uint sd_offset; /* offset into split_data */
-			ShaderEvalIntent intent;
-			uint max_closure;
-		};
-		float3 eval_result;
-	};
-} ShaderEvalTask;
-
 #define SPLIT_DATA_ENTRIES \
 	SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
 	SPLIT_DATA_ENTRY(PathRadiance, path_radiance, 1) \



More information about the Bf-blender-cvs mailing list