[Bf-blender-cvs] [eeb32da9c16] split-kernel-faster-building: Cycles: Split indirect_lamp_emission
Mai Lavelle
noreply at git.blender.org
Mon Nov 27 08:52:16 CET 2017
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 */
More information about the Bf-blender-cvs
mailing list