Commit: 4262f9296be23d1e7f26f7377e1b04218b08739a
Author: Sergey Sharybin
Date:   Wed Jun 15 16:44:56 2016 +0200
Branches: cycles_bvh
https://developer.blender.org/rB4262f9296be23d1e7f26f7377e1b04218b08739a

Cycles: Some fixes to avoid crashes with regular BVH

Still only will only on scenes without hair.

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

M       intern/cycles/bvh/bvh.cpp
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_bvh_volume_all.h

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

diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 9f417e4..7c144a4 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -380,12 +380,12 @@ void BVH::pack_instances(size_t nodes_size, size_t 
leaf_nodes_size)
                                /* Modify offsets into arrays */
                                int4 data = bvh_nodes[i + nsize_bbox];
 
-                               data.x += (data.x < 0)? -noffset_leaf: noffset;
-                               data.y += (data.y < 0)? -noffset_leaf: noffset;
+                               data.z += (data.z < 0)? -noffset_leaf: noffset;
+                               data.w += (data.w < 0)? -noffset_leaf: noffset;
 
                                if(use_qbvh) {
-                                       data.z += (data.z < 0)? -noffset_leaf: 
noffset;
-                                       data.w += (data.w < 0)? -noffset_leaf: 
noffset;
+                                       data.x += (data.x < 0)? -noffset_leaf: 
noffset;
+                                       data.y += (data.y < 0)? -noffset_leaf: 
noffset;
                                }
 
                                pack_nodes[pack_nodes_offset + nsize_bbox] = 
