changeset 210:204b03ca98f8

fix DrawSpan
author gongo@localhost.localdomain
date Fri, 30 Jan 2009 14:55:04 +0900
parents 2ae83ca07f0d
children 3e7e8b5d9f17
files TaskManager/Cell/spe/SchedTask.cc TaskManager/Test/test_render/ChangeLog TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/Tapestry.h TaskManager/Test/test_render/ball_bound.cpp TaskManager/Test/test_render/polygon_pack.h TaskManager/Test/test_render/spe/CreateSpan.cpp TaskManager/Test/test_render/spe/CreateSpan.h TaskManager/Test/test_render/spe/DrawSpan.cpp TaskManager/Test/test_render/spe/DrawSpan.h TaskManager/Test/test_render/spe/DrawSpanRenew.cpp TaskManager/Test/test_render/spe/TileHash.cpp TaskManager/Test/test_render/task/CreateSpan.cpp TaskManager/Test/test_render/task/CreateSpan.h TaskManager/Test/test_render/task/DrawSpan.cpp TaskManager/Test/test_render/task/DrawSpan.h TaskManager/Test/test_render/task/DrawSpanRenew.cpp TaskManager/Test/test_render/task/TileHash.cpp TaskManager/Test/test_render/viewer.cpp TaskManager/Test/test_render/viewer_types.h
diffstat 20 files changed, 720 insertions(+), 455 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/spe/SchedTask.cc	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Cell/spe/SchedTask.cc	Fri Jan 30 14:55:04 2009 +0900
@@ -36,13 +36,19 @@
     ex_next  = &SchedTask::ex_next_normal;
 }
 
+/**
+ * dma_store の wait を行う
+ * このタスクが RenewTask だった場合、
+ * __inListData や __outListData は
+ * Scheduler の持つ、使い回しの buffer ではなく
+ * 新たに allocate されたものなので、ここで free する
+ */
 SchedTask::~SchedTask(void)
 {
+    __scheduler->dma_wait(DMA_WRITE);
+    free(__writebuf);
+
     if (__flag_renewTask == SCHED_TASK_RENEW) {
-	/**
-	 * __inListData と __outListData はタスク自身のものなので
-	 * 終わったら即 free する。
-	 */
 	free(__inListData);
         free(__outListData);
  
@@ -176,15 +182,6 @@
 	__taskGroup = NULL;
     }
 
-    // 書き込む領域が要らなければ無視
-    if (__outListData->size > 0 || __outListData->length > 0) {
-	__scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
-	// SchedTask::write(void) でも wait 掛けてるんだけど、
-        // 実際にはここに wait しないとちゃんと書き込まれてない感じがする
-	// wait はされてるはずなんだがなー
-	__scheduler->dma_wait(DMA_WRITE);
-    }
-
     (this->*ex_exec)();
 }
 
