Commit: 5738900060e73adf3f2cd00ba48ad815a83baa1b
Author: Thomas Dinges
Date:   Tue Jul 22 00:56:00 2014 +0200
Branches: soc-2014-cycles
https://developer.blender.org/rB5738900060e73adf3f2cd00ba48ad815a83baa1b

Cycles: Memory optimization for shader id.

Pack the shader ID into the vert index float4 (which still had one empty 
component).
This way we save 1 float per mesh triangle.

As a bonus, this gives 1 GPU image texture slot back to sm_2x users.

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

M       intern/cycles/kernel/geom/geom_bvh_shadow.h
M       intern/cycles/kernel/geom/geom_motion_triangle.h
M       intern/cycles/kernel/geom/geom_triangle.h
M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/kernel/kernel_textures.h
M       intern/cycles/render/image.h
M       intern/cycles/render/mesh.cpp
M       intern/cycles/render/mesh.h
M       intern/cycles/render/scene.h

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

diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h 
b/intern/cycles/kernel/geom/geom_bvh_shadow.h
index 1f6e494..d0cb480 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h
@@ -252,7 +252,8 @@ ccl_device bool BVH_FUNCTION_NAME
                                                        
if(kernel_tex_fetch(__prim_type, isect_array->prim) & PRIMITIVE_ALL_TRIANGLE)
 #endif
                                                        {
-                                                               shader =  
__float_as_int(kernel_tex_fetch(__tri_shader, prim));
+                                                               float4 vindex = 
kernel_tex_fetch(__tri_vindex, prim);
+                                                               shader =  
__float_as_int(vindex.w);
                                                        }
 #ifdef __HAIR__
                                                        else {
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle.h 
b/intern/cycles/kernel/geom/geom_motion_triangle.h
index 5ab0b73..8fc7383 100644
--- a/intern/cycles/kernel/geom/geom_motion_triangle.h
+++ b/intern/cycles/kernel/geom/geom_motion_triangle.h
@@ -232,9 +232,6 @@ ccl_device_inline float3 
motion_triangle_refine_subsurface(KernelGlobals *kg, Sh
 /* return 3 triangle vertex normals */
 ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg, 
ShaderData *sd, const Intersection *isect, const Ray *ray, bool subsurface)
 {
-       /* get shader */
-       sd->shader =  __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
-
        /* get motion info */
        int numsteps, numverts;
        object_motion_info(kg, sd->object, &numsteps, &numverts, NULL);
@@ -251,7 +248,11 @@ ccl_device_noinline void 
motion_triangle_shader_setup(KernelGlobals *kg, ShaderD
 
        /* fetch vertex coordinates */
        float3 verts[3], next_verts[3];
-       float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, 
sd->prim));
+       float4 vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
+       float3 tri_vindex = float4_to_float3(vindex);
+
+       /* get shader */
+       sd->shader =  __float_as_int(vindex.w);
 
        motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, 
numsteps, step, verts);
        motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, 
numsteps, step+1, next_verts);
diff --git a/intern/cycles/kernel/geom/geom_triangle.h 
b/intern/cycles/kernel/geom/geom_triangle.h
index df6ddce..696bf97 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -134,21 +134,21 @@ ccl_device_inline float3 triangle_normal(KernelGlobals 
*kg, int prim)
 ccl_device_inline void triangle_point_normal(KernelGlobals *kg, int prim, 
float u, float v, float3 *P, float3 *Ng, int *shader)
 {
        /* load triangle vertices */
-       float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, 
prim));
+       float4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
 
        float3 v0 = float4_to_float3(kernel_tex_fetch(__tri_verts, 
__float_as_int(tri_vindex.x)));
        float3 v1 = float4_to_float3(kernel_tex_fetch(__tri_verts, 
__float_as_int(tri_vindex.y)));
        float3 v2 = float4_to_float3(kernel_tex_fetch(__tri_verts, 
__float_as_int(tri_vindex.z)));
 
