[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