[Bf-blender-cvs] [31a73fe79d2] split-kernel-faster-building: Cycles: Fix shadow catcher and branched path after recent split changes
Mai Lavelle
noreply at git.blender.org
Tue Nov 14 04:48:58 CET 2017
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);
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list