+       /* shader`*/
+       *shader = __float_as_int(tri_vindex.w);
+
        /* compute point */
        float t = 1.0f - u - v;
        *P = (u*v0 + v*v1 + t*v2);
 
        /* compute normal */
        *Ng = normalize(cross(v1 - v0, v2 - v0));
-
-       /* shader`*/
-       *shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
 }
 
 /* Triangle vertex locations */
diff --git a/intern/cycles/kernel/kernel_shader.h 
b/intern/cycles/kernel/kernel_shader.h
index 842b9f6..8fca361 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -87,7 +87,10 @@ ccl_device void shader_setup_from_ray(KernelGlobals *kg, 
ShaderData *sd,
        if(sd->type & PRIMITIVE_TRIANGLE) {
                /* static triangle */
                float3 Ng = triangle_normal(kg, sd->prim);
-               sd->shader =  __float_as_int(kernel_tex_fetch(__tri_shader, 
sd->prim));
+
+               /* shader */
+               float4 vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
+               sd->shader =  __float_as_int(vindex.w);
 
                /* vectors */
                sd->P = triangle_refine(kg, sd, isect, ray);
@@ -166,7 +169,8 @@ ccl_device_inline void 
shader_setup_from_subsurface(KernelGlobals *kg, ShaderDat
        /* fetch triangle data */
        if(sd->type == PRIMITIVE_TRIANGLE) {
                float3 Ng = triangle_normal(kg, sd->prim);
-               sd->shader =  __float_as_int(kernel_tex_fetch(__tri_shader, 
sd->prim));
+               float4 vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
+               sd->shader =  __float_as_int(vindex.w);
 
                /* static triangle */
                sd->P = triangle_refine_subsurface(kg, sd, isect, ray);
@@ -1026,7 +1030,8 @@ ccl_device bool shader_transparent_shadow(KernelGlobals 
*kg, Intersection *isect
 #ifdef __HAIR__
        if(kernel_tex_fetch(__prim_type, isect->prim) & PRIMITIVE_ALL_TRIANGLE) 
{
 #endif
-               shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
+               float4 vindex = kernel_tex_fetch(__tri_vindex, prim);
+               shader =  __float_as_int(vindex.w);
 #ifdef __HAIR__
        }
        else {
diff --git a/intern/cycles/kernel/kernel_textures.h 
b/intern/cycles/kernel/kernel_textures.h
index f60ed8c..81757d2 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -36,7 +36,6 @@ KERNEL_TEX(float4, texture_float4, __objects)
 KERNEL_TEX(float4, texture_float4, __objects_vector)
 
 /* triangles */
-KERNEL_TEX(float, texture_float, __tri_shader)
 KERNEL_TEX(float4, texture_float4, __tri_vnormal)
 KERNEL_TEX(float4, texture_float4, __tri_vindex)
 KERNEL_TEX(float4, texture_float4, __tri_verts)
@@ -173,9 +172,9 @@ KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, 
__tex_image_095)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_096)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_097)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_098)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_099)
 
 /* Kepler and above */
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_099)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_100)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_101)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_102)
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 535f0ff..54aed1a 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -29,7 +29,7 @@
 CCL_NAMESPACE_BEGIN
 
 /* generic */
-#define TEX_NUM_IMAGES                 94
+#define TEX_NUM_IMAGES                 95
 #define TEX_IMAGE_BYTE_START   TEX_NUM_FLOAT_IMAGES
 
 /* extended gpu */
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 2734430..150e170 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -377,32 +377,15 @@ void Mesh::add_vertex_normals()
        }
 }
 
-void Mesh::pack_normals(Scene *scene, float *tri_shader, float4 *vnormal)
+void Mesh::pack_normals(float4 *vnormal)
 {
        Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
 
        float3 *vN = attr_vN->data_float3();
-       int shader_id = 0;
-       uint last_shader = -1;
-       bool last_smooth = false;
-
-       size_t triangles_size = triangles.size();
-       uint *shader_ptr = (shader.size())? &shader[0]: NULL;
 
        bool do_transform = transform_applied;
        Transform ntfm = transform_normal;
 
-       /* save shader */
-       for(size_t i = 0; i < triangles_size; i++) {
-               if(shader_ptr[i] != last_shader || last_smooth != smooth[i]) {
-                       last_shader = shader_ptr[i];
-                       last_smooth = smooth[i];
-                       shader_id = 
scene->shader_manager->get_shader_id(last_shader, this, last_smooth);
-               }
-
-               tri_shader[i] = __int_as_float(shader_id);
-       }
-
        size_t verts_size = verts.size();
 
        for(size_t i = 0; i < verts_size; i++) {
@@ -415,7 +398,7 @@ void Mesh::pack_normals(Scene *scene, float *tri_shader, 
float4 *vnormal)
        }
 }
 
