[Bf-blender-cvs] [5738900] soc-2014-cycles: Cycles: Memory optimization for shader id.
Thomas Dinges
noreply at git.blender.org
Tue Jul 22 00:58:23 CEST 2014
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. @@
More information about the Bf-blender-cvs
mailing list