@@ -193,8 +190,11 @@
 {
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
-    __scheduler->dma_wait(DMA_WRITE);
-    free(__writebuf);
+
+    // 書き込む領域がなければ無視
+    if (__outListData->size > 0 || __outListData->length > 0) {
+	__scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
+    }
 
     /**
      * このタスクはSPE内で生成されたが、
--- a/TaskManager/Test/test_render/ChangeLog	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/ChangeLog	Fri Jan 30 14:55:04 2009 +0900
@@ -1,3 +1,41 @@
+2009-01-30  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* spe/DrawSpan.cpp (DrawSpan::drawDot1): add
+	span->length_x == 1 
+
+	(DrawSpan::drawDot2): add
+	Dot1 膓荀 Dot1  load Dot2  wait->吾莨若帥c
+	1障уゅ荀c
+	篁 Dot 2篏吾<鴻綽荀c
+	ф吾莨若帥茵
+
+	(DrawSpan::drawLine1): add
+	span->length_x > 1 
+	ゃ Load 帥若潟筝
+
+	1.  load
+	  1. z buf фゆ pixel  texture tile 
+	     load (с≪翫絎
+	     Load 茵)
+	  2. Line2 ф祉(т戎 tile с茯粋昭障
+
+	2. <load
+	  1. 吾莨若ゆtile 茯帥
+	     違障 linebuf < load  continue;
+	     load (ゃ障障吾莨若障) 贋荀
+	  2. Line2 с1. ц贋活膊祉
+	     tile с茯粋昭障
+
+	障c綽
+	篁脂 256x8512x8 с
+	膣pixel  texture pixel 筝膩
+	筝 Span ф紊 64 (512/8)  tile 違
+	筝 SPE  Tile  128 c
+	篁 Span 篋ゅ抗茵с
+	筝 Tile 莇潟鐚c
+	障篏吾違綽
+	冴障吾障
+
 2009-01-26  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
 	* spe/CreateSpan.cpp (CreateSpan::run): fix
--- a/TaskManager/Test/test_render/Makefile.def	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/Makefile.def	Fri Jan 30 14:55:04 2009 +0900
@@ -3,16 +3,16 @@
 # include/library path
 # ex: macosx
 #CERIUM = /Users/gongo/Source/Concurrency/Game_project/Cerium
-CERIUM = /Users/gongo/Source/hg/Cerium
+#CERIUM = /Users/gongo/Source/hg/Cerium
 
 # ex: linux/ps3
-#CERIUM = /home/gongo/Cerium
+CERIUM = /home/gongo/Cerium
 #CERIUM = /Users/tkaito/hg/Game/Cerium
 
 #CERIUM = ../../..
 
 CC      = g++
-CFLAGS  = -O0 -g -Wall# -DDEBUG
+CFLAGS  = -O9 -g -Wall# -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I.
 LIBS = -L$(CERIUM)/TaskManager
\ No newline at end of file
--- a/TaskManager/Test/test_render/Tapestry.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/Tapestry.h	Fri Jan 30 14:55:04 2009 +0900
@@ -117,7 +117,8 @@
 
     /**
      * TileList 
-     * tile 篏 clear 綽荀<
+     * //tile 篏 clear 綽荀<
+     * 
      */
     void clear(void) {
 	curIndex = 0;
--- a/TaskManager/Test/test_render/ball_bound.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/ball_bound.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -23,7 +23,7 @@
 {
     SceneGraphPtr ball;
 
-    sgroot->createFromXMLfile("xml_file/ball.xml");
+    sgroot->createFromXMLfile("xml_file/Ball.xml");
     ball = sgroot->createSceneGraph(Ball);
     ball->set_move_collision(ball_move, ball_collision);
     ball->xyz[0] = screen_w/2;
--- a/TaskManager/Test/test_render/polygon_pack.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/polygon_pack.h	Fri Jan 30 14:55:04 2009 +0900
@@ -13,22 +13,21 @@
     float z;
     float tex_x;
     float tex_y;
-} VertexPack, *VertexPackPtr; // 20 byte
+} VertexPack, *VertexPackPtr; // 20
 
+typedef struct TriTexInfo {
+    uint32 *addr;
+    int width;
+    int height;
+    int scale_max;
+} TriangleTexInfo, *TriangleTexInfoPtr; // 16
 
 typedef struct TrianglePack {
-    struct {
-	uint32 *addr;
-	int width;
-	int height;
-	int scale_max;
-    } tex_info;
-
+    TriTexInfo tex_info;
     VertexPack ver1;
     VertexPack ver2;
     VertexPack ver3;
-
-} TrianglePack, *TrianglePackPtr; //4*4 + 20*3 = 76
+} TrianglePack, *TrianglePackPtr;
 
 
 typedef struct PolygonPack {
--- a/TaskManager/Test/test_render/spe/CreateSpan.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/spe/CreateSpan.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -192,8 +192,7 @@
 void
 CreateSpan::half_triangle(SpanPackPtr *spackList,
 			  int charge_y_top, int charge_y_end,
-			  uint32 *tex_addr, int tex_width, int tex_height, 
-			  int tex_scale_max,
+			  TriangleTexInfoPtr tex_info,
 			  VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10,
 			  int length_y, float tex_y_len)
 {
@@ -255,6 +254,7 @@
 
     for (int i = k; i < (int)div_y+1; i++) {
 	y = (int)vMin->y + i*l;
+#if 1
 
 	/**
 	 * 綵 y 膀峨
@@ -383,19 +383,22 @@
 	 */
 	int scale = getScale(span->length_x, length_y,
 			     (int)(span->tex_width*tex_x_len),
-			     (int)(span->tex_height*tex_y_len), tex_scale_max);
-
-	//scale = (scale > tex_scale_max) ? tex_scale_max : 8;
+			     (int)(span->tex_height*tex_y_len),
+			     tex_info->scale_max);
 	
-	uint32 *tapestry = getTapestry(tex_width, tex_height, scale, tex_addr);
+	uint32 *tapestry = getTapestry(tex_info->width,
+				       tex_info->height, scale,
+				       tex_info->addr);
+	
+	span->tex_addr   = tapestry;
+	span->tex_width  = tex_info->width/scale;
+	span->tex_height = tex_info->height/scale;
+    }
+#else
 
-	//printf("%p = getTapestry(%d, %d, %d, %p)\n", tapestry,
-	//tex_width, tex_height, scale, tex_addr);
 
-	span->tex_addr   = tapestry;
-	span->tex_width  = tex_width/scale;
-	span->tex_height = tex_height/scale;
-    }
+#endif
+
 }
 
 
