[Bf-blender-cvs] [5bc5b25] temp-cycles-microdisplacement: Fixing two out-of-bounds bugs in the SubPatch code

Lukas Stockner noreply at git.blender.org
Mon Apr 11 20:57:05 CEST 2016


Commit: 5bc5b2570d9f4152e93c89c51fec70e764b6fdae
Author: Lukas Stockner
Date:   Mon Apr 11 20:02:30 2016 +0200
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB5bc5b2570d9f4152e93c89c51fec70e764b6fdae

Fixing two out-of-bounds bugs in the SubPatch code

Credit for the actual fixes goes to Mai Lavelle.

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

M	intern/cycles/kernel/geom/geom_cache.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/mesh_displace.cpp
M	intern/cycles/render/mesh_subdivision.cpp

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

diff --git a/intern/cycles/kernel/geom/geom_cache.cpp b/intern/cycles/kernel/geom/geom_cache.cpp
index 4433b12..5ac4515 100644
--- a/intern/cycles/kernel/geom/geom_cache.cpp
+++ b/intern/cycles/kernel/geom/geom_cache.cpp
@@ -131,9 +131,9 @@ void geom_cache_set_max_size(GeomCache * geom_cache, uint max_size) {
 	lru->set_max_size(max_size);
 }
 
-static void geom_cache_get_tessellated_subpatch_size(GeomCache* geom_cache, int object, int prim, uint* num_verts, uint* num_tris, int* total_size) {
+static void geom_cache_get_tessellated_subpatch_size(GeomCache* geom_cache, int object, int prim, uint* num_verts, uint* num_tris, int* cached_bvh_size) {
 	Mesh* mesh = geom_cache->scene->objects[object]->mesh;
-	mesh->diced_subpatch_size(prim, num_verts, num_tris, total_size);
+	mesh->diced_subpatch_size(prim, num_verts, num_tris, cached_bvh_size);
 }
 
 static void geom_cache_dice_subpatch(GeomCache* geom_cache, TessellatedSubPatch* subpatch, int object, int prim) {
@@ -143,7 +143,7 @@ static void geom_cache_dice_subpatch(GeomCache* geom_cache, TessellatedSubPatch*
 
 static void geom_cache_update_subpatch_size(GeomCache* geom_cache, int object, int prim, int size) {
 	Mesh* mesh = geom_cache->scene->objects[object]->mesh;
-	mesh->subpatches[prim].cached_tessellated_size = size;
+	mesh->subpatches[prim].cached_bvh_size = size;
 }
 
 static void _geom_cache_sample_subpatch_vert(TessellatedSubPatch *subpatch, int vert, float3 *P, float3 *N, float *u, float *v, int *shader)
@@ -190,13 +190,11 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
 
 		// get patch size
 		uint num_verts, num_tris, bvh_size = 0;
-		int total_size = -1;
-		geom_cache_get_tessellated_subpatch_size(geom_cache, object, prim, &num_verts, &num_tris, &total_size);
-		bvh_size = num_tris*2*4 + 4;
+		int cached_bvh_size = -1;
+		geom_cache_get_tessellated_subpatch_size(geom_cache, object, prim, &num_verts, &num_tris, &cached_bvh_size);
+		bvh_size = (cached_bvh_size >= 0)? cached_bvh_size: (num_tris*2*4 + 4);
 
 		size_t size = sizeof(SubPatchWraper) + sizeof(float4)*(num_verts*2 + num_tris + bvh_size);
-		if(total_size >= 0)
-			size = total_size;
 
 		// alloc
 		SubPatchWraper* wraper = (SubPatchWraper*)operator new (size);
@@ -215,6 +213,8 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
 		subpatch->tri_offset = num_verts*2;
 		subpatch->bvh_offset = subpatch->tri_offset + num_tris;
 
+		assert((subpatch->bvh_offset + bvh_size)*sizeof(float4) <= (size - sizeof(SubPatchWraper)));
+
 		// dice
 		geom_cache_dice_subpatch(geom_cache, subpatch, object, prim);
 
@@ -281,9 +281,8 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
 			bvh_size = subpatch_build_bvh(subpatch, bvh_size);
 
 			// update size for next time
-			if(total_size < 0) {
-				size = sizeof(TessellatedSubPatch) + sizeof(float4)*(num_verts*2 + subpatch->num_triangles + bvh_size);
-				geom_cache_update_subpatch_size(geom_cache, object, prim, size);
+			if(cached_bvh_size < 0) {
+				geom_cache_update_subpatch_size(geom_cache, object, prim, bvh_size);
 			}
 		}
 
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index d3b075b..7ada360 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1455,7 +1455,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
 				mesh->dice_subpatch(diced, i);
 
 				// displace
-				Shader *shader = scene->shaders[mesh->patches[subpatch->patch].shader];
+				Shader *shader = scene->shaders[mesh->patches[subpatch->patch & 0x7fffffff].shader];
 				if(mesh->displacement_method != Mesh::DISPLACE_BUMP && shader->has_displacement)
 					displace_subpatch(device, dscene, scene, mesh, progress, diced, i);
 
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 4181ddf..9b8baef 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -78,9 +78,9 @@ public:
 		int edge_factors[4];
 		float2 uv[4];
 		BoundBox bounds;
-		int cached_num_triangles, cached_tessellated_size;
+		int cached_num_triangles, cached_bvh_size;
 
-		SubPatch() : bounds(BoundBox::empty), cached_num_triangles(-1), cached_tessellated_size(-1) {}
+		SubPatch() : bounds(BoundBox::empty), cached_num_triangles(-1), cached_bvh_size(-1) {}
 
 		bool is_quad() const { return edge_factors[3] != -1; }
 
diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp
index 7ff36c5..b780c60 100644
--- a/intern/cycles/render/mesh_displace.cpp
+++ b/intern/cycles/render/mesh_displace.cpp
@@ -188,7 +188,7 @@ bool MeshManager::displace_subpatch(Device *device, DeviceScene *dscene, Scene *
 	if(mesh->displacement_method == Mesh::DISPLACE_BUMP)
 		return false;
 
-	Shader *shader = scene->shaders[mesh->patches[subpatch->patch].shader];
+	Shader *shader = scene->shaders[mesh->patches[subpatch->patch & 0x7fffffff].shader];
 
 	if(!shader->has_displacement)
 		return false;
diff --git a/intern/cycles/render/mesh_subdivision.cpp b/intern/cycles/render/mesh_subdivision.cpp
index 06aca14..ae0dc3e 100644
--- a/intern/cycles/render/mesh_subdivision.cpp
+++ b/intern/cycles/render/mesh_subdivision.cpp
@@ -305,8 +305,8 @@ void Mesh::diced_subpatch_size(int subpatch_id, uint* num_verts, uint* num_tris,
 		*num_tris = subpatch.cached_num_triangles;
 	}
 
-	if(total_size && subpatch.cached_tessellated_size >= 0) {
-		*total_size = subpatch.cached_tessellated_size;
+	if(total_size && subpatch.cached_bvh_size >= 0) {
+		*total_size = subpatch.cached_bvh_size;
 	}
 }




More information about the Bf-blender-cvs mailing list