-void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t 
vert_offset)
+void Mesh::pack_verts(Scene *scene, float4 *tri_verts, float4 *tri_vindex, 
size_t vert_offset)
 {
        size_t verts_size = verts.size();
 
@@ -430,17 +413,28 @@ void Mesh::pack_verts(float4 *tri_verts, float4 
*tri_vindex, size_t vert_offset)
 
        size_t triangles_size = triangles.size();
 
+       int shader_id = 0;
+       uint last_shader = -1;
+       bool last_smooth = false;
+       uint *shader_ptr = (shader.size())? &shader[0]: NULL;
+
        if(triangles_size) {
                Triangle *triangles_ptr = &triangles[0];
 
                for(size_t i = 0; i < triangles_size; i++) {
                        Triangle t = triangles_ptr[i];
 
+                       if(shader_ptr[i] != last_shader || last_smooth != 
smooth[i]) {
+                               last_shader = shader_ptr[i];
+                               last_smooth = smooth[i];
+                               shader_id = 
scene->shader_manager->get_shader_id(last_shader, this, last_smooth);
+                       }
+
                        tri_vindex[i] = make_float4(
                                __int_as_float(t.v[0] + vert_offset),
                                __int_as_float(t.v[1] + vert_offset),
                                __int_as_float(t.v[2] + vert_offset),
-                               0);
+                               __int_as_float(shader_id));
                }
        }
 }
@@ -935,14 +929,13 @@ void MeshManager::device_update_mesh(Device *device, 
DeviceScene *dscene, Scene
                /* normals */
                progress.set_status("Updating Mesh", "Computing normals");
 
-               float *tri_shader = dscene->tri_shader.resize(tri_size);
                float4 *vnormal = dscene->tri_vnormal.resize(vert_size);
                float4 *tri_verts = dscene->tri_verts.resize(vert_size);
                float4 *tri_vindex = dscene->tri_vindex.resize(tri_size);
 
                foreach(Mesh *mesh, scene->meshes) {
-                       mesh->pack_normals(scene, 
&tri_shader[mesh->tri_offset], &vnormal[mesh->vert_offset]);
-                       mesh->pack_verts(&tri_verts[mesh->vert_offset], 
&tri_vindex[mesh->tri_offset], mesh->vert_offset);
+                       mesh->pack_normals(&vnormal[mesh->vert_offset]);
+                       mesh->pack_verts(scene, &tri_verts[mesh->vert_offset], 
&tri_vindex[mesh->tri_offset], mesh->vert_offset);
 
                        if(progress.get_cancel()) return;
                }
@@ -950,7 +943,6 @@ void MeshManager::device_update_mesh(Device *device, 
DeviceScene *dscene, Scene
                /* vertex coordinates */
                progress.set_status("Updating Mesh", "Copying Mesh to device");
 
-               device->tex_alloc("__tri_shader", dscene->tri_shader);
                device->tex_alloc("__tri_vnormal", dscene->tri_vnormal);
                device->tex_alloc("__tri_verts", dscene->tri_verts);
                device->tex_alloc("__tri_vindex", dscene->tri_vindex);
@@ -1122,7 +1114,6 @@ void MeshManager::device_free(Device *device, DeviceScene 
*dscene)
        device->tex_free(dscene->prim_visibility);
        device->tex_free(dscene->prim_index);
        device->tex_free(dscene->prim_object);
-       device->tex_free(dscene->tri_shader);
        device->tex_free(dscene->tri_vnormal);
        dev

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to