data;
@@ -468,7 +468,7 @@ void RegularBVH::pack_aligned_node(int idx,
 {
        int4 data[BVH_NODE_SIZE] =
        {
-               make_int4(c0, c1, visibility0, visibility1),
+               make_int4(visibility0, visibility1, c0, c1),
                make_int4(__float_as_int(b0.min.x), __float_as_int(b1.min.x), 
__float_as_int(b0.max.x), __float_as_int(b1.max.x)),
                make_int4(__float_as_int(b0.min.y), __float_as_int(b1.min.y), 
__float_as_int(b0.max.y), __float_as_int(b1.max.y)),
                make_int4(__float_as_int(b0.min.z), __float_as_int(b1.min.z), 
__float_as_int(b0.max.z), __float_as_int(b1.max.z)),
@@ -503,10 +503,10 @@ void RegularBVH::pack_unaligned_node(int idx,
                                                                aligned_space0);
        Transform space1 = BVHUnaligned::compute_node_transform(bounds1,
                                                                aligned_space1);
-       data[0] = make_float4(__int_as_float(c0),
-                             __int_as_float(c1),
-                             __int_as_float(visibility0 | 
PATH_RAY_NODE_UNALIGNED),
-                             __int_as_float(visibility1 | 
PATH_RAY_NODE_UNALIGNED));
+       data[0] = make_float4(__int_as_float(visibility0 | 
PATH_RAY_NODE_UNALIGNED),
+                             __int_as_float(visibility1 | 
PATH_RAY_NODE_UNALIGNED),
+                             __int_as_float(c0),
+                             __int_as_float(c1));
 
        data[1] = space0.x;
        data[2] = space0.y;
@@ -677,8 +677,8 @@ void RegularBVH::refit_node(int idx, bool leaf, BoundBox& 
bbox, uint& visibility
        }
        else {
                int4 *data = &pack.nodes[idx];
-               int c0 = data[0].x;
-               int c1 = data[0].y;
+               int c0 = data[0].z;
+               int c1 = data[0].w;
                /* refit inner node, set bbox from children */
                BoundBox bbox0 = BoundBox::empty, bbox1 = BoundBox::empty;
                uint visibility0 = 0, visibility1 = 0;
diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h 
b/intern/cycles/kernel/geom/geom_bvh_shadow.h
index 20e1e64..0a46211 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h
@@ -129,8 +129,8 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                /* decide which nodes to traverse next */
 #  ifdef __VISIBILITY_FLAG__
                                /* this visibility test gives a 5% performance 
hit, how to solve? */
-                               traverseChild0 = (c0max >= c0min) && 
(__float_as_uint(cnodes.z) & PATH_RAY_SHADOW);
-                               traverseChild1 = (c1max >= c1min) && 
(__float_as_uint(cnodes.w) & PATH_RAY_SHADOW);
+                               traverseChild0 = (c0max >= c0min) && 
(__float_as_uint(cnodes.x) & PATH_RAY_SHADOW);
+                               traverseChild1 = (c1max >= c1min) && 
(__float_as_uint(cnodes.y) & PATH_RAY_SHADOW);
 #  else
                                traverseChild0 = (c0max >= c0min);
                                traverseChild1 = (c1max >= c1min);
@@ -156,16 +156,16 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                /* decide which nodes to traverse next */
 #  ifdef __VISIBILITY_FLAG__
                                /* this visibility test gives a 5% performance 
hit, how to solve? */
-                               traverseChild0 = (movemask(lrhit) & 1) && 
(__float_as_uint(cnodes.z) & PATH_RAY_SHADOW);
-                               traverseChild1 = (movemask(lrhit) & 2) && 
(__float_as_uint(cnodes.w) & PATH_RAY_SHADOW);
+                               traverseChild0 = (movemask(lrhit) & 1) && 
(__float_as_uint(cnodes.x) & PATH_RAY_SHADOW);
+                               traverseChild1 = (movemask(lrhit) & 2) && 
(__float_as_uint(cnodes.y) & PATH_RAY_SHADOW);
 #  else
                                traverseChild0 = (movemask(lrhit) & 1);
                                traverseChild1 = (movemask(lrhit) & 2);
 #  endif
 #endif // __KERNEL_SSE2__
 
-                               nodeAddr = __float_as_int(cnodes.x);
-                               nodeAddrChild1 = __float_as_int(cnodes.y);
+                               nodeAddr = __float_as_int(cnodes.z);
+                               nodeAddrChild1 = __float_as_int(cnodes.w);
 
                                if(traverseChild0 && traverseChild1) {
                                        /* both children were intersected, push 
the farther one */
diff --git a/intern/cycles/kernel/geom/geom_bvh_subsurface.h 
b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
index dc0fee9..3afb034 100644
--- a/intern/cycles/kernel/geom/geom_bvh_subsurface.h
+++ b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
@@ -163,8 +163,8 @@ ccl_device void BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                traverseChild1 = (movemask(lrhit) & 2);
 #endif // __KERNEL_SSE2__
 
-                               nodeAddr = __float_as_int(cnodes.x);
-                               nodeAddrChild1 = __float_as_int(cnodes.y);
+                               nodeAddr = __float_as_int(cnodes.z);
+                               nodeAddrChild1 = __float_as_int(cnodes.w);
 
                                if(traverseChild0 && traverseChild1) {
                                        /* both children were intersected, push 
the farther one */
diff --git a/intern/cycles/kernel/geom/geom_bvh_traversal.h 
b/intern/cycles/kernel/geom/geom_bvh_traversal.h
index 9096407..65c4255 100644
--- a/intern/cycles/kernel/geom/geom_bvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_bvh_traversal.h
@@ -137,11 +137,11 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                if(difl != 0.0f) {
                                        float hdiff = 1.0f + difl;
                                        float ldiff = 1.0f - difl;
-                                       if(__float_as_int(cnodes.z) & 
PATH_RAY_CURVE) {
+                                       if(__float_as_int(cnodes.x) & 
PATH_RAY_CURVE) {
                                                c0min = max(ldiff * c0min, 
c0min - extmax);
                                                c0max = min(hdiff * c0max, 
c0max + extmax);
                                        }
-                                       if(__float_as_int(cnodes.w) & 
PATH_RAY_CURVE) {
+                                       if(__float_as_int(cnodes.y) & 
PATH_RAY_CURVE) {
                                                c1min = max(ldiff * c1min, 
c1min - extmax);
                                                c1max = min(hdiff * c1max, 
c1max + extmax);
                                        }
@@ -151,8 +151,8 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                /* decide which nodes to traverse next */
 #  ifdef __VISIBILITY_FLAG__
                                /* this visibility test gives a 5% performance 
hit, how to solve? */
-                               traverseChild0 = (c0max >= c0min) && 
(__float_as_uint(cnodes.z) & visibility);
-                               traverseChild1 = (c1max >= c1min) && 
(__float_as_uint(cnodes.w) & visibility);
+                               traverseChild0 = (c0max >= c0min) && 
(__float_as_uint(cnodes.x) & visibility);
+                               traverseChild1 = (c1max >= c1min) && 
(__float_as_uint(cnodes.y) & visibility);
 #  else
                                traverseChild0 = (c0max >= c0min);
                                traverseChild1 = (c1max >= c1min);
@@ -182,11 +182,11 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
 
                                        float hdiff = 1.0f + difl;
                                        float ldiff = 1.0f - difl;
-                                       if(__float_as_int(cnodes.z) & 
PATH_RAY_CURVE) {
+                                       if(__float_as_int(cnodes.x) & 
PATH_RAY_CURVE) {
                                                c0min = max(ldiff * c0min, 
c0min - extmax);
                                                c0max = min(hdiff * c0max, 
c0max + extmax);
                                        }
-                                       if(__float_as_int(cnodes.w) & 
PATH_RAY_CURVE) {
+                                       if(__float_as_int(cnodes.y) & 
PATH_RAY_CURVE) {
                                                c1min = max(ldiff * c1min, 
c1min - extmax);
                                                c1max = min(hdiff * c1max, 
c1max + extmax);
                                        }
@@ -198,16 +198,16 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                /* decide which nodes to traverse next */
 #  ifdef __VISIBILITY_FLAG__
                                /* this visibility test gives a 5% performance 
hit, how to solve? */
-                               traverseChild0 = (movemask(lrhit) & 1) && 
(__float_as_uint(cnodes.z) & visibility);
-                               traverseChild1 = (movemask(lrhit) & 2) && 
(__float_as_uint(cnodes.w) & visibility);
+                               traverseChild0 = (movemask(lrhit) & 1) && 
(__float_as_uint(cnodes.x) & visibility);
+                               traverseChild1 = (movemask(lrhit) & 2) && 
(__float_as_uint(cnodes.y) & visibility);
 #  else
                                traverseChild0 = (movemask(lrhit) & 1);
                                traverseChild1 = (movemask(lrhit) & 2);
 #  endif
 #endif // __KERNEL_SSE2__
 
-                               nodeAddr = __float_as_int(cnodes.x);
-                               nodeAddrChild1 = __float_as_int(cnodes.y);
+                               nodeAddr = __float_as_int(cnodes.z);
+                               nodeAddrChild1 = __float_as_int(cnodes.w);
 
                                if(traverseChild0 && traverseChild1) {
                                        /* both children were intersected, push 
the farther one */
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume.h 
b/intern/cycles/kernel/geom/geom_bvh_volume.h
index 10da6ad..c0a64db 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume.h
@@ -150,8 +150,8 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                traverseChild1 = (movemask(lrhit) & 2);
 #endif // __KERNEL_SSE2__
 
-                               nodeAddr = __float_as_int(cnodes.x);
-                               nodeAddrChild1 = __float_as_int(cnodes.y);
+                               nodeAddr = __float_as_int(cnodes.z);
+                               nodeAddrChild1 = __float_as_int(cnodes.w);
 
                                if(traverseChild0 && traverseChild1) {
                                        /* both children were intersected, push 
the farther one */
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume_all.h 
b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
index e8a577e..e091bc1 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume_all.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
@@ -154,8 +154,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                traverseChild1 = (movemask(lrhit) & 2);
 #endif // __KERNEL_SSE2__
 
-                               nodeAddr = __float_as_int(cnodes.x);
-                               nodeAddrChild1 = __float_as_int(cnodes.y);
+                               nodeAddr = __float_as_int(cnodes.z);
+                               nodeAddrChild1 = __float_as_int(cnodes.w);
 
                                if(traverseChild0 && traverseChild1) {
                                        /* both children were intersected, push 
the farther one */

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

Reply via email to