@@ -435,40 +438,10 @@
 
 	for (int i = 0; i < pp->info.size; i++) {
 	    triPack = &pp->tri[i];
-	    
-#if 0
+
+	    TriangleTexInfoPtr tri_tex_info = &triPack->tex_info;
+
 	    make_vertex(triPack, &vMin, &vMid, &vMax);
-#else
-	    if (triPack->ver1.y <= triPack->ver2.y) {
-		if (triPack->ver2.y <= triPack->ver3.y) {
-		    vMin = &triPack->ver1;
-		    vMid = &triPack->ver2;
-		    vMax = &triPack->ver3;
-		} else if (triPack->ver3.y <= triPack->ver1.y) {
-		    vMin = &triPack->ver3;
-		    vMid = &triPack->ver1;
-		    vMax = &triPack->ver2;
-		} else {
-		    vMin = &triPack->ver1;
-		    vMid = &triPack->ver3;
-		    vMax = &triPack->ver2;
-		}
-	    } else {
-		if (triPack->ver1.y <= triPack->ver3.y) {
-		    vMin = &triPack->ver2;
-		    vMid = &triPack->ver1;
-		    vMax = &triPack->ver3;
-		} else if (triPack->ver3.y <= triPack->ver2.y) {
-		    vMin = &triPack->ver3;
-		    vMid = &triPack->ver2;
-		    vMax = &triPack->ver1;
-		} else {
-		    vMin = &triPack->ver2;
-		    vMid = &triPack->ver3;
-		    vMax = &triPack->ver1;
-		}
-	    }
-#endif
 	    make_vMid10(vMid10, vMin, vMid, vMax);
 
 	    /**
@@ -492,23 +465,10 @@
 	     * 篋ゃ Triangle 
 	     */
 	    half_triangle(spackList, charge_y_top, charge_y_end,
-			  triPack->tex_info.addr,
-			  triPack->tex_info.width,
-			  triPack->tex_info.height,
-			  triPack->tex_info.scale_max, vMin, vMid, vMid10,
+			  tri_tex_info, vMin, vMid, vMid10,
 			  (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y);
 	    half_triangle(spackList, charge_y_top, charge_y_end,
-#if 0
-			  pp->tri[0].tex_info.addr,
-			  pp->tri[0].tex_info.width,
-			  pp->tri[0].tex_info.height,
-			  pp->tri[0].tex_info.scale_max, vMax, vMid, vMid10,
-#else
-			  triPack->tex_info.addr,
-			  triPack->tex_info.width,
-			  triPack->tex_info.height,
-			  triPack->tex_info.scale_max, vMax, vMid, vMid10,
-#endif
+			  tri_tex_info, vMax, vMid, vMid10,
 			  (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y);
 	}
 
--- a/TaskManager/Test/test_render/spe/CreateSpan.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/spe/CreateSpan.h	Fri Jan 30 14:55:04 2009 +0900
@@ -20,15 +20,9 @@
     int run(void *rbuf, void *wbuf);
     void half_triangle(SpanPackPtr *spackList,
 		       int charge_y_top, int charge_y_end,
-		       uint32 *tex_addr, int tex_width, int tex_height,
-		       int tex_scale_max,
+		       TriangleTexInfoPtr tex_info,
 		       VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1,
 		       int length_y, float tex_y_len);
-#if 0
-    void setTileInfoList(SpanPtr span);
-    void setTileInfo(TileInfoPtr tile, int xpos, int ypos,
-		     int tex_width, uint32* tex_addr_top);
-#endif
 };
 
 #endif
--- a/TaskManager/Test/test_render/spe/DrawSpan.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -7,11 +7,12 @@
 #include "viewer_types.h"
 #include "Func.h"
 
-#define SPAN_PACK_LOAD 0
-#define TEX_LOAD 1
-#define FB_STORE 2
+SchedDefineTask(DrawSpan);
 
-SchedDefineTask(DrawSpan);
+#define TEX_LOAD1      0
+#define TEX_LOAD2      1
+#define SPAN_PACK_LOAD 2
+#define FB_STORE       3
 
 DrawSpan::~DrawSpan(void)
 {
@@ -140,8 +141,8 @@
 	buf[i] = def;
     }
 #else 
-    vector float init = {0.0f, 0.0f, 0.0f, 0.0f};
-    vector float defi = {def, def, def, def};
+    vector float init = spu_splats(0.0f);
+    vector float defi = spu_splats(def);
 
     for (int i = 0; i < width*height; i += 4) {
 	vector float *out = (vector float *)&buf[i];
@@ -167,10 +168,14 @@
 }
 
 void
-DrawSpan::set_rgb(uint32 *addr)
+DrawSpan::set_rgb(uint32 *addr, int tag)
 {
     TilePtr tile;
 
+    if (isAvailableTile(addr)) {
+	return;
+    }
+
     tile = tileList->nextTile();
     /**
      * FIFO с罧c医
@@ -179,23 +184,37 @@
     
     tile->texture_addr = addr;
     
-    hash->put(tile->texture_addr, tile);
-    
+    int index = hash->put(tile->texture_addr, tile);
     smanager->dma_load(tile->pixel, (uint32)addr,
-		       sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD);
+		       sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag);
 }
 
+/**
+ * 
+ */
 void
-DrawSpan::set_rgbs(uint32 *addr, uint32 *max_addr)
+DrawSpan::set_rgbs(uint32 *cur_addr, uint32 *max_addr, int wait_tag)
 {
-    uint32 start = (uint32)addr;
-    uint32 end = (uint32)max_addr;
-    int length = (int)end-start;
-    int diff = sizeof(int)*TEXTURE_BLOCK_SIZE;
-    int max_tile = 16;
+    uint32 curp   = (uint32)cur_addr;
+    uint32 maxp   = (uint32)max_addr;
+    uint32 startp = curp;
+    uint32 diff   = sizeof(int)*TEXTURE_BLOCK_SIZE;
+    int length = (int)maxp-(int)curp;
+
+    int cmp = (length < 0);
 
-    for (int i = 0, j = 0; i <= length && j < max_tile; i += diff, j++) {
-	set_rgb((uint32*)(start + i));
+#if 1
+    length += cmp*(-1)*length*2;
+    startp = cmp*maxp + !cmp*curp;
+#else
+    if (length < 0) {
+	length = -length;
+	startp = maxp;
+    }
+#endif
+
+    for (int i = 0; i <= length; i += diff) {
+	set_rgb((uint32*)(startp + i), wait_tag);
     }
 }
 
@@ -269,14 +288,35 @@
 }
 
 /**
+ * zRow  Linebuf 贋違
+ *
+ * @param zpos     贋違 pixel Z綺ф
+ * @param rangex   帥鴻脂 x 激
+ * @param x        pixel 脂с x 綺ф
+ * @param y         y 綺ф
+ * @param tex_x    pixel 篏睡鴻cTile (8x8) с x 綺ф
+ * @param tex_y      y 綺ф
+ * @param tex_addr 鴻c≪(MainMemory)
+ */
+void
+DrawSpan::updateBuffer(float zpos, int rangex, int x, int y,
+		       int tex_x, int tex_y, uint32 *tex_addr)
+{
+    int rgb = get_rgb(tex_x, tex_y, tex_addr);
+		    
+    zRow[x + (rangex*y)] = zpos;
+    linebuf[x + (rangex*y)] = rgb;
+}
+
+/**
  * 激 1  Span  (荀 1 pixel)
  *
  * @param span Span
  * @param startx 脂紮膀
  * @param endx 紫篋膀
  */
-void
-DrawSpan::drawDot(SpanPtr span, int startx, int endx)
+int
+DrawSpan::drawDot1(SpanPtr span, int startx, int endx, int wait_tag)
 {
     int rangex = endx - startx + 1;
 
@@ -303,7 +343,7 @@
     uint32 *tex_addr;
 
     if (span->x < startx || endx < span->x) {
-	return;
+	return -1;
     }
 
     tex_xpos = (int)((span->tex_width-1) * tex);
@@ -316,19 +356,26 @@
 	tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
 
 	if (!isAvailableTile(tex_addr)) {
-	    set_rgb(tex_addr);
-	    smanager->dma_wait(TEX_LOAD);
+	    set_rgb(tex_addr, wait_tag);
+	    smanager->dma_wait(wait_tag);
+	    //return startx;
 	}
 
-	int rgb = get_rgb(tex_localx, tex_localy, tex_addr);
-		    
-	zRow[localx + (rangex*localy)] = zpos;
-	linebuf[localx + (rangex*localy)] = rgb;
+	updateBuffer(zpos, rangex, localx, localy,
+		     tex_localx, tex_localy, tex_addr);
     }
+
+    return -1;
 }
 
 void
-DrawSpan::drawLine(SpanPtr span, int startx, int endx)
+DrawSpan::drawDot2(SpanPtr span, int startx, int end, int js, int wait_tag)
+{
+    //printf("%d\n", js);
+}
+
+int
+DrawSpan::drawLine1(SpanPtr span, int startx, int endx, int wait_tag)
 {
     int x = span->x;
     int rangex = endx - startx + 1;
@@ -355,6 +402,97 @@
     // Tile с綺ф
     int localx, localy = getLocalY(span->y-1);
 
+    int ret = je+1;
+
+    //for (int j = js; j <= je; j++) {
+    for (int j = je; j >= js; j--) {
+	float tex_x, tex_y, tex_z;
+
+	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_xpos, tex_ypos) Tile (筝喝)с綺ф
+	    // ≪(MainMemory)
+	    uint32 *tex_addr;
+	    int tex_localx;
+	    int tex_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;
+
+	    set_rgb(tex_addr, wait_tag);
+	    ret = j;
+	    continue;
+
+	    if (!isAvailableTile(tex_addr)) {
+#if 1
+		tex_x = tex1*(x_len-1-js)/(x_len-1) + tex2*js/(x_len-1);
+		if (tex_x > 1) tex_x = 1;
+		if (tex_x < 0) tex_x = 0;
+		tex_xpos = (int)((span->tex_width-1) * tex_x);
+
+		uint32 *max_addr = getTile(tex_xpos, tex_ypos,
+					   span->tex_width, span->tex_addr);
+
+		set_rgbs(tex_addr, max_addr, wait_tag);
+		return js;
+#else
+		set_rgb(tex_addr, wait_tag);
+		ret = j;
+		//j -= 3;
+		continue;
+#endif
+	    }
+
+	    updateBuffer(tex_z, rangex, localx, localy,
+			 tex_localx, tex_localy, tex_addr);
+	}
+    }
+
+    return ret;
+}
+
+void
+DrawSpan::drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag)
+{
+    int x = span->x;
+    int rangex = endx - startx + 1;
+    int x_len = span->length_x;
+
+    //int js = startx;
+    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;
@@ -363,7 +501,8 @@
 
     float tex_x, tex_y, tex_z;
 
-#if 0
+    smanager->dma_wait(wait_tag);
+
     for (int j = js; j <= je; j++) {
 	localx = getLocalX(x-1+j);
 
@@ -377,134 +516,17 @@
 	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;
+	    updateBuffer(tex_z, rangex, localx, localy,
+			 tex_localx, tex_localy, tex_addr);
 	}
-    }
-#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
@@ -515,15 +537,22 @@
     SpanPackPtr free_spack = next_spack; // next_spack  free() 
     Span *span;
 
