[Bf-blender-cvs] [aaece0279fe] soc-2022-many-lights-sampling: Fix mistake in previous commit (pass randu by value), some code tweaks

Brecht Van Lommel noreply at git.blender.org
Thu Dec 1 21:58:04 CET 2022


Commit: aaece0279feb8da06ab680ab31f0cc350dd94fc5
Author: Brecht Van Lommel
Date:   Thu Dec 1 21:43:55 2022 +0100
Branches: soc-2022-many-lights-sampling
https://developer.blender.org/rBaaece0279feb8da06ab680ab31f0cc350dd94fc5

Fix mistake in previous commit (pass randu by value), some code tweaks

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

M	intern/cycles/kernel/integrator/shade_volume.h
M	intern/cycles/kernel/light/distribution.h
M	intern/cycles/kernel/light/sample.h
M	intern/cycles/kernel/light/tree.h
M	intern/cycles/scene/light.cpp

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

diff --git a/intern/cycles/kernel/integrator/shade_volume.h b/intern/cycles/kernel/integrator/shade_volume.h
index dbc28a2de0f..f9ea6dc2cb8 100644
--- a/intern/cycles/kernel/integrator/shade_volume.h
+++ b/intern/cycles/kernel/integrator/shade_volume.h
@@ -1013,7 +1013,6 @@ ccl_device VolumeIntegrateEvent volume_integrate(KernelGlobals kg,
 
   /* Sample light ahead of volume stepping, for equiangular sampling. */
   /* TODO: distant lights are ignored now, but could instead use even distribution. */
-  LightSample ls ccl_optional_struct_init;
   const bool need_light_sample = !(INTEGRATOR_STATE(state, path, flag) & PATH_RAY_TERMINATE);
   float3 equiangular_P = zero_float3();
   const bool have_equiangular_sample = need_light_sample &&
diff --git a/intern/cycles/kernel/light/distribution.h b/intern/cycles/kernel/light/distribution.h
index adf01faa68b..8afc15757db 100644
--- a/intern/cycles/kernel/light/distribution.h
+++ b/intern/cycles/kernel/light/distribution.h
@@ -11,7 +11,7 @@ CCL_NAMESPACE_BEGIN
 /* Simple CDF based sampling over all lights in the scene, without taking into
  * account shading position or normal. */
 
-ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *randu)
+ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float &randu)
 {
   /* This is basically std::upper_bound as used by PBRT, to find a point light or
    * triangle to emit from, proportional to area. a good improvement would be to
@@ -19,7 +19,7 @@ ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *ra
    * arbitrary shaders. */
   int first = 0;
   int len = kernel_data.integrator.num_distribution + 1;
-  float r = *randu;
+  float r = randu;
 
   do {
     int half_len = len >> 1;
@@ -42,33 +42,32 @@ ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *ra
    * each area light be stratified as well. */
   float distr_min = kernel_data_fetch(light_distribution, index).totarea;
   float distr_max = kernel_data_fetch(light_distribution, index + 1).totarea;
-  *randu = (r - distr_min) / (distr_max - distr_min);
+  randu = (r - distr_min) / (distr_max - distr_min);
 
   return index;
 }
 
-template<bool in_volume_segment>
 ccl_device_noinline bool light_distribution_sample(KernelGlobals kg,
-                                                   float randu,
+                                                   ccl_private float &randu,
                                                    const float randv,
                                                    const float time,
                                                    const float3 P,
                                                    const int bounce,
                                                    const uint32_t path_flag,
-                                                   ccl_private int *emitter_object,
-                                                   ccl_private int *emitter_prim,
-                                                   ccl_private int *emitter_shader_flag,
-                                                   ccl_private float *emitter_pdf_selection)
+                                                   ccl_private int &emitter_object,
+                                                   ccl_private int &emitter_prim,
+                                                   ccl_private int &emitter_shader_flag,
+                                                   ccl_private float &emitter_pdf_selection)
 {
   /* Sample light index from distribution. */
-  const int index = light_distribution_sample(kg, &randu);
+  const int index = light_distribution_sample(kg, randu);
   ccl_global const KernelLightDistribution *kdistribution = &kernel_data_fetch(light_distribution,
                                                                                index);
 
-  *emitter_object = kdistribution->mesh_light.object_id;
-  *emitter_prim = kdistribution->prim;
-  *emitter_shader_flag = kdistribution->mesh_light.shader_flag;
-  *emitter_pdf_selection = kernel_data.integrator.distribution_pdf_lights;
+  emitter_object = kdistribution->mesh_light.object_id;
+  emitter_prim = kdistribution->prim;
+  emitter_shader_flag = kdistribution->mesh_light.shader_flag;
+  emitter_pdf_selection = kernel_data.integrator.distribution_pdf_lights;
 
   return true;
 }
