changeset 205:efb1df3176f4

fix
author gongo@localhost.localdomain
date Tue, 27 Jan 2009 18:21:12 +0900
parents 3c632793eaf8
children dee3b5092a70
files TaskManager/Test/test_render/fb.h TaskManager/Test/test_render/ieshoot.cpp TaskManager/Test/test_render/spe/DrawSpan.cpp TaskManager/Test/test_render/spe/DrawSpan.h TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp TaskManager/Test/test_render/viewer.cpp TaskManager/Test/test_render/viewer_types.cpp
diffstat 7 files changed, 342 insertions(+), 323 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Test/test_render/fb.h	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/fb.h	Tue Jan 27 18:21:12 2009 +0900
@@ -13,19 +13,6 @@
 #define DEVICE_NAME "/dev/fb0"
 #define DIV_BYTE 8
 
-#define X_PIXEL_MAX 320
-#define Y_LINE_MAX  240
-
-#define BORDER1 80
-#define BORDER2 160
-
-#define COLOR_RED    0xf800
-#define COLOR_GREEN  0x07e0
-#define COLOR_BLUE   0x001f
-#define COLOR_WHITE  0xffff
-#define COLOR_BLACK  0x0000
-#define COLOR_YELLOW 0xffe0
-
 /* function prototype */
 void send_current_error_msg(const char *ptr);
 void send_current_information(const char *ptr);
--- a/TaskManager/Test/test_render/ieshoot.cpp	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/ieshoot.cpp	Tue Jan 27 18:21:12 2009 +0900
@@ -10,6 +10,18 @@
 static const float boss_radius_x = 64.0f;
 static const float boss_radius_y = 128.0f;
 
+static const float iebosstama_speed = 15.0f;
+
+static void
+ieboss_collision(SceneGraphPtr node, int screen_w, int screen_h,
+		 SceneGraphPtr tree);
+static void
+ieboss_collision_invincibil(SceneGraphPtr node, int screen_w, int screen_h, SceneGraphPtr tree);
+static void ieboss_move(SceneGraphPtr node, int screen_w, int screen_h);
+
+static void iebosstama_move(SceneGraphPtr node, int screen_w, int screen_h);
+
+
 static void
 iejiki_collision(SceneGraphPtr node, int screen_w, int screen_h,
 	       SceneGraphPtr tree)
@@ -22,7 +34,6 @@
 {
 }
 
-
 static void
 ieboss_collision(SceneGraphPtr node, int screen_w, int screen_h,
 		 SceneGraphPtr tree)
@@ -39,6 +50,15 @@
 	    && node->xyz[1] + boss_radius_y > tama->xyz[1] - tama_radius) {
 	    tama->remove();
 
+	    node->set_move_collision(ieboss_move, ieboss_collision_invincibil);
+
+	    SceneGraphPtr iebosstama = sgroot->createSceneGraph(Earth);
+	    iebosstama->set_move_collision(iebosstama_move, ietama_collision);
+	    iebosstama->xyz[0] = node->xyz[0];
+	    iebosstama->xyz[1] = node->xyz[1] + boss_radius_y;
+	    iebosstama->xyz[2] = 30000.0f;
+	    node->addBrother(iebosstama);
+
 	    damage++;
 	}
     }
@@ -69,6 +89,34 @@
 }
 
 static void