-    void (DrawSpan::*drawFunc[2])(SpanPtr, int, int) = {
-	&DrawSpan::drawDot, &DrawSpan::drawLine
+    Span nop_span;
+    nop_span.length_x = 1;
+
+    int (DrawSpan::*drawFunc1[2])(SpanPtr, int, int, int) = {
+	&DrawSpan::drawDot1, &DrawSpan::drawLine1
+    };
+
+    void (DrawSpan::*drawFunc2[2])(SpanPtr, int, int, int, int) = {
+	&DrawSpan::drawDot2, &DrawSpan::drawLine2
     };
 
     uint32 display   = smanager->get_param(0);
     int screen_width = smanager->get_param(1);
     int rangex_start = smanager->get_param(2);
     int rangex_end   = smanager->get_param(3); 
-
+    
     // 帥鴻綵 x 膀
     int rangex = rangex_end - rangex_start + 1;
 
@@ -537,6 +566,10 @@
     linebuf = linebuf_init(rangex, rangey, 0x00ffffff);
 
     doneWrite = 0;
+
+    int tl_tag[2] = {TEX_LOAD1, TEX_LOAD2};
+    int tl_tag_flg1 = 0;
+    int tl_tag_flg2 = 1;
     
     do {
 	/**
@@ -551,13 +584,36 @@
 	    next_spack = NULL;
 	}
 
+	SpanPtr resume_span = &nop_span;
+	int resume_span_x = 0;
+
 	for (int t = 0; t < spack->info.size; t++) {	  
+	    SpanPtr next_span;
+	    int next_span_x;
+
 	    span = &spack->span[t];
 
-	    int x_len = span->length_x;
+	    next_span_x
+		= (this->*drawFunc1[(span->length_x != 1)])(
+		    span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
+	    next_span = span;
+
+	    (this->*drawFunc2[(resume_span->length_x != 1)])(
+		resume_span, rangex_start, rangex_end, resume_span_x,
+		tl_tag[tl_tag_flg2]);
 
-	    (this->*drawFunc[(x_len != 1)])(span, rangex_start, rangex_end);
+	    resume_span = next_span;
+	    resume_span_x = next_span_x;
+	    
+	    //smanager->dma_wait(tl_tag[tl_tag_flg1]);
+
+	    tl_tag_flg1 ^= 1;
+	    tl_tag_flg2 ^= 1;
 	}
+	
+	(this->*drawFunc2[(resume_span->length_x != 1)])(
+	    resume_span, rangex_start, rangex_end, resume_span_x,
+	    tl_tag[tl_tag_flg1]);
 
 	smanager->dma_wait(SPAN_PACK_LOAD);
 
@@ -573,12 +629,12 @@
     //free(linebuf);
     free(zRow);
 
-FINISH:
+//FINISH:
     /**
      * goto FINISH;  reboot 
      * linebuf, zRow  free() 
      */
+
     free(free_spack);
-
     return 0;
 }
--- a/TaskManager/Test/test_render/spe/DrawSpan.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.h	Fri Jan 30 14:55:04 2009 +0900
@@ -33,18 +33,24 @@
 
     int* linebuf_init(int width, int height, int rgb);
     float* zRow_init(int width, int height);
-    void set_rgb(uint32 *addr);
-    void set_rgbs(uint32 *addr, uint32 *max_addr);
+    void set_rgb(uint32 *addr, int wait_tag);
+    void set_rgbs(uint32 *addr, uint32 *max_addr, int wait_tag);
     uint32 get_rgb(int tx, int ty, uint32 *addr);
     TilePtr isAvailableTile(uint32 *addr);
     uint32* getTile(int tx, int ty, int tw, uint32 *tex_addr_top);
     int getTexBlock(int tx, int ty, int twidth);
-    void writebuffer(unsigned int display, int width, int height, int screen_width);
+    void writebuffer(unsigned int display, int width, int height,
+		     int screen_width);
+    void updateBuffer(float zpos, int rangex, int x, int y,
+		      int tex_x, int tex_y, uint32 *tex_addr);
+
 
     void reboot(SpanPackPtr spack, int cur_span_x);
 
-    void drawDot(SpanPtr span, int startx, int endx);
-    void drawLine(SpanPtr span, int startx, int endx);
+    int drawDot1(SpanPtr span, int startx, int endx, int wait_tag);
+    void drawDot2(SpanPtr span, int startx, int endx, int js, int wait_tag);
+    int drawLine1(SpanPtr span, int startx, int endx, int wait_tag);
+    void drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag);
 };
 
 typedef struct {
--- a/TaskManager/Test/test_render/spe/DrawSpanRenew.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpanRenew.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -139,8 +139,8 @@
 		    tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
 
 		    if (!isAvailableTile(tex_addr)) {
-			set_rgb(tex_addr);
-			smanager->dma_wait(TEX_LOAD);
+			set_rgb(tex_addr, 0);
+			smanager->dma_wait(0);
 		    }
 		    
 		    rgb = get_rgb(tex_localx, tex_localy, tex_addr);
@@ -190,7 +190,7 @@
 			    reboot(spack, j);
 			    goto FINISH;
 #else
-			    set_rgb(tex_addr);
+			    set_rgb(tex_addr, TEX_LOAD);
 			    smanager->dma_wait(TEX_LOAD);
 #endif
 			}
