[Bf-blender-cvs] [bfaba10] cycles_kernel_split: De-duplicate direct_emissive_eval function
varunsundar08
noreply at git.blender.org
Tue May 5 09:17:18 CEST 2015
Commit: bfaba10a8f8fe2215d544ef16b08180ecbc117e7
Author: varunsundar08
Date: Tue May 5 01:23:21 2015 +0530
Branches: cycles_kernel_split
https://developer.blender.org/rBbfaba10a8f8fe2215d544ef16b08180ecbc117e7
De-duplicate direct_emissive_eval function
===================================================================
M intern/cycles/kernel/kernel_emission.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index ded6429..94bbbe3 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -17,12 +17,17 @@
CCL_NAMESPACE_BEGIN
/* Direction Emission */
-
-#ifdef __SPLIT_KERNEL__
-ccl_device_noinline float3 direct_emissive_eval_SPLIT_KERNEL(ccl_addr_space KernelGlobals *kg,
- LightSample *ls, float3 I, differential3 dI, float t, float time, int bounce, int transparent_bounce, ccl_addr_space ShaderData *sd)
+/* The argument sd_input is meaningful only for split kernel. Other uses just pass NULL */
+ccl_device_noinline float3 direct_emissive_eval(ccl_addr_space KernelGlobals *kg,
+ LightSample *ls, float3 I, differential3 dI, float t, float time, int bounce, int transparent_bounce, ccl_addr_space ShaderData *sd_input)
{
/* setup shading at emitter */
+#ifdef __SPLIT_KERNEL__
+ ccl_addr_space ShaderData *sd = sd_input;
+#else
+ ShaderData sd_object;
+ ShaderData *sd = &sd_object;
+#endif
float3 eval;
#ifdef __BACKGROUND_MIS__
@@ -62,54 +67,8 @@ ccl_device_noinline float3 direct_emissive_eval_SPLIT_KERNEL(ccl_addr_space Kern
return eval;
}
-#else
-
-ccl_device_noinline float3 direct_emissive_eval(ccl_addr_space KernelGlobals *kg,
- LightSample *ls, float3 I, differential3 dI, float t, float time, int bounce, int transparent_bounce)
-{
- /* setup shading at emitter */
- ShaderData sd;
- float3 eval;
-
-#ifdef __BACKGROUND_MIS__
- if(ls->type == LIGHT_BACKGROUND) {
- Ray ray;
- ray.D = ls->D;
- ray.P = ls->P;
- ray.t = 1.0f;
-#ifdef __OBJECT_MOTION__
- ray.time = time;
-#endif
- ray.dP = differential3_zero();
- ray.dD = dI;
-
- shader_setup_from_background(kg, &sd, &ray, bounce+1, transparent_bounce);
- eval = shader_eval_background(kg, &sd, 0, SHADER_CONTEXT_EMISSION);
- }
- else
-#endif
- {
- shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, ls->u, ls->v, t, time, bounce+1, transparent_bounce);
-
- ls->Ng = sd.Ng;
-
- /* no path flag, we're evaluating this for all closures. that's weak but
- * we'd have to do multiple evaluations otherwise */
- shader_eval_surface(kg, &sd, 0.0f, 0, SHADER_CONTEXT_EMISSION);
-
- /* evaluate emissive closure */
- if(sd.flag & SD_EMISSION)
- eval = shader_emissive_eval(kg, &sd);
- else
- eval = make_float3(0.0f, 0.0f, 0.0f);
- }
-
- eval *= ls->eval_fac;
-
- return eval;
-}
-#endif
+/* The argument sd_DL is meaningful only for split kernel. Other uses can just pass NULL */
ccl_device_noinline bool direct_emission(ccl_addr_space KernelGlobals *kg, ccl_addr_space ShaderData *sd,
LightSample *ls, Ray *ray, BsdfEval *eval, bool *is_lamp,
int bounce, int transparent_bounce, ccl_addr_space ShaderData *sd_DL)
@@ -123,9 +82,9 @@ ccl_device_noinline bool direct_emission(ccl_addr_space KernelGlobals *kg, ccl_a
/* evaluate closure */
#ifdef __SPLIT_KERNEL__
- float3 light_eval = direct_emissive_eval_SPLIT_KERNEL(kg, ls, -ls->D, dD, ls->t, sd_fetch(time), bounce, transparent_bounce, sd_DL);
+ float3 light_eval = direct_emissive_eval(kg, ls, -ls->D, dD, ls->t, sd_fetch(time), bounce, transparent_bounce, sd_DL);
#else
- float3 light_eval = direct_emissive_eval(kg, ls, -ls->D, dD, ls->t, sd_fetch(time), bounce, transparent_bounce);
+ float3 light_eval = direct_emissive_eval(kg, ls, -ls->D, dD, ls->t, sd_fetch(time), bounce, transparent_bounce, NULL);
#endif
if(is_zero(light_eval))
@@ -223,6 +182,7 @@ ccl_device_noinline float3 indirect_primitive_emission(ccl_addr_space KernelGlob
}
/* Indirect Lamp Emission */
+/* The argument sd is meaningful only for split kernel. Other uses can just pass NULL */
ccl_device_noinline bool indirect_lamp_emission(ccl_addr_space KernelGlobals *kg, PathState *state, Ray *ray, float3 *emission, ccl_addr_space ShaderData *sd)
{
bool hit_lamp = false;
@@ -248,9 +208,9 @@ ccl_device_noinline bool indirect_lamp_emission(ccl_addr_space KernelGlobals *kg
#endif
#ifdef __SPLIT_KERNEL__
- float3 L = direct_emissive_eval_SPLIT_KERNEL(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce, sd);
+ float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce, sd);
#else
- float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce);
+ float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce, NULL);
#endif
#ifdef __VOLUME__
More information about the Bf-blender-cvs
mailing list