[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