--- a/TaskManager/Test/test_render/spe/TileHash.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/spe/TileHash.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -40,7 +40,7 @@
     for (int i = 0; i < hashSize/2; i++) {
 	int index = (hashval + i*i)%hashSize;
 
-	if (table[index] == 0) {
+	if (table[index] == 0) { // 腥冴 table ャ
 	    table[index] = data;
 	    return index;
 	}
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/task/CreateSpan.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -192,8 +192,7 @@
 void
 CreateSpan::half_triangle(SpanPackPtr *spackList,
 			  int charge_y_top, int charge_y_end,
-			  uint32 *tex_addr, int tex_width, int tex_height, 
-			  int tex_scale_max,
+			  TriangleTexInfoPtr tex_info,
 			  VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10,
 			  int length_y, float tex_y_len)
 {
@@ -255,6 +254,7 @@
 
     for (int i = k; i < (int)div_y+1; i++) {
 	y = (int)vMin->y + i*l;
+#if 1
 
 	/**
 	 * 綵 y 膀峨
@@ -383,19 +383,22 @@
 	 */
 	int scale = getScale(span->length_x, length_y,
 			     (int)(span->tex_width*tex_x_len),
-			     (int)(span->tex_height*tex_y_len), tex_scale_max);
-
-	//scale = (scale > tex_scale_max) ? tex_scale_max : 8;
+			     (int)(span->tex_height*tex_y_len),
+			     tex_info->scale_max);
 	
-	uint32 *tapestry = getTapestry(tex_width, tex_height, scale, tex_addr);
+	uint32 *tapestry = getTapestry(tex_info->width,
+				       tex_info->height, scale,
+				       tex_info->addr);
+	
+	span->tex_addr   = tapestry;
+	span->tex_width  = tex_info->width/scale;
+	span->tex_height = tex_info->height/scale;
+    }
+#else
 
-	//printf("%p = getTapestry(%d, %d, %d, %p)\n", tapestry,
-	//tex_width, tex_height, scale, tex_addr);
 
-	span->tex_addr   = tapestry;
-	span->tex_width  = tex_width/scale;
-	span->tex_height = tex_height/scale;
-    }
+#endif
+
 }
 
 
