[Bf-blender-cvs] [34127e0] temp-cycles-microdisplacement: Add bvh for subpatches

Mai Lavelle noreply at git.blender.org
Mon Apr 11 14:54:31 CEST 2016


Commit: 34127e0564ccb9820d8ed65bf1b9f2184c66cf1c
Author: Mai Lavelle
Date:   Thu Mar 3 22:32:08 2016 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB34127e0564ccb9820d8ed65bf1b9f2184c66cf1c

Add bvh for subpatches

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

M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/geom/geom_bvh_shadow.h
M	intern/cycles/kernel/geom/geom_bvh_subsurface.h
M	intern/cycles/kernel/geom/geom_bvh_traversal.h
M	intern/cycles/kernel/geom/geom_bvh_volume.h
M	intern/cycles/kernel/geom/geom_cache.cpp
M	intern/cycles/kernel/geom/geom_qbvh_shadow.h
M	intern/cycles/kernel/geom/geom_qbvh_subsurface.h
M	intern/cycles/kernel/geom/geom_qbvh_traversal.h
M	intern/cycles/kernel/geom/geom_qbvh_volume.h
M	intern/cycles/kernel/geom/geom_subpatch.h
A	intern/cycles/kernel/geom/geom_subpatch_bvh.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/mesh.h
M	intern/cycles/render/mesh_subdivision.cpp
M	intern/cycles/subd/subd_dice.cpp
M	intern/cycles/subd/subd_dice.h
M	intern/cycles/subd/subd_split.cpp
M	intern/cycles/util/CMakeLists.txt
A	intern/cycles/util/util_bvh.cpp
A	intern/cycles/util/util_bvh.h

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

diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index 952befe..475e065 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -156,6 +156,8 @@ set(SRC_GEOM_HEADERS
 	geom/geom_qbvh_traversal.h
 	geom/geom_qbvh_volume.h
 	geom/geom_qbvh_volume_all.h
+	geom/geom_subpatch.h
+	geom/geom_subpatch_bvh.h
 	geom/geom_triangle.h
 	geom/geom_triangle_intersect.h
 	geom/geom_volume.h
@@ -163,6 +165,7 @@ set(SRC_GEOM_HEADERS
 
 set(SRC_UTIL_HEADERS
 	../util/util_atomic.h
+	../util/util_bvh.h
 	../util/util_color.h
 	../util/util_half.h
 	../util/util_math.h
diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h b/intern/cycles/kernel/geom/geom_bvh_shadow.h
index f9c15c6..c2623a8 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h
@@ -246,7 +246,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
 							}
 #endif
 							case PRIMITIVE_SUBPATCH: {
-								hit = subpatch_intersect_shadow(kg, &isect_precalc, &isect_array, max_hits, num_hits, isect_t, P, object, primAddr);
+								hit = subpatch_intersect_shadow(kg, &isect_precalc, &isect_array, max_hits, num_hits, isect_t, P, dir, object, primAddr);
 								/* shadow ray early termination */
 								if(hit) {
 									return true;
diff --git a/intern/cycles/kernel/geom/geom_bvh_subsurface.h b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
index bfaa327..cac45c5 100644
--- a/intern/cycles/kernel/geom/geom_bvh_subsurface.h
+++ b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
@@ -254,6 +254,7 @@ ccl_device void BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
 							                              &isect_precalc,
 							                              ss_isect,
 							                              P,
+							                              dir,
 							                              object,
 							                              primAddr,
 							                              isect_t,
diff --git a/intern/cycles/kernel/geom/geom_bvh_traversal.h b/intern/cycles/kernel/geom/geom_bvh_traversal.h
index 45b1a88..fee17e1 100644
--- a/intern/cycles/kernel/geom/geom_bvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_bvh_traversal.h
@@ -340,7 +340,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
 								isect->num_traversal_steps++;
 #endif
 								kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
-								if(subpatch_intersect(kg, &isect_precalc, isect, P, visibility, object, primAddr)) {
+								if(subpatch_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr)) {
 									/* shadow ray early termination */
 #if defined(__KERNEL_SSE2__)
 									if(visibility == PATH_RAY_SHADOW_OPAQUE)
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume.h b/intern/cycles/kernel/geom/geom_bvh_volume.h
index 68971d9..0353819 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume.h
@@ -262,7 +262,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
 								if((object_flag & SD_OBJECT_HAS_VOLUME) == 0) {
 									continue;
 								}
-								subpatch_intersect(kg, &isect_precalc, isect, P, visibility, object, primAddr);
+								subpatch_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr);
 							}
 							break;
 						}
diff --git a/intern/cycles/kernel/geom/geom_cache.cpp b/intern/cycles/kernel/geom/geom_cache.cpp
index 2404b24..c6d9ce2 100644
--- a/intern/cycles/kernel/geom/geom_cache.cpp
+++ b/intern/cycles/kernel/geom/geom_cache.cpp
@@ -125,9 +125,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) {
+static void geom_cache_get_tessellated_subpatch_size(GeomCache* geom_cache, int object, int prim, uint* num_verts, uint* num_tris, int* total_size) {
 	Mesh* mesh = geom_cache->scene->objects[object]->mesh;
-	mesh->diced_subpatch_size(prim, num_verts, num_tris);
+	mesh->diced_subpatch_size(prim, num_verts, num_tris, total_size);
 }
 
 static void geom_cache_dice_subpatch(GeomCache* geom_cache, TessellatedSubPatch* subpatch, int object, int prim) {
@@ -135,6 +135,11 @@ static void geom_cache_dice_subpatch(GeomCache* geom_cache, TessellatedSubPatch*
 	mesh->dice_subpatch(subpatch, prim);
 }
 
+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;
+}
+
 TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int prim)
 {
 	GeomCache* geom_cache = kg->geom_cache;
@@ -148,9 +153,13 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
 	if(!lru->find_or_lock(key, ref, tdata->lru_tdata)) {
 		// get patch size
 		uint num_verts, num_tris, bvh_size = 0;
-		geom_cache_get_tessellated_subpatch_size(geom_cache, object, prim, &num_verts, &num_tris);
+		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;
 
 		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);
@@ -167,7 +176,7 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
 
 		subpatch->vert_offset = 0;
 		subpatch->tri_offset = num_verts*2;
-		subpatch->bvh_offset = -1;
+		subpatch->bvh_offset = subpatch->tri_offset + num_tris;
 
 		// dice
 		geom_cache_dice_subpatch(geom_cache, subpatch, object, prim);
@@ -175,13 +184,22 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
 		// displace
 		// TODO(mai): implement
 
+		// build bvh
+		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);
+		}
+
 		// signal subpatch completion
 		ref.mark_ready();
 	}
 	else {
 		ref.wait_till_ready();
 	}