diff --git a/intern/cycles/kernel/light/sample.h b/intern/cycles/kernel/light/sample.h
index f9c6b7988b2..9297746ce35 100644
--- a/intern/cycles/kernel/light/sample.h
+++ b/intern/cycles/kernel/light/sample.h
@@ -322,7 +322,7 @@ ccl_device_inline float light_sample_mis_weight_nee(KernelGlobals kg,
 
 ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
                                                         float randu,
-                                                        const float randv,
+                                                        float randv,
                                                         const float time,
                                                         const float3 P,
                                                         const float3 D,
@@ -348,25 +348,25 @@ ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
                                  SD_BSDF_HAS_TRANSMISSION,
                                  bounce,
                                  path_flag,
-                                 &emitter_object,
-                                 &emitter_prim,
-                                 &emitter_shader_flag,
-                                 &emitter_pdf_selection)) {
+                                 emitter_object,
+                                 emitter_prim,
+                                 emitter_shader_flag,
+                                 emitter_pdf_selection)) {
       return false;
     }
   }
   else {
-    if (!light_distribution_sample<true>(kg,
-                                         randu,
-                                         randv,
-                                         time,
-                                         P,
-                                         bounce,
-                                         path_flag,
-                                         &emitter_object,
-                                         &emitter_prim,
-                                         &emitter_shader_flag,
-                                         &emitter_pdf_selection)) {
+    if (!light_distribution_sample(kg,
+                                   randu,
+                                   randv,
+                                   time,
+                                   P,
+                                   bounce,
+                                   path_flag,
+                                   emitter_object,
+                                   emitter_prim,
+                                   emitter_shader_flag,
+                                   emitter_pdf_selection)) {
       return false;
     }
   }
@@ -409,8 +409,8 @@ ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
 
 ccl_device bool light_sample_from_position(KernelGlobals kg,
                                            ccl_private const RNGState *rng_state,
-                                           const float randu,
-                                           const float randv,
+                                           float randu,
+                                           float randv,
                                            const float time,
                                            const float3 P,
                                            const float3 N,
@@ -436,25 +436,25 @@ ccl_device bool light_sample_from_position(KernelGlobals kg,
                                   shader_flags,
                                   bounce,
                                   path_flag,
-                                  &emitter_object,
-                                  &emitter_prim,
-                                  &emitter_shader_flag,
-                                  &emitter_pdf_selection)) {
+                                  emitter_object,
+                                  emitter_prim,
+                                  emitter_shader_flag,
+                                  emitter_pdf_selection)) {
       return false;
     }
   }
   else {
-    if (!light_distribution_sample<false>(kg,
-                                          randu,
-                                          randv,
-                                          time,
-                                          P,
-                                          bounce,
-                                          path_flag,
-                                          &emitter_object,
-                                          &emitter_prim,
-                                          &emitter_shader_flag,
-                                          &emitter_pdf_selection)) {
+    if (!light_distribution_sample(kg,
+                                   randu,
+                                   randv,
+                                   time,
+                                   P,
+                                   bounce,
+                                   path_flag,
+                                   emitter_object,
+                                   emitter_prim,
+                                   emitter_shader_flag,
+                                   emitter_pdf_selection)) {
       return false;
     }
   }
diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h
index 8b6f20e20e7..eba03e93cb9 100644
--- a/intern/cycles/kernel/light/tree.h
+++ b/intern/cycles/kernel/light/tree.h
@@ -541,8 +541,8 @@ ccl_device bool get_left_probability(KernelGlobals kg,
 
 template<bool in_volume_segment>
 ccl_device_noinline bool light_tree_sample(KernelGlobals kg,
-                                           float randu,
-                                           float randv,
+                                           ccl_private float &randu,
+                                           ccl_private float &randv,
                                            const float time

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list