[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22299] branches/soc-2009-jaguarandi/ source/blender: *BLI_memarena support for any power of two alignment

André Pinto andresusanopinto at gmail.com
Fri Aug 7 15:49:15 CEST 2009


Revision: 22299
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22299
Author:   jaguarandi
Date:     2009-08-07 15:49:15 +0200 (Fri, 07 Aug 2009)

Log Message:
-----------
*BLI_memarena support for any power of two alignment
*some simd stuff on bvh

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/blenlib/BLI_memarena.h
    branches/soc-2009-jaguarandi/source/blender/blenlib/intern/BLI_memarena.c
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp

Modified: branches/soc-2009-jaguarandi/source/blender/blenlib/BLI_memarena.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/blenlib/BLI_memarena.h	2009-08-07 13:19:17 UTC (rev 22298)
+++ branches/soc-2009-jaguarandi/source/blender/blenlib/BLI_memarena.h	2009-08-07 13:49:15 UTC (rev 22299)
@@ -57,6 +57,8 @@
 void				BLI_memarena_use_malloc (struct MemArena *ma);
 void				BLI_memarena_use_calloc (struct MemArena *ma);
 
+void				BLI_memarena_use_align(struct MemArena *ma, int align);
+
 void*				BLI_memarena_alloc	(struct MemArena *ma, int size);
 
 #ifdef __cplusplus

Modified: branches/soc-2009-jaguarandi/source/blender/blenlib/intern/BLI_memarena.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/blenlib/intern/BLI_memarena.c	2009-08-07 13:19:17 UTC (rev 22298)
+++ branches/soc-2009-jaguarandi/source/blender/blenlib/intern/BLI_memarena.c	2009-08-07 13:49:15 UTC (rev 22299)
@@ -45,6 +45,7 @@
 	int bufsize, cursize;
 	
 	int use_calloc;	
+	int align;
 	
 	LinkNode *bufs;
 };
@@ -52,6 +53,7 @@
 MemArena *BLI_memarena_new(int bufsize) {
 	MemArena *ma= MEM_callocN(sizeof(*ma), "memarena");
 	ma->bufsize= bufsize;
+	ma->align = 8;
 	
 	return ma;
 }
@@ -64,6 +66,11 @@
 	ma->use_calloc= 0;
 }
 
