Commit: 31a73fe79d289f99e976fee6b1023af95559fbf2
Author: Mai Lavelle
Date:   Mon Nov 13 22:45:06 2017 -0500
Branches: split-kernel-faster-building
https://developer.blender.org/rB31a73fe79d289f99e976fee6b1023af95559fbf2

Cycles: Fix shadow catcher and branched path after recent split changes

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

M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/split/kernel_direct_lighting.h
M       intern/cycles/kernel/split/kernel_shadow_blocked_dl.h

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

diff --git a/intern/cycles/kernel/kernel_shader.h 
b/intern/cycles/kernel/kernel_shader.h
index 6096239ac2b..5f0945a0be5 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -964,6 +964,10 @@ ccl_device float3 shader_holdout_eval(KernelGlobals *kg, 
ShaderData *sd)
 ccl_device void shader_eval(KernelGlobals *kg, ShaderData *sd,
        ccl_addr_space PathState *state, ShaderEvalTask *eval_task)
 {
+       if(eval_task->intent == SHADER_EVAL_INTENT_SKIP) {
+               return;
+       }
+
        sd->num_closure = 0;
        sd->num_closure_left = eval_task->max_closure;
 
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 9032f847ec3..bc822523b06 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -933,6 +933,7 @@ typedef enum ShaderEvalIntent {
        SHADER_EVAL_INTENT_SURFACE,
        SHADER_EVAL_INTENT_BACKGROUND,
        SHADER_EVAL_INTENT_CONSTANT,
+       SHADER_EVAL_INTENT_SKIP, /* dont evaluate shader, used by the split 
kernel */
 } ShaderEvalIntent;
 
 typedef ccl_addr_space struct ShaderData {
diff --git a/intern/cycles/kernel/split/kernel_direct_lighting.h 
b/intern/cycles/kernel/split/kernel_direct_lighting.h
index 176c0ec16ad..4dea050c89f 100644
--- a/intern/cycles/kernel/split/kernel_direct_lighting.h
+++ b/intern/cycles/kernel/split/kernel_direct_lighting.h
@@ -59,6 +59,7 @@ ccl_device void kernel_direct_lighting(KernelGlobals *kg,
        if(IS_STATE(kernel_split_state.ray_state, ray_index, RAY_ACTIVE)) {
                ccl_global PathState *state = 
&kernel_split_state.path_state[ray_index];
                ShaderData *sd = kernel_split_sd(sd, ray_index);
+               ShaderEvalTask *eval_task = 
&kernel_split_state.shader_eval_task[ray_index];
 
                /* direct lighting */
 #ifdef __EMISSION__
@@ -68,14 +69,16 @@ ccl_device void kernel_direct_lighting(KernelGlobals *kg,
 #  ifdef __BRANCHED_PATH__
                if(flag && kernel_data.integrator.branched) {
                        flag = false;
-                       enqueue_flag = 1; // XXX
+                       eval_task->intent = SHADER_EVAL_INTENT_SKIP;
+                       enqueue_flag = 1;
                }
 #  endif  /* __BRANCHED_PATH__ */
 
 #  ifdef __SHADOW_TRICKS__
                if(flag && state->flag & PATH_RAY_SHADOW_CATCHER) {
                        flag = false;
-                       enqueue_flag = 1; // XXX
+                       eval_task->intent = SHADER_EVAL_INTENT_SKIP;
+                       enqueue_flag = 1;
                }
 #  endif  /* __SHADOW_TRICKS__ */
 
@@ -93,7 +96,6 @@ ccl_device void kernel_direct_lighting(KernelGlobals *kg,
                                        &ls))
                        {
                                ShaderData *emission_sd = 
AS_SHADER_DATA(&kernel_split_state.sd_DL_shadow[ray_index]);
-                               ShaderEvalTask *eval_task = 
&kernel_split_state.shader_eval_task[ray_index];
 
                                if(direct_emission_setup(kg, sd, emission_sd, 
&ls, state, eval_task)) {
                                        /* Write intermediate data to global 
memory to access from
diff --git a/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h 
b/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h
index cde46d2250d..8f21ef88049 100644
--- a/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h
+++ b/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h
@@ -45,20 +45,6 @@ ccl_device void kernel_shadow_blocked_dl(KernelGlobals *kg)
        ShaderData *sd = kernel_split_sd(sd, ray_index);
        float3 throughput = kernel_split_state.throughput[ray_index];
        ShaderData *emission_sd = 
AS_SHADER_DATA(&kernel_split_state.sd_DL_shadow[ray_index]);
-       LightSample ls = kernel_split_state.light_sample[ray_index];
-       ShaderEvalTask *eval_task = 
&kernel_split_state.shader_eval_task[ray_index];
-
-       float terminate = path_state_rng_light_termination(kg, state);
-
-       Ray ray;
-       ray.time = sd->time;
-
-       BsdfEval L_light;
-       bool is_lamp;
-
-       if(!direct_emission_finish(kg, sd, emission_sd, &ls, state, &ray, 
&L_light, &is_lamp, terminate, eval_task)) {
-               return;
-       }
 
 #  if defined(__BRANCHED_PATH__) || defined(__SHADOW_TRICKS__)
        bool use_branched = false;
@@ -95,21 +81,34 @@ ccl_device void kernel_shadow_blocked_dl(KernelGlobals *kg)
        else
 #  endif  /* defined(__BRANCHED_PATH__) || defined(__SHADOW_TRICKS__)*/
        {
-               /* trace shadow ray */
-               float3 shadow;
-
-               if(!shadow_blocked(kg,
-                                  sd,
-                                  emission_sd,
-                                  state,
-                                  &ray,
-                                  &shadow))
-               {
-                       /* accumulate */
-                       path_radiance_accum_light(L, state, throughput, 
&L_light, shadow, 1.0f, is_lamp);
-               }
-               else {
-                       path_radiance_accum_total_light(L, state, throughput, 
&L_light);
+               LightSample ls = kernel_split_state.light_sample[ray_index];
+               ShaderEvalTask *eval_task = 
&kernel_split_state.shader_eval_task[ray_index];
+
+               float terminate = path_state_rng_light_termination(kg, state);
+
+               Ray ray;
+               ray.time = sd->time;
+
+               BsdfEval L_light;
+               bool is_lamp;
+
+               if(direct_emission_finish(kg, sd, emission_sd, &ls, state, 
&ray, &L_light, &is_lamp, terminate, eval_task)) {
+                       /* trace shadow ray */
+                       float3 shadow;
+
+                       if(!shadow_blocked(kg,
+                                              sd,
+                                              emission_sd,
+                                              state,
+                                              &ray,
+                                              &shadow))
+                       {
+                               /* accumulate */
+                               path_radiance_accum_light(L, state, throughput, 
&L_light, shadow, 1.0f, is_lamp);
+                       }
+                       else {
+                               path_radiance_accum_total_light(L, state, 
throughput, &L_light);
+                       }
                }
        }
 }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to