@@ -435,40 +438,10 @@
 
 	for (int i = 0; i < pp->info.size; i++) {
 	    triPack = &pp->tri[i];
-	    
-#if 0
+
+	    TriangleTexInfoPtr tri_tex_info = &triPack->tex_info;
+
 	    make_vertex(triPack, &vMin, &vMid, &vMax);
-#else
-	    if (triPack->ver1.y <= triPack->ver2.y) {
-		if (triPack->ver2.y <= triPack->ver3.y) {
-		    vMin = &triPack->ver1;
-		    vMid = &triPack->ver2;
-		    vMax = &triPack->ver3;
-		} else if (triPack->ver3.y <= triPack->ver1.y) {
-		    vMin = &triPack->ver3;
-		    vMid = &triPack->ver1;
-		    vMax = &triPack->ver2;
-		} else {
-		    vMin = &triPack->ver1;
-		    vMid = &triPack->ver3;
-		    vMax = &triPack->ver2;
-		}
-	    } else {
-		if (triPack->ver1.y <= triPack->ver3.y) {
-		    vMin = &triPack->ver2;
-		    vMid = &triPack->ver1;
-		    vMax = &triPack->ver3;
-		} else if (triPack->ver3.y <= triPack->ver2.y) {
-		    vMin = &triPack->ver3;
-		    vMid = &triPack->ver2;
-		    vMax = &triPack->ver1;
-		} else {
-		    vMin = &triPack->ver2;
-		    vMid = &triPack->ver3;
-		    vMax = &triPack->ver1;
-		}
-	    }
-#endif
 	    make_vMid10(vMid10, vMin, vMid, vMax);
 
 	    /**
@@ -492,16 +465,10 @@
 	     * 篋ゃ Triangle 
 	     */
 	    half_triangle(spackList, charge_y_top, charge_y_end,
-			  triPack->tex_info.addr,
-			  triPack->tex_info.width,
-			  triPack->tex_info.height,
-			  triPack->tex_info.scale_max, vMin, vMid, vMid10,
+			  tri_tex_info, vMin, vMid, vMid10,
 			  (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y);
 	    half_triangle(spackList, charge_y_top, charge_y_end,
-			  triPack->tex_info.addr,
-			  triPack->tex_info.width,
-			  triPack->tex_info.height,
-			  triPack->tex_info.scale_max, vMax, vMid, vMid10,
+			  tri_tex_info, vMax, vMid, vMid10,
 			  (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y);
 	}
 
--- a/TaskManager/Test/test_render/task/CreateSpan.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/task/CreateSpan.h	Fri Jan 30 14:55:04 2009 +0900
@@ -20,15 +20,9 @@
     int run(void *rbuf, void *wbuf);
     void half_triangle(SpanPackPtr *spackList,
 		       int charge_y_top, int charge_y_end,
-		       uint32 *tex_addr, int tex_width, int tex_height,
-		       int tex_scale_max,
+		       TriangleTexInfoPtr tex_info,
 		       VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1,
 		       int length_y, float tex_y_len);
-#if 0
-    void setTileInfoList(SpanPtr span);
-    void setTileInfo(TileInfoPtr tile, int xpos, int ypos,
-		     int tex_width, uint32* tex_addr_top);
-#endif
 };
 
 #endif
--- a/TaskManager/Test/test_render/task/DrawSpan.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/task/DrawSpan.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -1,16 +1,18 @@
 #include <stdlib.h>
 #include <string.h>
+#include <spu_intrinsics.h>
 #include "DrawSpan.h"
 #include "polygon_pack.h"
 #include "texture.h"
 #include "viewer_types.h"
 #include "Func.h"
 
-#define SPAN_PACK_LOAD 0
-#define TEX_LOAD 1
-#define FB_STORE 2
+SchedDefineTask(DrawSpan);
 
-SchedDefineTask(DrawSpan);
+#define TEX_LOAD1      0
+#define TEX_LOAD2      1
+#define SPAN_PACK_LOAD 2
+#define FB_STORE       3
 
 DrawSpan::~DrawSpan(void)
 {
@@ -18,6 +20,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);
+}
+
+
 /**
  * 鴻cTEXTURE_SPLIT_PIXEL^2 蚊
  *
@@ -109,9 +136,20 @@
     float *buf = (float*)smanager->allocate(sizeof(float)*width*height);
     float def = 65535.0f;
 
+#if 0
     for (int i = 0; i < width*height; i++) {
 	buf[i] = def;
     }
+#else 
+    vector float init = spu_splats(0.0f);
+    vector float defi = spu_splats(def);
+
+    for (int i = 0; i < width*height; i += 4) {
+	vector float *out = (vector float *)&buf[i];
+
+	*out = spu_add(init, defi);
+    }
+#endif
 
     return buf;
 }
@@ -130,10 +168,14 @@
 }
 
 void
-DrawSpan::set_rgb(uint32 *addr)
+DrawSpan::set_rgb(uint32 *addr, int tag)
 {
     TilePtr tile;
 
+    if (isAvailableTile(addr)) {
+	return;
+    }
+
     tile = tileList->nextTile();
     /**
      * FIFO с罧c医
@@ -142,23 +184,37 @@
     
     tile->texture_addr = addr;
     
-    hash->put(tile->texture_addr, tile);
-    
+    int index = hash->put(tile->texture_addr, tile);
     smanager->dma_load(tile->pixel, (uint32)addr,
-		       sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD);
+		       sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag);
 }
 
+/**
+ * 
+ */
 void
-DrawSpan::set_rgbs(uint32 *addr, uint32 *max_addr)
+DrawSpan::set_rgbs(uint32 *cur_addr, uint32 *max_addr, int wait_tag)
 {
-    uint32 start = (uint32)addr;
-    uint32 end = (uint32)max_addr;
-    int length = (int)end-start;
-    int diff = sizeof(int)*TEXTURE_BLOCK_SIZE;
-    int max_tile = 16;
+    uint32 curp   = (uint32)cur_addr;
+    uint32 maxp   = (uint32)max_addr;
+    uint32 startp = curp;
+    uint32 diff   = sizeof(int)*TEXTURE_BLOCK_SIZE;
+    int length = (int)maxp-(int)curp;
+
+    int cmp = (length < 0);
 
-    for (int i = 0, j = 0; i <= length && j < max_tile; i += diff, j++) {
-	set_rgb((uint32*)(start + i));
+#if 1
+    length += cmp*(-1)*length*2;
+    startp = cmp*maxp + !cmp*curp;
+#else
+    if (length < 0) {
+	length = -length;
+	startp = maxp;
+    }
+#endif
+
+    for (int i = 0; i <= length; i += diff) {
+	set_rgb((uint32*)(startp + i), wait_tag);
     }
 }
 
@@ -231,6 +287,248 @@
     doneWrite = 1;
 }
 
