[Bf-blender-cvs] [c236d5f3c06] split-kernel-faster-building: Cycles: Split direct_emissive_eval around shader_eval
Mai Lavelle
noreply at git.blender.org
Sat Nov 11 12:48:29 CET 2017
Commit: c236d5f3c067fe1d7f3d7f8f51da2e2d9e95ef9f
Author: Mai Lavelle
Date: Sat Nov 11 05:43:12 2017 -0500
Branches: split-kernel-faster-building
https://developer.blender.org/rBc236d5f3c067fe1d7f3d7f8f51da2e2d9e95ef9f
Cycles: Split direct_emissive_eval around shader_eval
===================================================================
M intern/cycles/kernel/kernel_emission.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 94b0a37ce62..ff60c5e93ac 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -17,18 +17,17 @@
CCL_NAMESPACE_BEGIN
/* Direction Emission */
-ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
+ccl_device void direct_emissive_eval_setup(KernelGlobals *kg,
ShaderData *emission_sd,
LightSample *ls,
ccl_addr_space PathState *state,
float3 I,
differential3 dI,
float t,
- float time)
+ float time,
+ ShaderEvalTask *eval_task)
{
/* setup shading at emitter */
- float3 eval;
-
int shader_flag = kernel_tex_fetch(__shader_flag, (ls->shader & SHADER_MASK)*SHADER_SIZE);
#ifdef __BACKGROUND_MIS__
@@ -44,19 +43,14 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
shader_setup_from_background(kg, emission_sd, &ray);
path_state_modify_bounce(state, true);
- eval = shader_eval_background(kg, emission_sd, state, 0);
- path_state_modify_bounce(state, false);
+ shader_eval_task_setup(kg, eval_task, emission_sd, SHADER_EVAL_INTENT_BACKGROUND, 0, 0);
}
else
#endif
if(shader_flag & SD_HAS_CONSTANT_EMISSION)
{
- eval.x = __int_as_float(kernel_tex_fetch(__shader_flag, (ls->shader & SHADER_MASK)*SHADER_SIZE + 2));
- eval.y = __int_as_float(kernel_tex_fetch(__shader_flag, (ls->shader & SHADER_MASK)*SHADER_SIZE + 3));
- eval.z = __int_as_float(kernel_tex_fetch(__shader_flag, (ls->shader & SHADER_MASK)*SHADER_SIZE + 4));
- if((ls->prim != PRIM_NONE) && dot(ls->Ng, I) < 0.0f) {
- ls->Ng = -ls->Ng;
- }
+ emission_sd->shader = ls->shader;
+ shader_eval_task_setup(kg, eval_task, emission_sd, SHADER_EVAL_INTENT_CONSTANT, 0, 0);
}
else
{
@@ -70,7 +64,39 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
/* no path flag, we're evaluating this for all closures. that's weak but
* we'd have to do multiple evaluations otherwise */
path_state_modify_bounce(state, true);
- shader_eval_surface(kg, emission_sd, state, 0, 0);
+ shader_eval_task_setup(kg, eval_task, emission_sd, SHADER_EVAL_INTENT_SURFACE, 0, 0);
+ }
+}
+
+/* Direction Emission */
+ccl_device float3 direct_emissive_eval_finish(KernelGlobals *kg,
+ ShaderData *emission_sd,
+ LightSample *ls,
+ ccl_addr_space PathState *state,
+ float3 I,
+ ShaderEvalTask *eval_task)
+{
+ /* setup shading at emitter */
+ float3 eval;
+
+ int shader_flag = kernel_tex_fetch(__shader_flag, (ls->shader & SHADER_MASK)*SHADER_SIZE);
+
+#ifdef __BACKGROUND_MIS__
+ if(ls->type == LIGHT_BACKGROUND) {
+ eval = eval_task->eval_result;
+ path_state_modify_bounce(state, false);
+ }
+ else
+#endif
+ if(shader_flag & SD_HAS_CONSTANT_EMISSION)
+ {
+ eval = eval_task->eval_result;
+ if((ls->prim != PRIM_NONE) && dot(ls->Ng, I) < 0.0f) {
+ ls->Ng = -ls->Ng;
+ }
+ }
+ else
+ {
path_state_modify_bounce(state, false);
/* evaluate emissive closure */
@@ -82,6 +108,22 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
return eval;
}
+/* Direction Emission */
+ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
+ ShaderData *emission_sd,
+ LightSample *ls,
+ ccl_addr_space PathState *state,
+ float3 I,
+ differential3 dI,
+ float t,
+ float time)
+{
+ MAKE_POINTER_TO_LOCAL_OBJ(ShaderEvalTask, shader_eval_task);
+ direct_emissive_eval_setup(kg, emission_sd, ls, state, I, dI, t, time, shader_eval_task);
+ shader_eval(kg, emission_sd, state, shader_eval_task);
+ return direct_emissive_eval_finish(kg, emission_sd, ls, state, I, shader_eval_task);
+}
+
ccl_device_noinline bool direct_emission(KernelGlobals *kg,
ShaderData *sd,
ShaderData *emission_sd,
More information about the Bf-blender-cvs
mailing list