+void BLI_memarena_use_align(struct MemArena *ma, int align) {
+	/* align should be a power of two */
+	ma->align = align;
+}
+
 void BLI_memarena_free(MemArena *ma) {
 	BLI_linklist_free(ma->bufs, (void(*)(void*)) MEM_freeN);
 	MEM_freeN(ma);
@@ -77,16 +84,28 @@
 
 		/* ensure proper alignment by rounding
 		 * size up to multiple of 8 */	
-	size= PADUP(size, 8);
+	size= PADUP(size, ma->align);
 	
 	if (size>ma->cursize) {
-		ma->cursize= (size>ma->bufsize)?size:ma->bufsize;
+		unsigned char *tmp;
+		
+		if(size > ma->bufsize - (ma->align - 1))
+		{
+			ma->cursize = PADUP(size+1, ma->align);
+		}
+		else ma->cursize = ma->bufsize;
+
 		if(ma->use_calloc)
 			ma->curbuf= MEM_callocN(ma->cursize, "memarena calloc");
 		else
 			ma->curbuf= MEM_mallocN(ma->cursize, "memarena malloc");
 		
 		BLI_linklist_prepend(&ma->bufs, ma->curbuf);
+
+		/* align alloc'ed memory (needed if align > 8) */
+		tmp = (unsigned char*)PADUP( (intptr_t) ma->curbuf, ma->align);
+		ma->cursize -= (tmp - ma->curbuf);
+		ma->curbuf = tmp;		
 	}
 	
 	ptr= ma->curbuf;

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h	2009-08-07 13:19:17 UTC (rev 22298)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h	2009-08-07 13:49:15 UTC (rev 22299)
@@ -196,18 +196,18 @@
 			const float *bb2 = stack[stack_pos+2]->bb;
 			const float *bb3 = stack[stack_pos+3]->bb;
 			
-			const __m128 x0y0x1y1 = _mm_shuffle_ps( _mm_loadu_ps(bb0), _mm_loadu_ps(bb1), _MM_SHUFFLE(1,0,1,0) );
-			const __m128 x2y2x3y3 = _mm_shuffle_ps( _mm_loadu_ps(bb2), _mm_loadu_ps(bb3), _MM_SHUFFLE(1,0,1,0) );
+			const __m128 x0y0x1y1 = _mm_shuffle_ps( _mm_load_ps(bb0), _mm_load_ps(bb1), _MM_SHUFFLE(1,0,1,0) );
+			const __m128 x2y2x3y3 = _mm_shuffle_ps( _mm_load_ps(bb2), _mm_load_ps(bb3), _MM_SHUFFLE(1,0,1,0) );
 			t_bb[0] = _mm_shuffle_ps( x0y0x1y1, x2y2x3y3, _MM_SHUFFLE(2,0,2,0) );
 			t_bb[1] = _mm_shuffle_ps( x0y0x1y1, x2y2x3y3, _MM_SHUFFLE(3,1,3,1) );
 
-			const __m128 z0X0z1X1 = _mm_shuffle_ps( _mm_loadu_ps(bb0+2), _mm_loadu_ps(bb1+2), _MM_SHUFFLE(1,0,1,0) );
-			const __m128 z2X2z3X3 = _mm_shuffle_ps( _mm_loadu_ps(bb2+2), _mm_loadu_ps(bb3+2), _MM_SHUFFLE(1,0,1,0) );
+			const __m128 z0X0z1X1 = _mm_shuffle_ps( _mm_load_ps(bb0), _mm_load_ps(bb1), _MM_SHUFFLE(3,1,3,1) );
+			const __m128 z2X2z3X3 = _mm_shuffle_ps( _mm_load_ps(bb2), _mm_load_ps(bb3), _MM_SHUFFLE(3,1,3,1) );
 			t_bb[2] = _mm_shuffle_ps( z0X0z1X1, z2X2z3X3, _MM_SHUFFLE(2,0,2,0) );
 			t_bb[3] = _mm_shuffle_ps( z0X0z1X1, z2X2z3X3, _MM_SHUFFLE(3,1,3,1) );
 
-			const __m128 Y0Z0Y1Z1 = _mm_shuffle_ps( _mm_loadu_ps(bb0+4), _mm_loadu_ps(bb1+4), _MM_SHUFFLE(1,0,1,0) );
-			const __m128 Y2Z2Y3Z3 = _mm_shuffle_ps( _mm_loadu_ps(bb2+4), _mm_loadu_ps(bb3+4), _MM_SHUFFLE(1,0,1,0) );
+			const __m128 Y0Z0Y1Z1 = _mm_shuffle_ps( _mm_load_ps(bb0+4), _mm_load_ps(bb1+4), _MM_SHUFFLE(1,0,1,0) );
+			const __m128 Y2Z2Y3Z3 = _mm_shuffle_ps( _mm_load_ps(bb2+4), _mm_load_ps(bb3+4), _MM_SHUFFLE(1,0,1,0) );
 			t_bb[4] = _mm_shuffle_ps( Y0Z0Y1Z1, Y2Z2Y3Z3, _MM_SHUFFLE(2,0,2,0) );
 			t_bb[5] = _mm_shuffle_ps( Y0Z0Y1Z1, Y2Z2Y3Z3, _MM_SHUFFLE(3,1,3,1) );
 /*			

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp	2009-08-07 13:19:17 UTC (rev 22298)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp	2009-08-07 13:49:15 UTC (rev 22299)
@@ -56,14 +56,14 @@
 
 struct BVHNode
 {
-	BVHNode *child;
-	BVHNode *sibling;
-
 #ifdef DYNAMIC_ALLOC_BB
 	float *bb;
 #else
 	float	bb[6];
 #endif
+
+	BVHNode *child;
+	BVHNode *sibling;
 };
 
 struct BVHTree
@@ -114,6 +114,12 @@
 static BVHNode *bvh_new_node(BVHTree *tree)
 {
 	BVHNode *node = (BVHNode*)BLI_memarena_alloc(tree->node_arena, sizeof(BVHNode));
+	
+	if( (((intptr_t)node) & (0x0f)) != 0 )
+	{
+		puts("WRONG!");
+		printf("%08x\n", (intptr_t)node);
+	}
 	node->sibling = NULL;
 	node->child   = NULL;
 
@@ -317,6 +323,7 @@
 
 	obj->node_arena = BLI_memarena_new(needed_nodes);
 	BLI_memarena_use_malloc(obj->node_arena);
+	BLI_memarena_use_align(obj->node_arena, 16);
 
 	
 	obj->root = bvh_rearrange<BVHTree,BVHNode,RTBuilder>( obj, obj->builder );





More information about the Bf-blender-cvs mailing list