+ieboss_collision_invincibil(SceneGraphPtr node, int screen_w, int screen_h,
+			    SceneGraphPtr tree)
+{
+    static int frame = 0;
+
+    frame++;
+
+    node->flag_drawable ^= 1;
+
+    if (frame > 60) {
+	frame = 0;
+	node->flag_drawable = 1;
+	node->set_move_collision(ieboss_move, ieboss_collision);
+    }
+}
+
+static void
+iebosstama_move(SceneGraphPtr node, int screen_w, int screen_h)
+{
+    node->xyz[1] += iebosstama_speed;
+
+    // 描画領域から抜けたら削除
+    if (node->xyz[1] > screen_h) {
+	node->remove();
+    }
+}
+
+static void
 ietama_move(SceneGraphPtr node, int screen_w, int screen_h)
 {
     node->xyz[1] -= tama_speed;
@@ -140,12 +188,12 @@
     sgroot->createFromXMLfile("xml_file/ietama.xml");
     sgroot->createFromXMLfile("xml_file/ieboss.xml");
     sgroot->createFromXMLfile("xml_file/iejiki.xml");
+    sgroot->createFromXMLfile("xml_file/universe.xml");
 
     back = sgroot->createSceneGraph();
 
     iejiki = sgroot->createSceneGraph(IEJIKI);
     iejiki->set_move_collision(iejiki_move, iejiki_collision);
-    //iejiki->flag_drawable = 0;
     back->addChild(iejiki);
 
     enemy = sgroot->createSceneGraph(IEBOSS);
--- a/TaskManager/Test/test_render/spe/DrawSpan.cpp	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.cpp	Tue Jan 27 18:21:12 2009 +0900
@@ -11,12 +11,6 @@
 #define TEX_LOAD 1
 #define FB_STORE 2
 
-//#define PROFILE
-
-#if defined(PROFILE)
-#  include <spu_mfcio.h>
-#endif
-
 SchedDefineTask(DrawSpan);
 
 DrawSpan::~DrawSpan(void)
@@ -25,6 +19,31 @@
     free((void*)((int)linebuf*doneWrite));
 }
 
