[Bf-blender-cvs] [cd336eefbfb] split-kernel-faster-building: Cycles: Use ShaderEvalIntent more to pass flag, closures, and eval_task less

Mai Lavelle noreply at git.blender.org
Sun Nov 26 09:10:20 CET 2017


Commit: cd336eefbfb94678f89132c45e2b0c25f63eee55
Author: Mai Lavelle
Date:   Sat Nov 25 06:17:03 2017 -0500
Branches: split-kernel-faster-building
https://developer.blender.org/rBcd336eefbfb94678f89132c45e2b0c25f63eee55

Cycles: Use ShaderEvalIntent more to pass flag, closures, and eval_task less

This makes it so that path_flag and max_closures are not passed to shader eval
functions, instead a limited number of ShaderEvalIntents are used. This also
removes the need for ShaderEvalTask in the mega kernel and simplifies the
code a bit.

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

M	intern/cycles/kernel/kernel_bake.h
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_path.h
M	intern/cycles/kernel/kernel_path_branched.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_shadow.h
M	intern/cycles/kernel/kernel_subsurface.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/split/kernel_direct_lighting.h
M	intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h
M	intern/cycles/kernel/split/kernel_indirect_background.h
M	intern/cycles/kernel/split/kernel_shader_eval.h
M	intern/cycles/kernel/split/kernel_shader_setup.h
M	intern/cycles/kernel/split/kernel_shadow_blocked_dl.h
M	intern/cycles/kernel/split/kernel_split_common.h
M	intern/cycles/kernel/split/kernel_split_data_types.h

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

diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h
index 8788e89c40e..c7ae571f805 100644
--- a/intern/cycles/kernel/kernel_bake.h
+++ b/intern/cycles/kernel/kernel_bake.h
@@ -51,7 +51,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg,
 	path_state_init(kg, &emission_sd, &state, rng_hash, sample, NULL);
 
 	/* evaluate surface shader */
-	shader_eval_surface(kg, sd, &state, state.flag, kernel_data.integrator.max_closures);
+	shader_eval(kg, sd, &state, SHADER_EVAL_INTENT_SURFACE);
 
 	/* TODO, disable more closures we don't need besides transparent */
 	shader_bsdf_disable_transparency(kg, sd);
@@ -228,12 +228,12 @@ ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg,
 		}
 		else {
 			/* surface color of the pass only */
-			shader_eval_surface(kg, sd, state, 0, kernel_data.integrator.max_closures);
+			shader_eval(kg, sd, state, SHADER_EVAL_INTENT_BAKE);
 			return kernel_bake_shader_bsdf(kg, sd, type);
 		}
 	}
 	else {
-		shader_eval_surface(kg, sd, state, 0, kernel_data.integrator.max_closures);
+		shader_eval(kg, sd, state, SHADER_EVAL_INTENT_BAKE);
 		color = kernel_bake_shader_bsdf(kg, sd, type);
 	}
 
@@ -333,7 +333,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
 		{
 			float3 N = sd.N;
 			if((sd.flag & SD_HAS_BUMP)) {
-				shader_eval_surface(kg, &sd, &state, 0, kernel_data.integrator.max_closures);
+				shader_eval(kg, &sd, &state, SHADER_EVAL_INTENT_BAKE);
 				N = shader_bsdf_average_normal(kg, &sd);
 			}
 
@@ -348,7 +348,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
 		}
 		case SHADER_EVAL_EMISSION:
 		{
-			shader_eval_surface(kg, &sd, &state, 0, 0);
+			shader_eval(kg, &sd, &state, SHADER_EVAL_INTENT_EMISSION);
 			out = shader_emissive_eval(kg, &sd);
 			break;
 		}
@@ -468,8 +468,8 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
 			shader_setup_from_background(kg, &sd, &ray);
 
 			/* evaluate */
-			int flag = 0; /* we can't know which type of BSDF this is for */
-			out = shader_eval_background(kg, &sd, &state, flag);
+			shader_eval(kg, &sd, &state, SHADER_EVAL_INTENT_BACKGROUND);
+			out = shader_eval_background(kg, &sd);
 			break;
 		}
 		default:
@@ -547,8 +547,8 @@ ccl_device void kernel_background_evaluate(KernelGlobals *kg,
 	shader_setup_from_background(kg, &sd, &ray);
 
 	/* evaluate */
-	int flag = 0; /* we can't know which type of BSDF this is for */
-	float3 color = shader_eval_background(kg, &sd, &state, flag);
+	shader_eval(kg, &sd, &state, SHADER_EVAL_INTENT_BACKGROUND);
+	float3 color = shader_eval_background(kg, &sd);
 
 	/* write output */
 	output[i] += make_float4(color.x, color.y, color.z, 0.0f);
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 4b693a274b7..fa54a7d756a 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -17,15 +17,14 @@
 CCL_NAMESPACE_BEGIN
 
 /* Direction Emission */
-ccl_device void direct_emissive_eval_setup(KernelGlobals *kg,
+ccl_device ShaderEvalIntent direct_emissive_eval_setup(KernelGlobals *kg,
                                                 ShaderData *emission_sd,
                                                 LightSample *ls,
                                                 ccl_addr_space PathState *state,
                                                 float3 I,
                                                 differential3 dI,
                                                 float t,
-                                                float time,
-                                                ShaderEvalTask *eval_task)
+                                                float time)
 {
 	/* setup shading at emitter */
 	int shader_flag = kernel_tex_fetch(__shader_flag, (ls->shader & SHADER_MASK)*SHADER_SIZE);
@@ -43,14 +42,14 @@ ccl_device void direct_emissive_eval_setup(KernelGlobals *kg,
 		shader_setup_from_background(kg, emission_sd, &ray);
 
 		path_state_modify_bounce(state, true);
-		shader_eval_task_setup(kg, eval_task, emission_sd, SHADER_EVAL_INTENT_BACKGROUND, 0, 0);
+		return SHADER_EVAL_INTENT_BACKGROUND;
 	}
 	else
 #endif
 	if(shader_flag & SD_HAS_CONSTANT_EMISSION)
 	{
 		emission_sd->shader = ls->shader;
-		shader_eval_task_setup(kg, eval_task, emission_sd, SHADER_EVAL_INTENT_CONSTANT, 0, 0);
+		return SHADER_EVAL_INTENT_EMISSION;
 	}
 	else
 	{
@@ -64,7 +63,7 @@ ccl_device void direct_emissive_eval_setup(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_task_setup(kg, eval_task, emission_sd, SHADER_EVAL_INTENT_SURFACE, 0, 0);
+		return SHADER_EVAL_INTENT_EMISSION;
 	}
 }
 
@@ -73,36 +72,31 @@ ccl_device float3 direct_emissive_eval_finish(KernelGlobals *kg,
                                                 ShaderData *emission_sd,
                                                 LightSample *ls,
                                                 ccl_addr_space PathState *state,
-                                                float3 I,
-                                                ShaderEvalTask *eval_task)
+                                                float3 I)
 {
 	/* 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;
+		eval = shader_eval_background(kg, emission_sd);
 		path_state_modify_bounce(state, false);
 	}
 	else
 #endif
-	if(shader_flag & SD_HAS_CONSTANT_EMISSION)
-	{
-		eval = eval_task->eval_result;
+	if(shader_has_constant_emission(kg, emission_sd)) {
+		eval = shader_get_constant_emission(kg, emission_sd);
 		if((ls->prim != PRIM_NONE) && dot(ls->Ng, I) < 0.0f) {
 			ls->Ng = -ls->Ng;
 		}
 	}
-	else
-	{
+	else {
 		path_state_modify_bounce(state, false);
 
 		/* evaluate emissive closure */
 		eval = shader_emissive_eval(kg, emission_sd);
 	}
-	
+
 	eval *= ls->eval_fac;
 
 	return eval;
@@ -118,28 +112,25 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
                                                 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);
+	ShaderEvalIntent intent = direct_emissive_eval_setup(kg, emission_sd, ls, state, I, dI, t, time);
+	shader_eval(kg, emission_sd, state, intent);
+	return direct_emissive_eval_finish(kg, emission_sd, ls, state, I);
 }
 
-ccl_device bool direct_emission_setup(KernelGlobals *kg,
+ccl_device ShaderEvalIntent direct_emission_setup(KernelGlobals *kg,
                                          ShaderData *sd,
                                          ShaderData *emission_sd,
                                          LightSample *ls,
-                                         ccl_addr_space PathState *state,
-                                         ShaderEvalTask *eval_task)
+                                         ccl_addr_space PathState *state)
 {
 	if(ls->pdf == 0.0f)
-		return false;
+		return SHADER_EVAL_INTENT_SKIP;
 
 	/* todo: implement */
 	differential3 dD = differential3_zero();
 
 	/* evaluate closure */
-	direct_emissive_eval_setup(kg, emission_sd, ls, state, -ls->D, dD, ls->t, sd->time, eval_task);
-	return true;
+	return direct_emissive_eval_setup(kg, emission_sd, ls, state, -ls->D, dD, ls->t, sd->time);
 }
 
 ccl_device bool direct_emission_finish(KernelGlobals *kg,
@@ -150,11 +141,10 @@ ccl_device bool direct_emission_finish(KernelGlobals *kg,
                                          Ray *ray,
                                          BsdfEval *eval,
                                          bool *is_lamp,
-                                         float rand_terminate,
-                                         ShaderEvalTask *eval_task)
+                                         float rand_terminate)
 {
 	/* evaluate closure */
-	float3 light_eval = direct_emissive_eval_finish(kg, emission_sd, ls, state, -ls->D, eval_task);
+	float3 light_eval = direct_emissive_eval_finish(kg, emission_sd, ls, state, -ls->D);
 
 	if(is_zero(light_eval))
 		return false;
@@ -253,12 +243,12 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
                                          bool *is_lamp,
                                          float rand_terminate)
 {
-	MAKE_POINTER_TO_LOCAL_OBJ(ShaderEvalTask, shader_eval_task);
-	if(!direct_emission_setup(kg, sd, emission_sd, ls, state, shader_eval_task)) {
+	ShaderEvalIntent intent = direct_emission_setup(kg, sd, emission_sd, ls, state);
+	if(!intent) {
 		return false;
 	}
-	shader_eval(kg, emission_sd, state, shader_eval_task);
-	return direct_emission_finish(kg, sd, emission_sd, ls, state, ray, eval, is_lamp, rand_terminate, shader_eval_task);
+	shader_eval(kg, emission_sd, state, intent);
+	return direct_emission_finish(kg, sd, emission_sd, ls, state, ray, eval, is_lamp, rand_terminate);
 }
 
 /* Indirect Primitive Emission */
@@ -354,8 +344,7 @@ ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg,
 ccl_device_noinline bool indirect_background_setup(KernelGlobals *kg,
                                                ShaderData *emission_sd,
                                                ccl_addr_space PathState *state,
-                                               ccl_addr_space Ray *ray,
-                                               ShaderEvalTask *eval_task)
+                                               ccl_addr_space Ray *ray)
 {
 #ifdef __BACKGROUND__
 	int shader = kernel_data.background.surface_shader;
@@ -380,7 +369,6 @@ ccl_device_noinline bool indirect_background_setup(KernelGlobals *kg,
 #  endif  /* __SPLIT_KERNEL__ */
 
 	path_state_modify_bounce(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list