Commit: db950aabc4792c07a150b5994121bf4690a0d2cd
Author: Stefan Werner
Date:   Mon Dec 4 12:32:42 2017 +0100
Branches: cycles_refactor
https://developer.blender.org/rBdb950aabc4792c07a150b5994121bf4690a0d2cd

Cycles: Refactored kernel light distribution structure from float4 array to an 
actual struct with named and typed members.

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

M       intern/cycles/kernel/kernel_light.h
M       intern/cycles/kernel/kernel_textures.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/render/light.cpp
M       intern/cycles/render/scene.h

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

diff --git a/intern/cycles/kernel/kernel_light.h 
b/intern/cycles/kernel/kernel_light.h
index 807582d58b5..43ebccceaca 100644
--- a/intern/cycles/kernel/kernel_light.h
+++ b/intern/cycles/kernel/kernel_light.h
@@ -1063,7 +1063,7 @@ ccl_device int light_distribution_sample(KernelGlobals 
*kg, float *randu)
                int half_len = len >> 1;
                int middle = first + half_len;
 
-               if(r < kernel_tex_fetch(__light_distribution, middle).x) {
+               if(r < kernel_tex_fetch(__light_distribution, middle).totarea) {
                        len = half_len;
                }
                else {
@@ -1078,8 +1078,8 @@ ccl_device int light_distribution_sample(KernelGlobals 
*kg, float *randu)
 
        /* Rescale to reuse random number. this helps the 2D samples within
         * each area light be stratified as well. */
-       float distr_min = kernel_tex_fetch(__light_distribution, index).x;
-       float distr_max = kernel_tex_fetch(__light_distribution, index+1).x;
+       float distr_min = kernel_tex_fetch(__light_distribution, index).totarea;
+       float distr_max = kernel_tex_fetch(__light_distribution, 
index+1).totarea;
        *randu = (r - distr_min)/(distr_max - distr_min);
 
        return index;
@@ -1104,12 +1104,11 @@ ccl_device_noinline bool light_sample(KernelGlobals *kg,
        int index = light_distribution_sample(kg, &randu);
 
        /* fetch light data */
-       float4 l = kernel_tex_fetch(__light_distribution, index);
-       int prim = __float_as_int(l.y);
+       int prim = kernel_tex_fetch(__light_distribution, index).prim;
 
        if(prim >= 0) {
-               int object = __float_as_int(l.w);
-               int shader_flag = __float_as_int(l.z);
+               int object = kernel_tex_fetch(__light_distribution, 
index).mesh_light.object_id;
+               int shader_flag = kernel_tex_fetch(__light_distribution, 
index).mesh_light.shader_flag;
 
                triangle_light_sample(kg, prim, object, randu, randv, time, ls, 
P);
                ls->shader |= shader_flag;
diff --git a/intern/cycles/kernel/kernel_textures.h 
b/intern/cycles/kernel/kernel_textures.h
index 4adf09876f3..d5f8f6619ef 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -59,7 +59,7 @@ KERNEL_TEX(float4, __attributes_float3)
 KERNEL_TEX(uchar4, __attributes_uchar4)
 
 /* lights */
-KERNEL_TEX(float4, __light_distribution)
+KERNEL_TEX(KernelLightDistribution, __light_distribution)
 KERNEL_TEX(KernelLight, __light_data)
 KERNEL_TEX(float2, __light_background_marginal_cdf)
 KERNEL_TEX(float2, __light_background_conditional_cdf)
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 8857b18ae8d..e9fee35d0a9 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1573,6 +1573,22 @@ typedef struct KernelLight
 } KernelLight;
 
 
+typedef struct KernelLightDistribution
+{
+       float totarea;
+       int prim;
+       union {
+               struct {
+                       int shader_flag;
+                       int object_id;
+               } mesh_light;
+               struct {
+                       float pad;
+                       float size;
+               } lamp;
+       };
+} KernelLightDistribution;
+
 CCL_NAMESPACE_END
 
 #endif /*  __KERNEL_TYPES_H__ */
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 642c6acf51e..2239705b74e 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -288,7 +288,7 @@ void LightManager::device_update_distribution(Device *, 
DeviceScene *dscene, Sce
        VLOG(1) << "Total " << num_distribution << " of light distribution 
primitives.";
 
        /* emission area */
-       float4 *distribution = 
dscene->light_distribution.alloc(num_distribution + 1);
+       KernelLightDistribution *distribution = 
dscene->light_distribution.alloc(num_distribution + 1);
        float totarea = 0.0f;
 
        /* triangles */
@@ -334,10 +334,10 @@ void LightManager::device_update_distribution(Device *, 
DeviceScene *dscene, Sce
                                                 : scene->default_surface;
 
                        if(shader->use_mis && shader->has_surface_emission) {
-                               distribution[offset].x = totarea;
-                               distribution[offset].y = __int_as_float(i + 
mesh->tri_offset);
-                               distribution[offset].z = 
__int_as_float(shader_flag);
-                               distribution[offset].w = 
__int_as_float(object_id);
+                               distribution[offset].totarea = totarea;
+                               distribution[offset].prim = i + 
mesh->tri_offset;
+                               distribution[offset].mesh_light.shader_flag = 
shader_flag;
+                               distribution[offset].mesh_light.object_id = 
object_id;
                                offset++;
 
                                Mesh::Triangle t = mesh->get_triangle(i);
@@ -372,10 +372,10 @@ void LightManager::device_update_distribution(Device *, 
DeviceScene *dscene, Sce
                if(!light->is_enabled)
                        continue;
 
-               distribution[offset].x = totarea;
-               distribution[offset].y = __int_as_float(~light_index);
-               distribution[offset].z = 1.0f;
-               distribution[offset].w = light->size;
+               distribution[offset].totarea = totarea;
+               distribution[offset].prim = ~light_index;
+               distribution[offset].lamp.pad = 1.0f;
+               distribution[offset].lamp.size = light->size;
                totarea += lightarea;
 
                if(light->size > 0.0f && light->use_mis)
@@ -390,15 +390,15 @@ void LightManager::device_update_distribution(Device *, 
DeviceScene *dscene, Sce
        }
 
        /* normalize cumulative distribution functions */
-       distribution[num_distribution].x = totarea;
-       distribution[num_distribution].y = 0.0f;
-       distribution[num_distribution].z = 0.0f;
-       distribution[num_distribution].w = 0.0f;
+       distribution[num_distribution].totarea = totarea;
+       distribution[num_distribution].prim = 0.0f;
+       distribution[num_distribution].lamp.pad = 0.0f;
+       distribution[num_distribution].lamp.size = 0.0f;
 
        if(totarea > 0.0f) {
                for(size_t i = 0; i < num_distribution; i++)
-                       distribution[i].x /= totarea;
-               distribution[num_distribution].x = 1.0f;
+                       distribution[i].totarea /= totarea;
+               distribution[num_distribution].totarea = 1.0f;
        }
 
        if(progress.get_cancel()) return;
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 3ea8b1b7c4a..5abb7173951 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -94,7 +94,7 @@ public:
        device_vector<uchar4> attributes_uchar4;
 
        /* lights */
-       device_vector<float4> light_distribution;
+       device_vector<KernelLightDistribution> light_distribution;
        device_vector<KernelLight> light_data;
        device_vector<float2> light_background_marginal_cdf;
        device_vector<float2> light_background_conditional_cdf;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to