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. @@

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

Reply via email to