Revision: 29548
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29548
Author:   blendix
Date:     2010-06-18 18:07:47 +0200 (Fri, 18 Jun 2010)

Log Message:
-----------
Render Branch: another 10% performance tweak, store child pointers and
child bb just as fixed arrays of size 4 in nodes, nearly all nodes have
this many children, so overall it actually reduces memory usage a bit
and avoids a pointer indirection.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/raytrace/svbvh.h

Modified: branches/render25/source/blender/render/intern/raytrace/svbvh.h
===================================================================
--- branches/render25/source/blender/render/intern/raytrace/svbvh.h     
2010-06-18 15:23:39 UTC (rev 29547)
+++ branches/render25/source/blender/render/intern/raytrace/svbvh.h     
2010-06-18 16:07:47 UTC (rev 29548)
@@ -40,11 +40,9 @@
 
 struct SVBVHNode
 {
+       float child_bb[24];
+       SVBVHNode *child[4];
        int nchilds;
-
-       // array of bb, array of childs
-       float *child_bb;
-       SVBVHNode **child;
 };
 
 static int svbvh_bb_intersect_test_simd4(const Isect *isec, const __m128 
*bb_group)
@@ -110,7 +108,7 @@
 template<int MAX_STACK_SIZE, bool SHADOW>
 static int svbvh_node_stack_raycast(SVBVHNode *root, Isect *isec)
 {
-       const SVBVHNode *stack[MAX_STACK_SIZE], *node;
+       SVBVHNode *stack[MAX_STACK_SIZE], *node;
        int hit = 0, stack_pos = 0;
 
        stack[stack_pos++] = root;
@@ -124,8 +122,8 @@
                        int nchilds= node->nchilds;
 
                        if(nchilds == 4) {
-                               const float *child_bb= node->child_bb;
-                               int res = svbvh_bb_intersect_test_simd4(isec, 
((const __m128*) (child_bb)));
+                               float *child_bb= node->child_bb;
+                               int res = svbvh_bb_intersect_test_simd4(isec, 
((__m128*) (child_bb)));
                                SVBVHNode **child= node->child;
 
                                RE_RC_COUNT(isec->raycounter->simd_bb.test);
@@ -136,12 +134,12 @@
                                if(res & 8) { stack[stack_pos++] = child[3]; 
RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
                        }
                        else {
-                               const float *child_bb= node->child_bb;
+                               float *child_bb= node->child_bb;
                                SVBVHNode **child= node->child;
                                int i;
 
                                for(i=0; i<nchilds; i++)
-                                       if(svbvh_bb_intersect_test(isec, (const 
float*)child_bb+6*i))
+                                       if(svbvh_bb_intersect_test(isec, 
(float*)child_bb+6*i))
                                                stack[stack_pos++] = child[i];
                        }
                }
@@ -235,8 +233,6 @@
        {
                SVBVHNode *node = (SVBVHNode*)BLI_memarena_alloc(arena, 
sizeof(SVBVHNode));
                node->nchilds = nchilds;
-               node->child_bb   = (float*)BLI_memarena_alloc(arena, 
sizeof(float)*6*nchilds);
-               node->child= (SVBVHNode**)BLI_memarena_alloc(arena, 
sizeof(SVBVHNode*)*nchilds);
 
                return node;
        }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to