[Bf-blender-cvs] [49041e5611b] master: Fix T56612: crash in Cycles viewport render update, after recent changes.

Brecht Van Lommel noreply at git.blender.org
Thu Aug 30 12:48:35 CEST 2018


Commit: 49041e5611bd3974976c9cceec8d2f81cd5a1d9b
Author: Brecht Van Lommel
Date:   Thu Aug 30 12:21:57 2018 +0200
Branches: master
https://developer.blender.org/rB49041e5611bd3974976c9cceec8d2f81cd5a1d9b

Fix T56612: crash in Cycles viewport render update, after recent changes.

BVH8 refitting code had a bug.

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

M	intern/cycles/bvh/bvh8.cpp

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

diff --git a/intern/cycles/bvh/bvh8.cpp b/intern/cycles/bvh/bvh8.cpp
index 50a335dba00..70d003d938a 100644
--- a/intern/cycles/bvh/bvh8.cpp
+++ b/intern/cycles/bvh/bvh8.cpp
@@ -460,26 +460,22 @@ void BVH8::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
 		memcpy(&pack.leaf_nodes[idx], leaf_data, sizeof(float4)*BVH_ONODE_LEAF_SIZE);
 	}
 	else {
-		int4 *data = &pack.nodes[idx];
-		bool is_unaligned = (data[0].x & PATH_RAY_NODE_UNALIGNED) != 0;
-		int4 c;
-		if(is_unaligned) {
-			c = data[BVH_UNALIGNED_ONODE_SIZE-1];
-		}
-		else {
-			c = data[BVH_ONODE_SIZE-1];
-		}
+		float8 *data = (float8*)&pack.nodes[idx];
+		bool is_unaligned = (__float_as_uint(data[0].a) & PATH_RAY_NODE_UNALIGNED) != 0;
 		/* Refit inner node, set bbox from children. */
 		BoundBox child_bbox[8] = { BoundBox::empty, BoundBox::empty,
 		                           BoundBox::empty, BoundBox::empty,
 		                           BoundBox::empty, BoundBox::empty,
 		                           BoundBox::empty, BoundBox::empty };
+		int child[8];
 		uint child_visibility[8] = { 0 };
 		int num_nodes = 0;
 
 		for(int i = 0; i < 8; ++i) {
-			if(c[i] != 0) {
-				refit_node((c[i] < 0)? -c[i]-1: c[i], (c[i] < 0),
+			child[i] = __float_as_int(data[(is_unaligned) ? 13: 7][i]);
+
+			if(child[i] != 0) {
+				refit_node((child[i] < 0)? -child[i]-1: child[i], (child[i] < 0),
 				           child_bbox[i], child_visibility[i]);
 				++num_nodes;
 				bbox.grow(child_bbox[i]);
@@ -495,7 +491,7 @@ void BVH8::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
 			pack_unaligned_node(idx,
 			                    aligned_space,
 			                    child_bbox,
-			                    &c[0],
+			                    child,
 			                    visibility,
 			                    0.0f,
 			                    1.0f,
@@ -504,7 +500,7 @@ void BVH8::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
 		else {
 			pack_aligned_node(idx,
 			                  child_bbox,
-			                  &c[0],
+			                  child,
 			                  visibility,
 			                  0.0f,
 			                  1.0f,



More information about the Bf-blender-cvs mailing list