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