+inline vector float
+spu_re_nrm(vector float a)
+{
+    vector float unit = (vector float){1.0, 1.0, 1.0, 1.0};
+    vector float approximation;
+
+    approximation = spu_re(a);
+    return spu_madd(spu_nmsub(approximation, a, unit),
+                    approximation, approximation);
+}
+
+
+vector signed int
+getLocalPositionVec(vector signed int d, signed int offset)
+{
+    return spu_and(d, spu_splats(offset-1));
+}
+
+vector signed int
+getLocalXVec(vector signed int x)
+{
+    return getLocalPositionVec(x, split_screen_w);
+}
+
+
 /**
  * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
  *
@@ -116,7 +135,7 @@
     float *buf = (float*)smanager->allocate(sizeof(float)*width*height);
     float def = 65535.0f;
 
-#if 1
+#if 0
     for (int i = 0; i < width*height; i++) {
 	buf[i] = def;
     }
@@ -249,7 +268,244 @@
     doneWrite = 1;
 }
 
-#define Prof(st,cur) (((st)-(cur))/79800000.0f * 1000.0f)
+/**
+ * 長さが 1 の Span の描画 (要するに 1 pixel)
+ *
+ * @param span Span
+ * @param startx 描画開始範囲
+ * @param endx 描画終了範囲
+ */
+void
+DrawSpan::drawDot(SpanPtr span, int startx, int endx)
+{
+    int rangex = endx - startx + 1;
+
+    /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */
+    int tex_xpos, tex_ypos;
+
+    // span の始点に対応する Texture の座標 (tex1, tey1)
+    float tex = span->tex_x1;
+    float tey = span->tex_y1;
+
+    // span の始点に対応する z 座標
+    float zpos = span->start_z;
+
+    /* Tile 内での座標 */
+    int localx = getLocalX(span->x-1);
+    int localy = getLocalY(span->y-1);
+
+    /**
+     * (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と
+     * そのブロックのアドレス(MainMemory)
+     */
+    int tex_localx;
+    int tex_localy;
+    uint32 *tex_addr;
+
+    if (span->x < startx || endx < span->x) {
+	return;
+    }
+
+    tex_xpos = (int)((span->tex_width-1) * tex);
+    tex_ypos = (int)((span->tex_height-1) * tey);
+
+    if (zpos < zRow[localx + (rangex*localy)]) {
+	tex_addr = getTile(tex_xpos, tex_ypos,
+			   span->tex_width, span->tex_addr);
+	tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
+	tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
+
+	if (!isAvailableTile(tex_addr)) {
+	    set_rgb(tex_addr);
+	    smanager->dma_wait(TEX_LOAD);
+	}
+
+	int rgb = get_rgb(tex_localx, tex_localy, tex_addr);
+		    
+	zRow[localx + (rangex*localy)] = zpos;
+	linebuf[localx + (rangex*localy)] = rgb;
+    }
+}
+
+void
+DrawSpan::drawLine(SpanPtr span, int startx, int endx)
+{
+    int x = span->x;
+    int rangex = endx - startx + 1;
+    int x_len = span->length_x;
+
+    int js = (x < startx) ? startx - x : 0;
+    int je = (x + x_len > endx) ? endx - x : x_len;
+
+    /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */
+    int tex_xpos, tex_ypos;
+
+    // span の始点に対応する座標 (tex1, tey1)
+    float tex1 = span->tex_x1;
+    float tey1 = span->tex_y1;
+
+    // span の終点に対応する座標 (tex2, tey2)
+    float tex2 = span->tex_x2;
+    float tey2 = span->tex_y2;
+
+    // span の始点、終点に対応する z 座標
+    float zpos1 = span->start_z;
+    float zpos2 = span->end_z;
+
+    // Tile 内での座標
+    int localx, localy = getLocalY(span->y-1);
+
+    // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と
+    // そのブロックのアドレス(MainMemory)
+    int tex_localx;
+    int tex_localy;
+    uint32 *tex_addr;
+
+    float tex_x, tex_y, tex_z;
+
+#if 0
+    for (int j = js; j <= je; j++) {
+	localx = getLocalX(x-1+j);
+
+	tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1);
+
+	tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1);
+	tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1);
+	if (tex_x > 1) tex_x = 1;
+	if (tex_x < 0) tex_x = 0;
+	if (tex_y > 1) tex_y = 1;
+	if (tex_y < 0) tex_y = 0;
+	tex_xpos = (int)((span->tex_width-1) * tex_x);
+	tex_ypos = (int)((span->tex_height-1) * tex_y);
+		    
+	if (tex_z < zRow[localx + (rangex*localy)]) {
+	    tex_addr = getTile(tex_xpos, tex_ypos,
+			       span->tex_width, span->tex_addr);
+	    tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
+	    tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
+
+	    /**
+	     * Tile が無い場合、一旦タスクはここで中断し、
+	     * Tile をロードするタスクを走らせた後に再起動する
+	     */
+	    if (!isAvailableTile(tex_addr)) {
+		set_rgb(tex_addr);
+		smanager->dma_wait(TEX_LOAD);
+	    }
+			
+	    int rgb = get_rgb(tex_localx, tex_localy, tex_addr);
+
+	    zRow[localx + (rangex*localy)] = tex_z;
+	    linebuf[localx + (rangex*localy)] = rgb;
+	}
+    }
+#else
+    for (int j = js; j <= je; j += 4) {
+	vector signed int vec_offset_i = {j, j+1, j+2, j+3};
+	vector float vec_offset_f = {j, j+1, j+2, j+3};
+	vector float len1 = spu_splats((float)(x_len-1));
+	vector float len2 = spu_sub(len1, vec_offset_f);
+
+	vector float vec_zpos1 = spu_splats(zpos1);
+	vector float vec_zpos2 = spu_splats(zpos2);
+	vector float vec_tex1 = spu_splats(tex1);
+	vector float vec_tex2 = spu_splats(tex2);;
+	vector float vec_tey1 = spu_splats(tey1);
+	vector float vec_tey2 = spu_splats(tey2);
+
+	vector float vec_tex_x;
+	vector float vec_tex_y;
+	vector float vec_tex_z;
+
+	// localx = getLocalX(x-1+j);
+	vector signed int vec_localx
+	    = getLocalXVec(spu_add(spu_splats(x-1), vec_offset_i));
+	vector signed int vec_localy = spu_splats(localy);
+
+	// tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1);
+	vec_tex_z = spu_madd(spu_mul(vec_zpos1, len2), spu_re_nrm(len1),
+			     spu_mul(spu_mul(vec_zpos2, vec_offset_f),
+				     spu_re_nrm(len1)));
+
+	// tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1);
+	vec_tex_x = spu_madd(spu_mul(vec_tex1, len2), spu_re_nrm(len1),
+			     spu_mul(spu_mul(vec_tex2, vec_offset_f),
+				     spu_re_nrm(len1)));
+
+	//tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1);
+	vec_tex_y = spu_madd(spu_mul(vec_tey1, len2), spu_re_nrm(len1),
+			     spu_mul(spu_mul(vec_tey2, vec_offset_f),
+				     spu_re_nrm(len1)));
+
+#if 0
+	{
+	    vector float ov1 = spu_splats(1.0f);
+	    vector float ov0 = spu_splats(0.0f);
+
+	    // spu_cmpgt() true = 0xffffffff, false = 0x00000000
+	    vector unsigned int ovflag_1 = spu_cmpgt(vec_tex_x, ov1);
+	    vector unsigned int ovflag_0 = spu_cmpgt(vec_tex_x, ov0);
+
+	    // *_t = 0xffffffff を 1 に変換
+	    // *_f = spu_cmpgt() の 論理否定 vector
+	    //       {0, 1, 0, 1} => {1, 0, 1, 0}
+	    //       *_t 同様 0xffffffff => 1 に変換
+	    vector signed int ovflag_1_t = spu_and(ovflag_1, 0x1);
+	    vector signed int ovflag_1_f
+		= spu_and(spu_nor(ovflag_1, ovflag_1), 0x1);
+
+	    for (int h = 0; h < 4; h++) {
+		signed int fl = spu_extract(ovflag_1_f, h);
+		//float x = spu_extract((spu_mul(vec_tex_x, (vector float)ovflag_1_t)), h);
+		printf("[%d] %f %d\n", h, 3.3, fl);
+	    }
+
+	    vector unsigned int ovflag_0_t = spu_and(ovflag_0, 0x1);
+
+	    //vec_tex_x = spu_add(spu_mul(ov1, (vector float)ovflag_1_t),
+	    //spu_mul(vec_tex_x, (vector float)ovflag_1_f));
+	    //vec_tex_x = spu_mul(vec_tex_x, (vector float)ovflag_0_t);
+	}
+#endif
+	int cnt = (je - j > 4) ? 4 : je - j + 1;
+	
+	for (int i = 0; i < cnt; i++) {
+	    tex_x = spu_extract(vec_tex_x, i);
+	    tex_y = spu_extract(vec_tex_y, i);
+	    tex_z = spu_extract(vec_tex_z, i);
+	    localx = spu_extract(vec_localx, i);
+
+	    if (tex_x > 1) tex_x = 1;
+	    if (tex_x < 0) tex_x = 0;
+	    if (tex_y > 1) tex_y = 1;
+	    if (tex_y < 0) tex_y = 0;
+	    tex_xpos = (int)((span->tex_width-1) * tex_x);
+	    tex_ypos = (int)((span->tex_height-1) * tex_y);
+
+	    if (tex_z < zRow[localx + (rangex*localy)]) {
+		tex_addr = getTile(tex_xpos, tex_ypos,
+				   span->tex_width, span->tex_addr);
+		tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
+		tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
+		
+		/**
+		 * Tile が無い場合、一旦タスクはここで中断し、
+		 * Tile をロードするタスクを走らせた後に再起動する
+		 */
+		if (!isAvailableTile(tex_addr)) {
+		    set_rgb(tex_addr);
+		    smanager->dma_wait(TEX_LOAD);
+		}
+		
+		int rgb = get_rgb(tex_localx, tex_localy, tex_addr);
+		
+		zRow[localx + (rangex*localy)] = tex_z;
+		linebuf[localx + (rangex*localy)] = rgb;
+	    }
+	}
+    }
+#endif
+}
 
 int
 DrawSpan::run(void *rbuf, void *wbuf)