+/**
+ * zRow  Linebuf 贋違
+ *
+ * @param zpos     贋違 pixel Z綺ф
+ * @param rangex   帥鴻脂 x 激
+ * @param x        pixel 脂с x 綺ф
+ * @param y         y 綺ф
+ * @param tex_x    pixel 篏睡鴻cTile (8x8) с x 綺ф
+ * @param tex_y      y 綺ф
+ * @param tex_addr 鴻c≪(MainMemory)
+ */
+void
+DrawSpan::updateBuffer(float zpos, int rangex, int x, int y,
+		       int tex_x, int tex_y, uint32 *tex_addr)
+{
+    int rgb = get_rgb(tex_x, tex_y, tex_addr);
+		    
+    zRow[x + (rangex*y)] = zpos;
+    linebuf[x + (rangex*y)] = rgb;
+}
+
+/**
+ * 激 1  Span  (荀 1 pixel)
+ *
+ * @param span Span
+ * @param startx 脂紮膀
+ * @param endx 紫篋膀
+ */
+int
+DrawSpan::drawDot1(SpanPtr span, int startx, int endx, int wait_tag)
+{
+    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 -1;
+    }
+
+    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, wait_tag);
+	    smanager->dma_wait(wait_tag);
+	    //return startx;
+	}
+
+	updateBuffer(zpos, rangex, localx, localy,
+		     tex_localx, tex_localy, tex_addr);
+    }
+
+    return -1;
+}
+
+void
+DrawSpan::drawDot2(SpanPtr span, int startx, int end, int js, int wait_tag)
+{
+    //printf("%d\n", js);
+}
+
+int
+DrawSpan::drawLine1(SpanPtr span, int startx, int endx, int wait_tag)
+{
+    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);
+
+    int ret = je+1;
+
+    //for (int j = js; j <= je; j++) {
+    for (int j = je; j >= js; j--) {
+	float tex_x, tex_y, tex_z;
+
+	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_xpos, tex_ypos) Tile (筝喝)с綺ф
+	    // ≪(MainMemory)
+	    uint32 *tex_addr;
+	    int tex_localx;
+	    int tex_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;
+
+	    set_rgb(tex_addr, wait_tag);
+	    ret = j;
+	    continue;
+
+	    if (!isAvailableTile(tex_addr)) {
+#if 1
+		tex_x = tex1*(x_len-1-js)/(x_len-1) + tex2*js/(x_len-1);
+		if (tex_x > 1) tex_x = 1;
+		if (tex_x < 0) tex_x = 0;
+		tex_xpos = (int)((span->tex_width-1) * tex_x);
+
+		uint32 *max_addr = getTile(tex_xpos, tex_ypos,
+					   span->tex_width, span->tex_addr);
+
+		set_rgbs(tex_addr, max_addr, wait_tag);
+		return js;
+#else
+		set_rgb(tex_addr, wait_tag);
+		ret = j;
+		//j -= 3;
+		continue;
+#endif
+	    }
+
+	    updateBuffer(tex_z, rangex, localx, localy,
+			 tex_localx, tex_localy, tex_addr);
+	}
+    }
+
+    return ret;
+}
+
+void
+DrawSpan::drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag)
+{
+    int x = span->x;
+    int rangex = endx - startx + 1;
+    int x_len = span->length_x;
+
+    //int js = startx;
+    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;
+
+    smanager->dma_wait(wait_tag);
+
+    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;
+
+	    updateBuffer(tex_z, rangex, localx, localy,
+			 tex_localx, tex_localy, tex_addr);
+	}
+    }    
+}
+
 int
 DrawSpan::run(void *rbuf, void *wbuf)
 {
@@ -239,25 +537,40 @@
     SpanPackPtr free_spack = next_spack; // next_spack  free() 
     Span *span;
 
+    Span nop_span;
+    nop_span.length_x = 1;
+
+    int (DrawSpan::*drawFunc1[2])(SpanPtr, int, int, int) = {
+	&DrawSpan::drawDot1, &DrawSpan::drawLine1
+    };
+
+    void (DrawSpan::*drawFunc2[2])(SpanPtr, int, int, int, int) = {
+	&DrawSpan::drawDot2, &DrawSpan::drawLine2
+    };
+
     uint32 display   = smanager->get_param(0);
     int screen_width = smanager->get_param(1);
     int rangex_start = smanager->get_param(2);
     int rangex_end   = smanager->get_param(3); 
-
+    
     // 帥鴻綵 x 膀
     int rangex = rangex_end - rangex_start + 1;
 
     // y 膀
     int rangey = smanager->get_param(4);
-    
+
     hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH);
     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 tl_tag[2] = {TEX_LOAD1, TEX_LOAD2};
+    int tl_tag_flg1 = 0;
+    int tl_tag_flg2 = 1;
+    
     do {
 	/**
 	 * SpanPack->next 絖翫
@@ -271,116 +584,36 @@
 	    next_spack = NULL;
 	}
 
+	SpanPtr resume_span = &nop_span;
+	int resume_span_x = 0;
+
 	for (int t = 0; t < spack->info.size; t++) {	  
+	    SpanPtr next_span;
+	    int next_span_x;
+
 	    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 罸
-	     * 鴻c綺ф
-	     */
-	    int tex_xpos;
-	    int tex_ypos;
-
-	    /**
-	     * (tex_xpos, tex_ypos) (筝喝)с綺ф
-	     * ≪(MainMemory)
-	     */
-	    int tex_localx;
-	    int tex_localy;
-	    uint32 *tex_addr;
+	    next_span_x
+		= (this->*drawFunc1[(span->length_x != 1)])(
+		    span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
+	    next_span = span;
 
-	    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;
-		}
-
-		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)) {
-			set_rgb(tex_addr);
-			smanager->dma_wait(TEX_LOAD);
-		    }
-
-		    rgb = get_rgb(tex_localx, tex_localy, tex_addr);
+	    (this->*drawFunc2[(resume_span->length_x != 1)])(
+		resume_span, rangex_start, rangex_end, resume_span_x,
+		tl_tag[tl_tag_flg2]);
 
