[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22433] branches/soc-2009-jaguarandi/ source/blender/render/intern/raytrace: Another tree pass during build to increase the number of nodes that have multipe of 4childs

Andre Susano Pinto andresusanopinto at gmail.com
Thu Aug 13 17:56:24 CEST 2009


Revision: 22433
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22433
Author:   jaguarandi
Date:     2009-08-13 17:56:24 +0200 (Thu, 13 Aug 2009)

Log Message:
-----------
Another tree pass during build to increase the number of nodes that have multipe of 4childs

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/reorganize.h

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-13 15:13:44 UTC (rev 22432)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp	2009-08-13 15:56:24 UTC (rev 22433)
@@ -270,6 +270,7 @@
 	
 	pushup(root);
 	pushdown(root);
+	pushup_simd<VBVHNode,4>(root);
 
 	//Memory re-organize
 	if(0)

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/reorganize.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/reorganize.h	2009-08-13 15:13:44 UTC (rev 22432)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/reorganize.h	2009-08-13 15:56:24 UTC (rev 22433)
@@ -144,6 +144,8 @@
 template<class Node>
 void pushup(Node *parent)
 {
+	if(is_leaf(parent)) return;
+	
 	float p_area = bb_area(parent->bb, parent->bb+3);
 	Node **prev = &parent->child;
 	for(Node *child = parent->child; RayObject_isAligned(child) && child; )
@@ -175,6 +177,38 @@
 		pushup(child);
 }
 
+/*
+ * try to optimize number of childs to be a multiple of SSize
+ */
+template<class Node, int SSize>
+void pushup_simd(Node *parent)
+{
+	if(is_leaf(parent)) return;
+	
+	int n = count_childs(parent);
+		
+	Node **prev = &parent->child;
+	for(Node *child = parent->child; RayObject_isAligned(child) && child; )
+	{
+		int cn = count_childs(child);
+		if(cn-1 <= (SSize - (n%SSize) ) % SSize && RayObject_isAligned(child->child) )
+		{
+			n += (cn - 1);
+			append_sibling(child, child->child);
+			child = child->sibling;
+			*prev = child;	
+		}
+		else
+		{
+			*prev = child;
+			prev = &(*prev)->sibling;
+			child = *prev;
+		}		
+	}
+		
+	for(Node *child = parent->child; RayObject_isAligned(child) && child; child = child->sibling)
+		pushup_simd<Node,SSize>(child);
+}
 
 
 /*





More information about the Bf-blender-cvs mailing list