@@ -259,6 +515,10 @@
     SpanPackPtr free_spack = next_spack; // next_spack の free() 用
     Span *span;
 
+    void (DrawSpan::*drawFunc[2])(SpanPtr, int, int) = {
+	&DrawSpan::drawDot, &DrawSpan::drawLine
+    };
+
     uint32 display   = smanager->get_param(0);
     int screen_width = smanager->get_param(1);
     int rangex_start = smanager->get_param(2);
@@ -274,17 +534,10 @@
     tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST);
 
     zRow = zRow_init(rangex, rangey);
-    linebuf = linebuf_init(rangex, rangey, 0xffffffff);
+    linebuf = linebuf_init(rangex, rangey, 0x00ffffff);
 
     doneWrite = 0;
-
-    int tileNum = 0;
-    int flag = 0;
     
-#if defined(PROFILE)
-    uint32 profile = spu_read_decrementer();
-    printf("%d %u DrawSpan start\n", smanager->get_cpuid(), profile);
-#endif
     do {
 	/**
 	 * SpanPack->next が存在する場合、
@@ -301,273 +554,9 @@
 	for (int t = 0; t < spack->info.size; t++) {	  
 	    span = &spack->span[t];
 
-	    uint32 rgb = 0x0000ff00;
-	    float tex1 = span->tex_x1;
-	    float tex2 = span->tex_x2;
-	    float tey1 = span->tex_y1;
-	    float tey2 = span->tex_y2;
-
-	    /**
-	     * Span が持つ 1 pixel 毎の
-	     * テクスチャの座標
-	     */
-	    int tex_xpos;
-	    int tex_ypos;
-
-	    /**
-	     * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と
-	     * そのブロックのアドレス(MainMemory)
-	     */
-	    int tex_localx;
-	    int tex_localy;
-	    uint32 *tex_addr;
-
-	    int x = span->x;
-	    int y = span->y;
 	    int x_len = span->length_x;
-	    float z = span->start_z;
-	    float zpos = span->end_z;
-
-	    // 座標が [0 .. split_screen_w-1] に入るように x,y を -1
-	    int localx = getLocalX(x-1);
-	    int localy = getLocalY(y-1);
-
-	    if (x_len == 1) {
-		if (x < rangex_start || rangex_end < x) {
-		    continue;
-		}
-
-		flag = 1;
-		tex_xpos = (int)((span->tex_width-1) * tex1);
-		tex_ypos = (int)((span->tex_height-1) * tey1);
-
-		if (zpos < zRow[localx + (rangex*localy)]) {
-		    tex_addr = getTile(tex_xpos, tex_ypos,
-				       span->tex_width, span->tex_addr);
-		    tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
-		    tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
-		    
-		    if (!isAvailableTile(tex_addr)) {
-#  if defined(PROFILE)
-			printf("%d %u start load tile\n",
-			       smanager->get_cpuid(), spu_read_decrementer());
-#  endif
-			set_rgb(tex_addr);
-			smanager->dma_wait(TEX_LOAD);
-#  if defined(PROFILE)
-			printf("%d %u end load tile\n",
-			       smanager->get_cpuid(), spu_read_decrementer());
-#  endif
-			tileNum++;
-		    }
-
-		    rgb = get_rgb(tex_localx, tex_localy, tex_addr);
-
-		    zRow[localx + (rangex*localy)] = zpos;
-		    linebuf[localx + (rangex*localy)] = rgb;
-		}
-	    } else {
-		int js = (x < rangex_start) ? rangex_start - x : 0;
-		int je = (x + x_len > rangex_end) ? rangex_end - x : x_len;
-		float tex_x, tex_y, tex_z;
-
-		for (int j = js; j <= je; j++) {
-		    flag = 1;
-		    localx = getLocalX(x-1+j);
-
-		    tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1);
-
-		    tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1);
-		    tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1);
-		    if (tex_x > 1) tex_x = 1;
-		    if (tex_x < 0) tex_x = 0;
-		    if (tex_y > 1) tex_y = 1;
-		    if (tex_y < 0) tex_y = 0;
-		    tex_xpos = (int)((span->tex_width-1) * tex_x);
-		    tex_ypos = (int)((span->tex_height-1) * tex_y);
-		    
-		    if (tex_z < zRow[localx + (rangex*localy)]) {
-			tex_addr = getTile(tex_xpos, tex_ypos,
-					   span->tex_width, span->tex_addr);
-			tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
-			tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
-
-			/**
-			 * Tile が無い場合、一旦タスクはここで中断し、
-			 * Tile をロードするタスクを走らせた後に再起動する
-			 */
-			if (!isAvailableTile(tex_addr)) {
-			    spack->info.start = t;
-#if 0
-			    set_rgbs(tex_addr,
-				     getTile(span->tex_width-1, tex_ypos,
-					     span->tex_width, span->tex_addr));
-			    //smanager->dma_wait(TEX_LOAD);
-			    reboot(spack, j);
-			    goto FINISH;
-#else
-
-#  if defined(PROFILE)
-			    printf("%d %u start load tile\n",
-				   smanager->get_cpuid(), 
-				   spu_read_decrementer());
-#  endif
-
-			    set_rgb(tex_addr);
-			    smanager->dma_wait(TEX_LOAD);
-			    tileNum++;
-
-#  if defined(PROFILE)
-			    printf("%d %u end load tile\n",
-				   smanager->get_cpuid(),
-				   spu_read_decrementer());
-#  endif
-#endif
-			}
-			
-			rgb = get_rgb(tex_localx, tex_localy, tex_addr);
-
-			zRow[localx + (rangex*localy)] = tex_z;
-			linebuf[localx + (rangex*localy)] = rgb;
-		    }
-		}
-	    }
-	}
 
