changeset 350:dd3888980738

add tasts.xml renderer.xml
author admin@mcbk.cr.ie.u-ryukyu.ac.jp
date Fri, 10 Jul 2009 16:41:20 +0900
parents 51ffd144f62c
children 852d7ba57be2
files Renderer/test_render/renderer.xml example/scenegraph/xml/task/collision.cpp example/scenegraph/xml/task/collision.h example/scenegraph/xml/task/move.cpp example/scenegraph/xml/task/move.h example/scenegraph/xml/tasks.xml example/scenegraph/xml/xml.cpp
diffstat 7 files changed, 841 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/test_render/renderer.xml	Fri Jul 10 16:41:20 2009 +0900
@@ -0,0 +1,363 @@
+<!-- Cerium Task Configuration
+     CPU_PPE = 0, // default
+     CPU_SPE = 1,
+     SPE_ANY = CPU_SPE,
+     SPE_0 = 2,
+     SPE_1 = 3,
+     SPE_2 = 4,
+     SPE_3 = 5,
+     SPE_4 = 6,
+     SPE_5 = 7,
+  -->
+
+<directory>
+  <path> ${CERIUM}/Renderer/Task </path>
+  <task name="Renderer">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> Renderer.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="CreatePolygon">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> CreatePolygon.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="CreateSpan">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> CreateSpan.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="DrawBack">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> DrawBack.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="DrawSpan">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> DrawSpan.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="DrawSpanRenew">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> DrawSpanRenew.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="Load_Texture">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> Load_Texture.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="Set_Texture">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> Set_Texture.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="TileHash">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> TileHash.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="viewer_types">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> viewer_types.cc </source>
+
+  </task>
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="Set_Texture">
+    <target name="cell">
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target name="cell">
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target name="macosx">
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+
+    <source> Set_Texture.cc </source>
+
+  </task>
+</directory>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/scenegraph/xml/task/collision.cpp	Fri Jul 10 16:41:20 2009 +0900
@@ -0,0 +1,196 @@
+/**
+ * SceneGraph が増えてくると動かなくなるかもしれない。
+ * 一応 mainMem とかで動くようになるとは思うけど。
+ * だめだったら、そこら辺が怪しいと思うべき
+ */
+
+// #define DEBUG
+#include "error.h"
+
+#include "CreatePolygon.h"
+#include "polygon_pack.h"
+#include "scene_graph_pack.h"
+
+SchedDefineTask(CreatePolygon);
+
+#define SG_PACK_LOAD 10
+#define SG_NODE_LOAD 11
+#define PP_LOAD 12
+#define PP_STORE 13
+
+/**
+ * あとで直す
+ */
+static void
+rotate(float *xyz, float *matrix)
+{
+    float abc[4];
+
+    abc[0] = xyz[0];
+    abc[1] = xyz[1];
+    abc[2] = xyz[2];
+    abc[3] = xyz[3];
+
+    for(int i=0; i<4; i++)
+    {
+	xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12];
+    }
+}
+
+int 
+CreatePolygon::run(void *rbuf, void *wbuf)
+{
+    __debug_spe("CreatePolygon\n");
+
+    float xyz1[4],xyz2[4],xyz3[4];
+
+    SceneGraphPackPtr sgp = (SceneGraphPack*)smanager->get_input(0);
+    SceneGraphPackPtr next_sgp = 
+	(SceneGraphPackPtr)smanager->allocate(sizeof(SceneGraphPack));
+    SceneGraphPackPtr free_sgp = next_sgp;
+    SceneGraphPackPtr tmp_sgp;
+
+    SceneGraphNodePtr node;
+    SceneGraphNodePtr next_node
+	= (SceneGraphNodePtr)smanager->allocate(sizeof(SceneGraphNode));
+    SceneGraphNodePtr free_node = next_node;
+    SceneGraphNodePtr tmp_node;
+
+    PolygonPackPtr pp
+	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
+    PolygonPackPtr send_pp
+	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
+    PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(0);
+    PolygonPackPtr tmp_pp;
+    
+    pp->init();
+    send_pp->init();
+
+    do {
+	if (sgp->next != NULL) {
+	    smanager->dma_load(next_sgp, (uint32)sgp->next,
+			       sizeof(SceneGraphPack), SG_PACK_LOAD);
+	} else {
+	    next_sgp = NULL;
+	}
+
+	for (int i = 0; i < sgp->info.size; i++) {
+	    node = &sgp->node[i];
+
+	    do {
+		if (node->next != NULL) {
+		    smanager->dma_load(next_node, (uint32)node->next,
+				       sizeof(SceneGraphNode), SG_NODE_LOAD);
+		} else {
+		    next_node = NULL;
+		}
+    
+		for (int n = 0, nt = 0; n < node->size*3; n+=9, nt+=6) {
+
+		    if (pp->info.size >= MAX_SIZE_TRIANGLE) {
+			PolygonPackPtr next;
+
+			// smanager から Task を作る、0 ではなく PolygonPack->task_id が良い
+			smanager->mainMem_alloc(0, sizeof(PolygonPack));
+			smanager->mainMem_wait();
+			next = (PolygonPackPtr)smanager->mainMem_get(0);
+
+			pp->next = next; // この部分は TaskManager 側でやるべき
+
+			tmp_pp = pp;
+			pp = send_pp;
+			send_pp = tmp_pp;
+
+			smanager->dma_wait(PP_STORE);
+			smanager->dma_store(send_pp, (uint32)pp_addr,
+					    sizeof(PolygonPack), PP_STORE);
+			
+			pp_addr = next;
+
+			smanager->dma_wait(PP_LOAD); // 多分不要
+			smanager->dma_load(pp, (uint32)pp_addr,
+					   sizeof(PolygonPack), PP_LOAD);
+			// 次の dma_wait のコストが高いのでパイプラインで隠す必要がある
+			
+			smanager->dma_wait(PP_LOAD);
+			pp->init();
+
+		    }
+
+		    TrianglePack *triangle = &pp->tri[pp->info.size++];
+
+		    xyz1[0] = node->vertex[n];
+		    xyz1[1] = node->vertex[n+1];
+		    xyz1[2] = node->vertex[n+2]*-1;
+		    xyz1[3] = 1;
+		    xyz2[0] = node->vertex[n+3];
+		    xyz2[1] = node->vertex[n+3+1];
+		    xyz2[2] = node->vertex[n+3+2]*-1;
+		    xyz2[3] = 1;
+		    xyz3[0] = node->vertex[n+6];
+		    xyz3[1] = node->vertex[n+6+1];
+		    xyz3[2] = node->vertex[n+6+2]*-1;
+		    xyz3[3] = 1;
+		
+		    rotate(xyz1, node->translation);
+		    rotate(xyz2, node->translation);
+		    rotate(xyz3, node->translation);
+		
+		    triangle->ver1.x = xyz1[0];
+		    triangle->ver1.y = xyz1[1];
+		    triangle->ver1.z = xyz1[2];
+		    triangle->ver1.tex_x = node->texture[nt];
+		    triangle->ver1.tex_y = node->texture[nt+1];
+		
+		    triangle->ver2.x = xyz2[0];
+		    triangle->ver2.y = xyz2[1];
+		    triangle->ver2.z = xyz2[2];
+		    triangle->ver2.tex_x = node->texture[nt+2];
+		    triangle->ver2.tex_y = node->texture[nt+2+1];
+		
+		    triangle->ver3.x = xyz3[0];
+		    triangle->ver3.y = xyz3[1];
+		    triangle->ver3.z = xyz3[2];
+		    triangle->ver3.tex_x = node->texture[nt+4];
+		    triangle->ver3.tex_y = node->texture[nt+4+1];
+		
+#if 1
+		    triangle->tex_info.addr = node->tex_addr;
+		    triangle->tex_info.width = node->tex_width;
+		    triangle->tex_info.height = node->tex_height;
+#else
+		    triangle->tex_info.addr = node->texture_info.pixels;
+		    triangle->tex_info.width = node->texture_info.t_w;
+		    triangle->tex_info.height = node->texture_info.t_h;
+#endif
+		}
+
+		smanager->dma_wait(SG_NODE_LOAD);
+
+		tmp_node = node;
+		node = next_node;
+		next_node = tmp_node;
+	    } while (node);
+
+	    next_node = free_node;
+	}
+
+	smanager->dma_wait(SG_PACK_LOAD);
+
+	tmp_sgp = sgp;
+	sgp = next_sgp;
+	next_sgp = tmp_sgp;
+    } while (sgp);
+    
+    smanager->dma_wait(PP_STORE);
+    smanager->dma_store(pp, (uint32)pp_addr,
+			sizeof(PolygonPack), PP_STORE);
+    smanager->dma_wait(PP_STORE);
+
+    free(pp);
+    free(send_pp);
+    free(free_node);
+    free(free_sgp);
+
+    return 0;
+}    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/scenegraph/xml/task/collision.h	Fri Jul 10 16:41:20 2009 +0900
@@ -0,0 +1,15 @@
+#ifndef INCLUDED_CREATE_POLYGON
+#define INCLUDED_CREATE_POLYGON
+
+#ifndef INCLUDED_SCHED_TASK
+#  include "SchedTask.h"
+#endif
+
+class CreatePolygon : public SchedTask {
+public:
+    SchedConstructor(CreatePolygon);
+
+    int run(void *rbuf, void *wbuf);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/scenegraph/xml/task/move.cpp	Fri Jul 10 16:41:20 2009 +0900
@@ -0,0 +1,196 @@
+/**
+ * SceneGraph が増えてくると動かなくなるかもしれない。
+ * 一応 mainMem とかで動くようになるとは思うけど。
+ * だめだったら、そこら辺が怪しいと思うべき
+ */
+
+// #define DEBUG
+#include "error.h"
+
+#include "CreatePolygon.h"
+#include "polygon_pack.h"
+#include "scene_graph_pack.h"
+
+SchedDefineTask(CreatePolygon);
+
+#define SG_PACK_LOAD 10
+#define SG_NODE_LOAD 11
+#define PP_LOAD 12
+#define PP_STORE 13
+
+/**
+ * あとで直す
+ */
+static void
+rotate(float *xyz, float *matrix)
+{
+    float abc[4];
+
+    abc[0] = xyz[0];
+    abc[1] = xyz[1];
+    abc[2] = xyz[2];
+    abc[3] = xyz[3];
+
+    for(int i=0; i<4; i++)
+    {
+	xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12];
+    }
+}
+
+int 
+CreatePolygon::run(void *rbuf, void *wbuf)
+{
+    __debug_spe("CreatePolygon\n");
+
+    float xyz1[4],xyz2[4],xyz3[4];
+
+    SceneGraphPackPtr sgp = (SceneGraphPack*)smanager->get_input(0);
+    SceneGraphPackPtr next_sgp = 
+	(SceneGraphPackPtr)smanager->allocate(sizeof(SceneGraphPack));
+    SceneGraphPackPtr free_sgp = next_sgp;
+    SceneGraphPackPtr tmp_sgp;
+
+    SceneGraphNodePtr node;
+    SceneGraphNodePtr next_node
+	= (SceneGraphNodePtr)smanager->allocate(sizeof(SceneGraphNode));
+    SceneGraphNodePtr free_node = next_node;
+    SceneGraphNodePtr tmp_node;
+
+    PolygonPackPtr pp
+	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
+    PolygonPackPtr send_pp
+	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
+    PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(0);
+    PolygonPackPtr tmp_pp;
+    
+    pp->init();
+    send_pp->init();
+
+    do {
+	if (sgp->next != NULL) {
+	    smanager->dma_load(next_sgp, (uint32)sgp->next,
+			       sizeof(SceneGraphPack), SG_PACK_LOAD);
+	} else {
+	    next_sgp = NULL;
+	}
+
+	for (int i = 0; i < sgp->info.size; i++) {
+	    node = &sgp->node[i];
+
+	    do {
+		if (node->next != NULL) {
+		    smanager->dma_load(next_node, (uint32)node->next,
+				       sizeof(SceneGraphNode), SG_NODE_LOAD);
+		} else {
+		    next_node = NULL;
+		}
+    
+		for (int n = 0, nt = 0; n < node->size*3; n+=9, nt+=6) {
+
+		    if (pp->info.size >= MAX_SIZE_TRIANGLE) {
+			PolygonPackPtr next;
+
+			// smanager から Task を作る、0 ではなく PolygonPack->task_id が良い
+			smanager->mainMem_alloc(0, sizeof(PolygonPack));
+			smanager->mainMem_wait();
+			next = (PolygonPackPtr)smanager->mainMem_get(0);
+
+			pp->next = next; // この部分は TaskManager 側でやるべき
+
+			tmp_pp = pp;
+			pp = send_pp;
+			send_pp = tmp_pp;
+
+			smanager->dma_wait(PP_STORE);
+			smanager->dma_store(send_pp, (uint32)pp_addr,
+					    sizeof(PolygonPack), PP_STORE);
+			
+			pp_addr = next;
+
+			smanager->dma_wait(PP_LOAD); // 多分不要
+			smanager->dma_load(pp, (uint32)pp_addr,
+					   sizeof(PolygonPack), PP_LOAD);
+			// 次の dma_wait のコストが高いのでパイプラインで隠す必要がある
+			
+			smanager->dma_wait(PP_LOAD);
+			pp->init();
+
+		    }
+
+		    TrianglePack *triangle = &pp->tri[pp->info.size++];
+
+		    xyz1[0] = node->vertex[n];
+		    xyz1[1] = node->vertex[n+1];
+		    xyz1[2] = node->vertex[n+2]*-1;
+		    xyz1[3] = 1;
+		    xyz2[0] = node->vertex[n+3];
+		    xyz2[1] = node->vertex[n+3+1];
+		    xyz2[2] = node->vertex[n+3+2]*-1;
+		    xyz2[3] = 1;
+		    xyz3[0] = node->vertex[n+6];
+		    xyz3[1] = node->vertex[n+6+1];
+		    xyz3[2] = node->vertex[n+6+2]*-1;
+		    xyz3[3] = 1;
+		
+		    rotate(xyz1, node->translation);
+		    rotate(xyz2, node->translation);
+		    rotate(xyz3, node->translation);
+		
+		    triangle->ver1.x = xyz1[0];
+		    triangle->ver1.y = xyz1[1];
+		    triangle->ver1.z = xyz1[2];
+		    triangle->ver1.tex_x = node->texture[nt];
+		    triangle->ver1.tex_y = node->texture[nt+1];
+		
+		    triangle->ver2.x = xyz2[0];
+		    triangle->ver2.y = xyz2[1];
+		    triangle->ver2.z = xyz2[2];
+		    triangle->ver2.tex_x = node->texture[nt+2];
+		    triangle->ver2.tex_y = node->texture[nt+2+1];
+		
+		    triangle->ver3.x = xyz3[0];
+		    triangle->ver3.y = xyz3[1];
+		    triangle->ver3.z = xyz3[2];
+		    triangle->ver3.tex_x = node->texture[nt+4];
+		    triangle->ver3.tex_y = node->texture[nt+4+1];
+		
+#if 1
+		    triangle->tex_info.addr = node->tex_addr;
+		    triangle->tex_info.width = node->tex_width;
+		    triangle->tex_info.height = node->tex_height;
+#else
+		    triangle->tex_info.addr = node->texture_info.pixels;
+		    triangle->tex_info.width = node->texture_info.t_w;
+		    triangle->tex_info.height = node->texture_info.t_h;
+#endif
+		}
+
+		smanager->dma_wait(SG_NODE_LOAD);
+
+		tmp_node = node;
+		node = next_node;
+		next_node = tmp_node;
+	    } while (node);
+
+	    next_node = free_node;
+	}
+
+	smanager->dma_wait(SG_PACK_LOAD);
+
+	tmp_sgp = sgp;
+	sgp = next_sgp;
+	next_sgp = tmp_sgp;
+    } while (sgp);
+    
+    smanager->dma_wait(PP_STORE);
+    smanager->dma_store(pp, (uint32)pp_addr,
+			sizeof(PolygonPack), PP_STORE);
+    smanager->dma_wait(PP_STORE);
+
+    free(pp);
+    free(send_pp);
+    free(free_node);
+    free(free_sgp);
+
+    return 0;
+}    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/scenegraph/xml/task/move.h	Fri Jul 10 16:41:20 2009 +0900
@@ -0,0 +1,15 @@
+#ifndef INCLUDED_CREATE_POLYGON
+#define INCLUDED_CREATE_POLYGON
+
+#ifndef INCLUDED_SCHED_TASK
+#  include "SchedTask.h"
+#endif
+
+class CreatePolygon : public SchedTask {
+public:
+    SchedConstructor(CreatePolygon);
+
+    int run(void *rbuf, void *wbuf);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/scenegraph/xml/tasks.xml	Fri Jul 10 16:41:20 2009 +0900
@@ -0,0 +1,55 @@
+<!-- Cerium Task Configuration
+     CPU_PPE = 0, // default
+     CPU_SPE = 1,
+     SPE_ANY = CPU_SPE,
+     SPE_0 = 2,
+     SPE_1 = 3,
+     SPE_2 = 4,
+     SPE_3 = 5,
+     SPE_4 = 6,
+     SPE_5 = 7,
+  -->
+
+<directory>
+  <path> task </path>
+
+    <target>
+      <path> spe </path>
+      <cpu> SPE_ANY </cpu>
+      <cc cc:compiler="spu-g++"/>
+    </target>
+
+    <target>
+      <path> ppe </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="ppu-g++"/>
+    </target>
+
+    <target>
+      <path> macosx </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="mac-g++"/>
+    </target>
+
+    <target name="linux">
+      <path> linux </path>
+      <cpu> CPU_PPE </cpu>
+      <cc cc:compiler="linux-g++"/>
+    </target>
+    <task name="move">
+    <source> move.cpp </source>
+
+  </task>
+
+  <task name="collision">
+    <source> collision.cpp </source>
+  </task>
+
+</directory>
+
+<directory>
+  <path> ${CERIUM}/Renderer/test_render </path>
+  <task name="Renderer">
+    <config> renderer.xml </config>
+  </task>
+</directory>
--- a/example/scenegraph/xml/xml.cpp	Fri Jul 10 16:06:15 2009 +0900
+++ b/example/scenegraph/xml/xml.cpp	Fri Jul 10 16:41:20 2009 +0900
@@ -14,15 +14,7 @@
 
 void TMend(void);
 
-static double
-getTime(void)
-{
-    struct timeval tv;
-    gettimeofday(&tv, NULL);
-    return tv.tv_sec + (double)tv.tv_usec*1e-6;
-}
-
-const char *usr_help_str = "Usage: ./sort [option]\n \
+const char *usr_help_str = "Usage: ./test_xml [option]\n \
 options\n\
   -cpu     Number of SPE used (default 1)\n\
   -l, --length  Sorted number of data (default 1200)\n\
@@ -52,7 +44,6 @@
   sgroot->createFromXMLfile("sg/sg-test.xml");
   sgroot->createFromXMLfile("sg/sg-test2.xml");
 
-  st_time = getTime();
   manager->set_TMend(TMend);
 
 }
@@ -60,10 +51,6 @@
 void
 TMend(void)
 {
-  ed_time = getTime();
-  //show_data();
-  printf("Time: %0.6f\n",ed_time-st_time);
-
 }
 
 void