Commit: eeb32da9c166967760ef0ce0730e4349a3570d4d
Author: Mai Lavelle
Date:   Sun Nov 26 23:46:16 2017 -0500
Branches: split-kernel-faster-building
https://developer.blender.org/rBeeb32da9c166967760ef0ce0730e4349a3570d4d

Cycles: Split indirect_lamp_emission

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

M       intern/cycles/kernel/kernel_emission.h

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

diff --git a/intern/cycles/kernel/kernel_emission.h 
b/intern/cycles/kernel/kernel_emission.h
index 295fa978e15..ba13ceb9b1c 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -277,31 +277,28 @@ ccl_device_noinline float3 
indirect_primitive_emission(KernelGlobals *kg, Shader
 
 /* Indirect Lamp Emission */
 
-ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg,
+ccl_device_noinline ShaderEvalIntent 
indirect_lamp_emission_setup(KernelGlobals *kg,
                                                 ShaderData *emission_sd,
                                                 ccl_addr_space PathState 
*state,
                                                 Ray *ray,
-                                                float3 *emission)
+                                                LightSample *ls)
 {
        bool hit_lamp = false;
 
-       *emission = make_float3(0.0f, 0.0f, 0.0f);
-
-       LightSample ls;
-       ls.t = ray->t;
+       ls->t = ray->t;
 
        for(int lamp = 0; lamp < kernel_data.integrator.num_all_lights; lamp++) 
{
-               if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ls.t, &ls))
+               if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ls->t, ls))
                        continue;
 
 #ifdef __PASSES__
                /* use visibility flag to skip lights */
-               if(ls.shader & SHADER_EXCLUDE_ANY) {
-                       if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && 
(state->flag & PATH_RAY_DIFFUSE)) ||
-                          ((ls.shader & SHADER_EXCLUDE_GLOSSY) &&
+               if(ls->shader & SHADER_EXCLUDE_ANY) {
+                       if(((ls->shader & SHADER_EXCLUDE_DIFFUSE) && 
(state->flag & PATH_RAY_DIFFUSE)) ||
+                          ((ls->shader & SHADER_EXCLUDE_GLOSSY) &&
                            ((state->flag & (PATH_RAY_GLOSSY|PATH_RAY_REFLECT)) 
== (PATH_RAY_GLOSSY|PATH_RAY_REFLECT))) ||
-                          ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && 
(state->flag & PATH_RAY_TRANSMIT)) ||
-                          ((ls.shader & SHADER_EXCLUDE_SCATTER) && 
(state->flag & PATH_RAY_VOLUME_SCATTER)))
+                          ((ls->shader & SHADER_EXCLUDE_TRANSMIT) && 
(state->flag & PATH_RAY_TRANSMIT)) ||
+                          ((ls->shader & SHADER_EXCLUDE_SCATTER) && 
(state->flag & PATH_RAY_VOLUME_SCATTER)))
                                continue;
                }
 #endif
@@ -310,37 +307,56 @@ ccl_device_noinline bool 
indirect_lamp_emission(KernelGlobals *kg,
        }
 
        if(hit_lamp) {
-               float3 L = direct_emissive_eval(kg,
-                                               emission_sd,
-                                               &ls,
-                                               state,
-                                               -ray->D,
-                                               ray->dD,
-                                               ls.t,
-                                               ray->time);
+               return direct_emissive_eval_setup(kg, emission_sd, ls, state, 
-ray->D, ray->dD, ls->t, ray->time);
+       }
+
+       return SHADER_EVAL_INTENT_SKIP;
+}
+
+
+ccl_device_noinline float3 indirect_lamp_emission_finish(KernelGlobals *kg,
+                                                ShaderData *emission_sd,
+                                                ccl_addr_space PathState 
*state,
+                                                Ray *ray,
+                                                LightSample *ls)
+{
+       float3 L = direct_emissive_eval_finish(kg, emission_sd, ls, state, 
-ray->D);
 
 #ifdef __VOLUME__
-               if(state->volume_stack[0].shader != SHADER_NONE) {
-                       /* shadow attenuation */
-                       Ray volume_ray = *ray;
-                       volume_ray.t = ls.t;
-                       float3 volume_tp = make_float3(1.0f, 1.0f, 1.0f);
-                       kernel_volume_shadow(kg, emission_sd, state, 
&volume_ray, &volume_tp);
-                       L *= volume_tp;
-               }
+       if(state->volume_stack[0].shader != SHADER_NONE) {
+               /* shadow attenuation */
+               Ray volume_ray = *ray;
+               volume_ray.t = ls->t;
+               float3 volume_tp = make_float3(1.0f, 1.0f, 1.0f);
+               kernel_volume_shadow(kg, emission_sd, state, &volume_ray, 
&volume_tp);
+               L *= volume_tp;
+       }
 #endif
 
-               if(!(state->flag & PATH_RAY_MIS_SKIP)) {
-                       /* multiple importance sampling, get regular light pdf,
-                        * and compute weight with respect to BSDF pdf */
-                       float mis_weight = power_heuristic(state->ray_pdf, 
ls.pdf);
-                       L *= mis_weight;
-               }
-
-               *emission += L;
+       if(!(state->flag & PATH_RAY_MIS_SKIP)) {
+               /* multiple importance sampling, get regular light pdf,
+                * and compute weight with respect to BSDF pdf */
+               float mis_weight = power_heuristic(state->ray_pdf, ls->pdf);
+               L *= mis_weight;
        }
 
-       return hit_lamp;
+       return L;
+}
+
+ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg,
+                                                ShaderData *emission_sd,
+                                                ccl_addr_space PathState 
*state,
+                                                Ray *ray,
+                                                float3 *emission)
+{
+       LightSample ls;
+       ShaderEvalIntent intent = indirect_lamp_emission_setup(kg, emission_sd, 
state, ray, &ls);
+       if(!intent) {
+               return false;
+       }
+       shader_eval(kg, emission_sd, state, intent);
+       *emission = indirect_lamp_emission_finish(kg, emission_sd, state, ray, 
&ls);
+       return true;
 }
 
 /* Indirect Background */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to