-	for (int t = 0; t < spack->info.size; t++) {	  
-	    span = &spack->span[t];
-
-	    uint32 rgb = 0x0000ff00;
-	    float tex1 = span->tex_x1;
-	    float tex2 = span->tex_x2;
-	    float tey1 = span->tex_y1;
-	    float tey2 = span->tex_y2;
-
-	    /**
-	     * Span が持つ 1 pixel 毎の
-	     * テクスチャの座標
-	     */
-	    int tex_xpos;
-	    int tex_ypos;
-
-	    /**
-	     * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と
-	     * そのブロックのアドレス(MainMemory)
-	     */
-	    int tex_localx;
-	    int tex_localy;
-	    uint32 *tex_addr;
-
-	    int x = span->x;
-	    int y = span->y;
-	    int x_len = span->length_x;
-	    float z = span->start_z;
-	    float zpos = span->end_z;
-
-	    // 座標が [0 .. split_screen_w-1] に入るように x,y を -1
-	    int localx = getLocalX(x-1);
-	    int localy = getLocalY(y-1);
-
-	    if (x_len == 1) {
-		if (x < rangex_start || rangex_end < x) {
-		    continue;
-		}
-
-		flag = 1;
-		tex_xpos = (int)((span->tex_width-1) * tex1);
-		tex_ypos = (int)((span->tex_height-1) * tey1);
-
-		if (zpos < zRow[localx + (rangex*localy)]) {
-		    tex_addr = getTile(tex_xpos, tex_ypos,
-				       span->tex_width, span->tex_addr);
-		    tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
-		    tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
-		    
-		    if (!isAvailableTile(tex_addr)) {
-#  if defined(PROFILE)
-			printf("%d %u start load tile\n",
-			       smanager->get_cpuid(), spu_read_decrementer());
-#  endif
-			set_rgb(tex_addr);
-			smanager->dma_wait(TEX_LOAD);
-#  if defined(PROFILE)
-			printf("%d %u end load tile\n",
-			       smanager->get_cpuid(), spu_read_decrementer());
-#  endif
-			tileNum++;
-		    }
-
-		    rgb = get_rgb(tex_localx, tex_localy, tex_addr);
-
-		    zRow[localx + (rangex*localy)] = zpos;
-		    linebuf[localx + (rangex*localy)] = rgb;
-		}
-	    } else {
-		int js = (x < rangex_start) ? rangex_start - x : 0;
-		int je = (x + x_len > rangex_end) ? rangex_end - x : x_len;
-		float tex_x, tex_y, tex_z;
-
-		for (int j = js; j <= je; j++) {
-		    flag = 1;
-		    localx = getLocalX(x-1+j);
-
-		    tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1);
-
-		    tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1);
-		    tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1);
-		    if (tex_x > 1) tex_x = 1;
-		    if (tex_x < 0) tex_x = 0;
-		    if (tex_y > 1) tex_y = 1;
-		    if (tex_y < 0) tex_y = 0;
-		    tex_xpos = (int)((span->tex_width-1) * tex_x);
-		    tex_ypos = (int)((span->tex_height-1) * tex_y);
-		    
-		    if (tex_z < zRow[localx + (rangex*localy)]) {
-			tex_addr = getTile(tex_xpos, tex_ypos,
-					   span->tex_width, span->tex_addr);
-			tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
-			tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
-
-			/**
-			 * Tile が無い場合、一旦タスクはここで中断し、
-			 * Tile をロードするタスクを走らせた後に再起動する
-			 */
-			if (!isAvailableTile(tex_addr)) {
-			    spack->info.start = t;
-#if 0
-			    set_rgbs(tex_addr,
-				     getTile(span->tex_width-1, tex_ypos,
-					     span->tex_width, span->tex_addr));
-			    //smanager->dma_wait(TEX_LOAD);
-			    reboot(spack, j);
-			    goto FINISH;
-#else
-
-#  if defined(PROFILE)
-			    printf("%d %u start load tile\n",
-				   smanager->get_cpuid(), 
-				   spu_read_decrementer());
-#  endif
-
-			    set_rgb(tex_addr);
-			    smanager->dma_wait(TEX_LOAD);
-			    tileNum++;
-
-#  if defined(PROFILE)
-			    printf("%d %u end load tile\n",
-				   smanager->get_cpuid(),
-				   spu_read_decrementer());
-#  endif
-#endif
-			}
-			
-			rgb = get_rgb(tex_localx, tex_localy, tex_addr);
-
-			zRow[localx + (rangex*localy)] = tex_z;
-			linebuf[localx + (rangex*localy)] = rgb;
-		    }
-		}
-	    }
+	    (this->*drawFunc[(x_len != 1)])(span, rangex_start, rangex_end);
 	}
 
 	smanager->dma_wait(SPAN_PACK_LOAD);
