Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-08-30 13:21:57 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-08-30 13:46:46 +0300
commit49041e5611bd3974976c9cceec8d2f81cd5a1d9b (patch)
tree62e93979041af60031dbbcd3a42b6d5cf0ee61a5 /intern
parent22dc248f14be476cae67deb9731934dabb9c546f (diff)
Fix T56612: crash in Cycles viewport render update, after recent changes.
BVH8 refitting code had a bug.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/bvh/bvh8.cpp22
1 files changed, 9 insertions, 13 deletions
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,