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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-12-22 22:58:19 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2014-12-25 00:50:49 +0300
commit57d235d9f496fd71f5b57cef36d34fae5bf9d9ce (patch)
tree53503cc066cdbbbfcfd77b84b53c1c3270aa40ee /intern/cycles
parenta888b8beaf7605bad36926cbe26f0828620a4004 (diff)
Cycles: Optimize storage of QBVH node by one float4
The idea is to store visibility flags for leaf nodes only since visibility check for inner nodes costs too much for QBVH hence it is not optimal to perform. Leaf QBVH nodes have plenty of space to store all sort of flags, so we can make nodes one element smaller, saving noticeable amount of memory.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/bvh/bvh.cpp6
-rw-r--r--intern/cycles/bvh/bvh.h2
2 files changed, 3 insertions, 5 deletions
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 57bc6db1d72..3f14c0d15c4 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -754,6 +754,7 @@ void QBVH::pack_leaf(const BVHStackEntry& e, const LeafNode *leaf)
data[6].x = __int_as_float(leaf->m_lo);
data[6].y = __int_as_float(leaf->m_hi);
}
+ data[6].z = __uint_as_float(leaf->m_visibility);
memcpy(&pack.nodes[e.idx * BVH_QNODE_SIZE], data, sizeof(float4)*BVH_QNODE_SIZE);
}
@@ -774,7 +775,6 @@ void QBVH::pack_inner(const BVHStackEntry& e, const BVHStackEntry *en, int num)
data[5][i] = bb_max.z;
data[6][i] = __int_as_float(en[i].encodeIdx());
- data[7][i] = 0.0f;
}
for(int i = num; i < 4; i++) {
@@ -787,7 +787,6 @@ void QBVH::pack_inner(const BVHStackEntry& e, const BVHStackEntry *en, int num)
data[5][i] = 0.0f;
data[6][i] = __int_as_float(0);
- data[7][i] = 0.0f;
}
memcpy(&pack.nodes[e.idx * BVH_QNODE_SIZE], data, sizeof(float4)*BVH_QNODE_SIZE);
@@ -959,7 +958,7 @@ void QBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
memset(leaf_data, 0, sizeof(leaf_data));
leaf_data[6].x = __int_as_float(c.x);
leaf_data[6].y = __int_as_float(c.y);
- leaf_data[7] = make_float4(__uint_as_float(visibility));
+ leaf_data[6].z = __uint_as_float(visibility);
memcpy(&pack.nodes[idx * BVH_QNODE_SIZE],
leaf_data,
sizeof(float4)*BVH_QNODE_SIZE);
@@ -994,7 +993,6 @@ void QBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
inner_data[4][i] = bb_min.z;
inner_data[5][i] = bb_max.z;
inner_data[6][i] = __int_as_float(c[i]);
- inner_data[7][i] = __uint_as_float(child_visibility[i]);
}
memcpy(&pack.nodes[idx * BVH_QNODE_SIZE],
inner_data,
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
index 58faaccee7d..ef4575ad7ee 100644
--- a/intern/cycles/bvh/bvh.h
+++ b/intern/cycles/bvh/bvh.h
@@ -36,7 +36,7 @@ class Object;
class Progress;
#define BVH_NODE_SIZE 4
-#define BVH_QNODE_SIZE 8
+#define BVH_QNODE_SIZE 7
#define BVH_ALIGN 4096
#define TRI_NODE_SIZE 3