-		    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++) {
-		    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;
+	    resume_span = next_span;
+	    resume_span_x = next_span_x;
+	    
+	    //smanager->dma_wait(tl_tag[tl_tag_flg1]);
 
-			/**
-			 * Tile <翫筝帥鴻т賢
-			 * Tile 若帥鴻莎違緇莎桁
-			 */
-			if (!isAvailableTile(tex_addr)) {
-			    spack->info.start = t;
-#if 1
-			    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
-			    set_rgb(tex_addr);
-			    smanager->dma_wait(TEX_LOAD);
-#endif
-			}
-			
-			rgb = get_rgb(tex_localx, tex_localy, tex_addr);
-		    
-			zRow[localx + (rangex*localy)] = tex_z;
-			linebuf[localx + (rangex*localy)] = rgb;
-		    }
-		}
-	    }
+	    tl_tag_flg1 ^= 1;
+	    tl_tag_flg2 ^= 1;
 	}
+	
+	(this->*drawFunc2[(resume_span->length_x != 1)])(
+	    resume_span, rangex_start, rangex_end, resume_span_x,
+	    tl_tag[tl_tag_flg1]);
 
 	smanager->dma_wait(SPAN_PACK_LOAD);
 
@@ -396,12 +629,12 @@
     //free(linebuf);
     free(zRow);
 
-FINISH:
+//FINISH:
     /**
      * goto FINISH;  reboot 
      * linebuf, zRow  free() 
      */
+
     free(free_spack);
-
     return 0;
 }
--- a/TaskManager/Test/test_render/task/DrawSpan.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/task/DrawSpan.h	Fri Jan 30 14:55:04 2009 +0900
@@ -33,15 +33,24 @@
 
     int* linebuf_init(int width, int height, int rgb);
     float* zRow_init(int width, int height);
-    void set_rgb(uint32 *addr);
-    void set_rgbs(uint32 *addr, uint32 *max_addr);
+    void set_rgb(uint32 *addr, int wait_tag);
+    void set_rgbs(uint32 *addr, uint32 *max_addr, int wait_tag);
     uint32 get_rgb(int tx, int ty, uint32 *addr);
     TilePtr isAvailableTile(uint32 *addr);
     uint32* getTile(int tx, int ty, int tw, uint32 *tex_addr_top);
     int getTexBlock(int tx, int ty, int twidth);
-    void writebuffer(unsigned int display, int width, int height, int screen_width);
+    void writebuffer(unsigned int display, int width, int height,
+		     int screen_width);
+    void updateBuffer(float zpos, int rangex, int x, int y,
+		      int tex_x, int tex_y, uint32 *tex_addr);
+
 
     void reboot(SpanPackPtr spack, int cur_span_x);
+
+    int drawDot1(SpanPtr span, int startx, int endx, int wait_tag);
+    void drawDot2(SpanPtr span, int startx, int endx, int js, int wait_tag);
+    int drawLine1(SpanPtr span, int startx, int endx, int wait_tag);
+    void drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag);
 };
 
 typedef struct {
--- a/TaskManager/Test/test_render/task/DrawSpanRenew.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/task/DrawSpanRenew.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -1,5 +1,6 @@
 #include <stdlib.h>
 #include <string.h>
+#include <spu_mfcio.h>
 #include "DrawSpanRenew.h"
 #include "polygon_pack.h"
 #include "SpanPack.h"
@@ -29,6 +30,8 @@
     renew_task->add_param((int)linebuf);
     renew_task->add_param((int)zRow);
 
+    //fprintf(stderr, "[%p] start %u\n", curr, spu_readch(SPU_RdDec));
+
     /**
      * 再起動したタスクを待つ
      */ 
@@ -136,8 +139,8 @@
 		    tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
 
 		    if (!isAvailableTile(tex_addr)) {
-			set_rgb(tex_addr);
-			smanager->dma_wait(TEX_LOAD);
+			set_rgb(tex_addr, 0);
+			smanager->dma_wait(0);
 		    }
 		    
 		    rgb = get_rgb(tex_localx, tex_localy, tex_addr);
@@ -187,7 +190,7 @@
 			    reboot(spack, j);
 			    goto FINISH;
 #else
-			    set_rgb(tex_addr);
+			    set_rgb(tex_addr, TEX_LOAD);
 			    smanager->dma_wait(TEX_LOAD);
 #endif
 			}
--- a/TaskManager/Test/test_render/task/TileHash.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/task/TileHash.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -40,7 +40,7 @@
     for (int i = 0; i < hashSize/2; i++) {
 	int index = (hashval + i*i)%hashSize;
 
-	if (table[index] == 0) {
+	if (table[index] == 0) { // 腥冴 table ャ
 	    table[index] = data;
 	    return index;
 	}
--- a/TaskManager/Test/test_render/viewer.cpp	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/viewer.cpp	Fri Jan 30 14:55:04 2009 +0900
@@ -26,6 +26,7 @@
 PolygonPack *ppack;
 SpanPackPtr spackList;
 SpanPackPtr *spackList_ptr;
+
 int spackList_length;
 int spackList_length_align;
 
@@ -110,6 +111,7 @@
 extern void panel_init(int);
 extern void universe_init(void);
 extern void ieshoot_init(void);
+extern void ball_bound_init(int, int);
 
 void
 Viewer::run_init(const char *xml, int sg_number)
@@ -140,6 +142,9 @@
     case 6:
 	ieshoot_init();
 	break;
+    case 7:
+	ball_bound_init(this->width, this->height);
+	break;
     default:
 	node_init();
 	break;
--- a/TaskManager/Test/test_render/viewer_types.h	Fri Jan 30 09:57:32 2009 +0900
+++ b/TaskManager/Test/test_render/viewer_types.h	Fri Jan 30 14:55:04 2009 +0900
@@ -7,7 +7,7 @@
 const int TEXTURE_BLOCK_SIZE = TEXTURE_SPLIT_PIXEL*TEXTURE_SPLIT_PIXEL;
 
 // 一個の SPE が描画担当する width, height (pixel)
-const int split_screen_w = 256;
+const int split_screen_w = 512;
 const int split_screen_h = 8;
 
 enum video_type {