From fe4905288dc4b8ddf193abdf3b287c47feedb597 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 17 Dec 2014 21:49:35 +0500 Subject: [PATCH] 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. --- intern/cycles/bvh/bvh.cpp | 2 +- intern/cycles/bvh/bvh_node.cpp | 14 ++++++++++++++ intern/cycles/bvh/bvh_node.h | 3 ++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 15bd814b8d5..43b16a62207 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -794,7 +794,7 @@ void QBVH::pack_inner(const BVHStackEntry& e, const BVHStackEntry *en, int num) void QBVH::pack_nodes(const array& 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(); diff --git a/intern/cycles/bvh/bvh_node.cpp b/intern/cycles/bvh/bvh_node.cpp index 7cc9bd333b0..8294690da7d 100644 --- a/intern/cycles/bvh/bvh_node.cpp +++ b/intern/cycles/bvh/bvh_node.cpp @@ -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 */ } diff --git a/intern/cycles/bvh/bvh_node.h b/intern/cycles/bvh/bvh_node.h index a0d10a46bfc..1656bb367a4 100644 --- a/intern/cycles/bvh/bvh_node.h +++ b/intern/cycles/bvh/bvh_node.h @@ -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;