-
+	
 	/* extra ref so subpatch doesnt deallocate when falling out of scope here, caller needs a ref without ref_t */
 	ref.inc();
 	return &ref->subpatch;
diff --git a/intern/cycles/kernel/geom/geom_qbvh_shadow.h b/intern/cycles/kernel/geom/geom_qbvh_shadow.h
index ad76c89..1ddfa8b 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_shadow.h
@@ -261,7 +261,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 							}
 #endif
 							case PRIMITIVE_SUBPATCH: {
-								hit = subpatch_intersect_shadow(kg, &isect_precalc, &isect_array, max_hits, num_hits, isect_t, P, object, primAddr);
+								hit = subpatch_intersect_shadow(kg, &isect_precalc, &isect_array, max_hits, num_hits, isect_t, P, dir, object, primAddr);
 								/* shadow ray early termination */
 								if(hit) {
 									return true;
diff --git a/intern/cycles/kernel/geom/geom_qbvh_subsurface.h b/intern/cycles/kernel/geom/geom_qbvh_subsurface.h
index f2443fb..40d2536 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_subsurface.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_subsurface.h
@@ -271,6 +271,7 @@ ccl_device void BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 							                              &isect_precalc,
 							                              ss_isect,
 							                              P,
+							                              dir,
 							                              object,
 							                              primAddr,
 							                              isect_t,
diff --git a/intern/cycles/kernel/geom/geom_qbvh_traversal.h b/intern/cycles/kernel/geom/geom_qbvh_traversal.h
index 4252345..441ad4b 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_traversal.h
@@ -354,7 +354,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 								isect->num_traversal_steps++;
 #endif
 								kernel_assert(kernel_tex_fetch(__prim_type, primAddr) == type);
-								if(subpatch_intersect(kg, &isect_precalc, isect, P, visibility, object, primAddr)) {
+								if(subpatch_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr)) {
 									tfar = ssef(isect->t);
 									/* shadow ray early termination */
 									if(visibility == PATH_RAY_SHADOW_OPAQUE)
diff --git a/intern/cycles/kernel/geom/geom_qbvh_volume.h b/intern/cycles/kernel/geom/geom_qbvh_volume.h
index b4d6dee..6931ea8 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_volume.h
@@ -279,7 +279,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 									continue;
 								}
 								/* Intersect ray against primitive. */
-								subpatch_intersect(kg, &isect_precalc, isect, P, visibility, object, primAddr);
+								subpatch_intersect(kg, &isect_precalc, isect, P, dir, visibility, object, primAddr);
 							}
 							break;
 						}
diff --git a/intern/cycles/kernel/geom/geom_subpatch.h b/intern/cycles/kernel/geom/geom_subpatch.h
index 051b416..5d42804 100644
--- a/intern/cycles/kernel/geom/geom_subpatch.h
+++ b/intern/cycles/kernel/geom/geom_subpatch.h
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+#include "geom_subpatch_bvh.h"
+
 CCL_NAMESPACE_BEGIN
 
 ccl_device_inline bool subpatch_is_quad(TessellatedSubPatch* patch) {
@@ -245,6 +247,7 @@ ccl_device_inline bool subpatch_intersect(KernelGlobals *kg,
                                           const IsectPrecalc *isect_precalc,
                                           Intersection *isect,
                                           float3 P,
+                                          float3 dir,
                                           uint visibility,
                                           int object,
                                     

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list