From 8486ee39bd689f8659cf90cc6942560225de7527 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 14 Apr 2015 16:02:38 +1000 Subject: PBVH: use realloc/recalloc --- source/blender/blenkernel/intern/pbvh.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 5e07437d426..c9e632b7295 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -232,16 +232,11 @@ static int partition_indices_material(PBVH *bvh, int lo, int hi) void pbvh_grow_nodes(PBVH *bvh, int totnode) { - if (totnode > bvh->node_mem_count) { - PBVHNode *prev = bvh->nodes; - bvh->node_mem_count *= 1.33; + if (UNLIKELY(totnode > bvh->node_mem_count)) { + bvh->node_mem_count = bvh->node_mem_count + (bvh->node_mem_count / 3); if (bvh->node_mem_count < totnode) bvh->node_mem_count = totnode; - bvh->nodes = MEM_mallocN(sizeof(PBVHNode) * bvh->node_mem_count, - "bvh nodes"); - memcpy(bvh->nodes, prev, bvh->totnode * sizeof(PBVHNode)); - memset(bvh->nodes + bvh->totnode, 0, (bvh->node_mem_count - bvh->totnode) * sizeof(PBVHNode)); - MEM_freeN(prev); + bvh->nodes = MEM_recallocN(bvh->nodes, sizeof(PBVHNode) * bvh->node_mem_count); } bvh->totnode = totnode; @@ -699,16 +694,16 @@ static void pbvh_iter_end(PBVHIter *iter) static void pbvh_stack_push(PBVHIter *iter, PBVHNode *node, int revisiting) { - if (iter->stacksize == iter->stackspace) { - PBVHStack *newstack; - + if (UNLIKELY(iter->stacksize == iter->stackspace)) { iter->stackspace *= 2; - newstack = MEM_callocN(sizeof(PBVHStack) * iter->stackspace, "PBVHStack"); - memcpy(newstack, iter->stack, sizeof(PBVHStack) * iter->stacksize); - if (iter->stackspace > STACK_FIXED_DEPTH) - MEM_freeN(iter->stack); - iter->stack = newstack; + if (iter->stackspace != STACK_FIXED_DEPTH) { + iter->stack = MEM_reallocN(iter->stack, sizeof(PBVHStack) * iter->stackspace); + } + else { + iter->stack = MEM_mallocN(sizeof(PBVHStack) * iter->stackspace, "PBVHStack"); + memcpy(iter->stack, iter->stackfixed, sizeof(PBVHStack) * iter->stacksize); + } } iter->stack[iter->stacksize].node = node; @@ -800,7 +795,7 @@ void BKE_pbvh_search_gather(PBVH *bvh, while ((node = pbvh_iter_next(&iter))) { if (node->flag & PBVH_Leaf) { - if (tot == space) { + if (UNLIKELY(tot == space)) { /* resize array if needed */ space = (tot == 0) ? 32 : space * 2; array = MEM_recallocN_id(array, sizeof(PBVHNode *) * space, __func__); -- cgit v1.2.3