@@ -590,14 +579,6 @@
      * linebuf, zRow は free() しない
      */
     free(free_spack);
-    
-#if defined(PROFILE)
-    printf("%d %u DrawSpan end\n",
-	   smanager->get_cpuid(), spu_read_decrementer());
-    if (flag) {
-	printf("%d %d tileNum\n", smanager->get_cpuid(), tileNum);
-    }
-#endif
 
     return 0;
 }
--- a/TaskManager/Test/test_render/spe/DrawSpan.h	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.h	Tue Jan 27 18:21:12 2009 +0900
@@ -42,6 +42,9 @@
     void writebuffer(unsigned int display, int width, int height, int screen_width);
 
     void reboot(SpanPackPtr spack, int cur_span_x);
+
+    void drawDot(SpanPtr span, int startx, int endx);
+    void drawLine(SpanPtr span, int startx, int endx);
 };
 
 typedef struct {
--- a/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp	Tue Jan 27 18:21:12 2009 +0900
@@ -59,21 +59,6 @@
 CreatePolygonFromSceneGraph::run(void *rbuf, void *wbuf)
 {
     float xyz1[4], xyz2[4], xyz3[4];
-    float mat[16] = {fx, 0, 0, 0, 0, fy, 0, 0, 0, 0, 1.0f, 1.0f, 20.0f, 30.0f, 0, 0};
-    
-    //fx -= fd;
-    //fy -= fd;
-
-    if (fx < 0.0f) {
-	fx = 0.0f;
-	fy = 0.0f;
-	fd = -fd;
-    } else if (fx > 1.0f) {
-	fx = 1.0f;
-	fy = 1.0f;
-	fd = -fd;
-    }
-
 
     SceneGraphPtr sg_top = (SceneGraphPtr)smanager->get_param(0);
     SceneGraphPtr sg = sg_top;
@@ -84,6 +69,21 @@
 	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
     PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(1);
     PolygonPackPtr tmp_pp;
+
+    float n = 10.0f;
+    float f = 1000.0f;
+    float t = 30.0f;
+    float b = -30.0f;
+    float r = 30.0f;
+    float l = -30.0f;
+
+    float mat[16] = {
+	2*n/(r-l),         0,  (r+l)/(r-l),            0,
+	        0, 2*n/(t-b),  (t+b)/(t-b),            0,
+	        0,         0, -(f+n)/(f-n), -2*n*f/(f-n),
+	        0,         0,           -1,            0
+    };
+
     
     pp->init();
     send_pp->init();
--- a/TaskManager/Test/test_render/viewer.cpp	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/viewer.cpp	Tue Jan 27 18:21:12 2009 +0900
@@ -332,7 +332,7 @@
 		// Draw Background (現在は塗りつぶし)
 		task_draw = manager->create_task(TASK_DRAW_BACK);
 		task_draw->add_param(0xffffffff);
-	    
+
 		for (int k = 0; k < rangey; k++) {
 		    task_draw->add_outData(
 			&pixels[(startx-1)+this->width*(k+starty-1)],
@@ -340,7 +340,7 @@
 		}
 #else
 		memset(&pixels[(startx-1)+this->width*(starty-1)],
-		       0x00, (this->width)*sizeof(int)*rangey);
+		       0xFF, (this->width)*sizeof(int)*rangey);
 		break;
 #endif
 	    }
--- a/TaskManager/Test/test_render/viewer_types.cpp	Mon Jan 26 18:34:30 2009 +0900
+++ b/TaskManager/Test/test_render/viewer_types.cpp	Tue Jan 27 18:21:12 2009 +0900
@@ -8,10 +8,10 @@
      * 現在は offset は 2 の冪乗のみなので
      * これで問題ないけどどうなの?
      */
-    //return d & (offset-1);
+    return d & (offset-1);
 
     // offset が 2 の冪乗以外はこれにしないとだめ
-    return d % offset;
+    //return d % offset;
 }
 
 /**