[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