Cycles: Use proper node counter to allocate QBVH nodes
Before all the nodes were counted and allocated, leading to situations when bunch of allocated memory is not used because reasonable amount of nodes are simply ignored.
This commit is contained in:
@@ -794,7 +794,7 @@ void QBVH::pack_inner(const BVHStackEntry& e, const BVHStackEntry *en, int num)
|
||||
|
||||
void QBVH::pack_nodes(const array<int>& prims, const BVHNode *root)
|
||||
{
|
||||
size_t node_size = root->getSubtreeSize(BVH_STAT_NODE_COUNT);
|
||||
size_t node_size = root->getSubtreeSize(BVH_STAT_QNODE_COUNT);
|
||||
|
||||
/* resize arrays */
|
||||
pack.nodes.clear();
|
||||
|
@@ -47,6 +47,20 @@ int BVHNode::getSubtreeSize(BVH_STAT stat) const
|
||||
case BVH_STAT_CHILDNODE_COUNT:
|
||||
cnt = num_children();
|
||||
break;
|
||||
case BVH_STAT_QNODE_COUNT:
|
||||
cnt = 1;
|
||||
for(int i = 0; i < num_children(); i++) {
|
||||
BVHNode *node = get_child(i);
|
||||
if(node->is_leaf()) {
|
||||
cnt += 1;
|
||||
}
|
||||
else {
|
||||
for(int j = 0; j < node->num_children(); j++) {
|
||||
cnt += node->get_child(j)->getSubtreeSize(stat);
|
||||
}
|
||||
}
|
||||
}
|
||||
return cnt;
|
||||
default:
|
||||
assert(0); /* unknown mode */
|
||||
}
|
||||
|
@@ -30,7 +30,8 @@ enum BVH_STAT
|
||||
BVH_STAT_INNER_COUNT,
|
||||
BVH_STAT_LEAF_COUNT,
|
||||
BVH_STAT_TRIANGLE_COUNT,
|
||||
BVH_STAT_CHILDNODE_COUNT
|
||||
BVH_STAT_CHILDNODE_COUNT,
|
||||
BVH_STAT_QNODE_COUNT,
|
||||
};
|
||||
|
||||
class BVHParams;
|
||||
|
Reference in New Issue
Block a user