[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