changeset 161:1f4c3f3238e6 fullHD_omedetou

texture の座標がマイナスになったあと、それを 0 にし忘れてた
author gongo@localhost.localdomain
date Mon, 08 Dec 2008 16:37:02 +0900
parents d5cca23ed50c
children 99d512912eb6 e60e13967016
files TaskManager/Cell/SpeThreads.cc TaskManager/Test/test_render/Makefile TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/SceneGraph.cpp TaskManager/Test/test_render/Span.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/Makefile 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/viewer_types.h include/TaskManager/base.h
diffstat 14 files changed, 189 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/SpeThreads.cc	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Cell/SpeThreads.cc	Mon Dec 08 16:37:02 2008 +0900
@@ -132,8 +132,9 @@
  *
  * ʤ٤ NONBLOCKING ʤɡ
  * Inbound Mailbox 塼˶ʤǤʤΤ
- * Ƥ뤫ǧƤ롣̵Ԥġ
- *  BLOCKING ꤿΰ busy_wait Ȥפäꡣ
+ * Ƥ뤫ǧƤ롣̵Ԥġ
+ *
+ * ԤĤʡ ALL_BLOCKING äƼ¤ busy wait äꤹ뤷
  *
  * @param [speid] SPE ID
  * @param [data] Send 32-bit mailbox messages
--- a/TaskManager/Test/test_render/Makefile	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/Makefile	Mon Dec 08 16:37:02 2008 +0900
@@ -15,9 +15,13 @@
 macosx-depend: FORCE
 	@$(MAKE) -f Makefile.macosx depend
 
+ps3-depend: FORCE
+	@$(MAKE) -f Makefile.ps3 depend
+
 FORCE:
 
 clean:
 	@$(MAKE) -f Makefile.macosx clean
 	@$(MAKE) -f Makefile.ps3 clean
 	@$(MAKE) -f Makefile.linux clean
+
--- a/TaskManager/Test/test_render/Makefile.def	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/Makefile.def	Mon Dec 08 16:37:02 2008 +0900
@@ -11,7 +11,7 @@
 #CERIUM = ../../..
 
 CC      = g++
-CFLAGS  = -O9 -g -Wall# -DDEBUG
+CFLAGS  = -O0 -g -Wall# -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I.
 LIBS = -L$(CERIUM)/TaskManager
\ No newline at end of file
--- a/TaskManager/Test/test_render/SceneGraph.cpp	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/SceneGraph.cpp	Mon Dec 08 16:37:02 2008 +0900
@@ -353,6 +353,8 @@
 		texture_info.pixels_orig = (Uint32*)texture_image->pixels;
 		texture_info.pixels = tex_dest;
 
+		printf("[%s] %p\n", filename, tex_dest);
+
 		if(unlink(image_name))
 		{
 		    cout << "unlink error\n";
--- a/TaskManager/Test/test_render/Span.h	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/Span.h	Mon Dec 08 16:37:02 2008 +0900
@@ -5,12 +5,12 @@
 #  include "Tapestry.h"
 #endif
 
-#define MAX_TILE_LIST 30
+#define MAX_TILE_LIST 64
 
 typedef struct tile {
     void *tile;
     int tix, tiy;
-    int padding; // 16バイト倍数にする用
+     //int padding; // 16バイト倍数にする用
 } TileInfo, *TileInfoPtr;
 
 typedef struct tile_list {
@@ -23,7 +23,7 @@
 	size = 0;
 	next = 0;
     }
-} TileInfoList, *TileInfoListPtr; // 4*4+63*sizeof(Tile) = 1008+16
+} TileInfoList, *TileInfoListPtr; // 4*4+64*sizeof(Tile) = 16+768
 
 class Span {
 public:
--- a/TaskManager/Test/test_render/spe/CreateSpan.cpp	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/spe/CreateSpan.cpp	Mon Dec 08 16:37:02 2008 +0900
@@ -83,27 +83,73 @@
 }
 
 /**
- * テクスチャの座標 (pos1, pos2) を
- * TEXTURE_SPLIT_PIXEL x TEXTURE_SPLIT_PIXEL の中に入るように変換
+ * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
  *
- * 例:
- *  (450, 318) -> 分割されたブロックの (2, 6) になる
+ * +---+---+---+---+---+---+
+ * | 0 | 1 | 2 | 3 | 4 | 5 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |11 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |17 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |23 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |29 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |35 |
+ * +---+---+---+---+---+---+
+ *
+ * 一辺を TEXTURE_SPLIT とする
+ * 各ブロックの数字がブロックIDとなる。
+ */
+
+/**
+ * テクスチャの座標から、
+ * テクスチャのどのブロックかを求める
+ *
+ * @param[in] tx X coordinates of texture
+ * @param[in] tx Y coordinates of texture
+ * @param[in] twidth  Width of texture
+ * @return block ID
  */
 static int
-get_tex_pos(int pos, int screen)
+get_tex_block(int tx, int ty, int twidth)
+{
+     int blockX, blockY;
+
+     blockX = tx / TEXTURE_SPLIT_PIXEL;
+     blockY = ty / TEXTURE_SPLIT_PIXEL;
+
+     return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY;
+}
+
+void
+CreateSpan::setTileInfo(TileInfoPtr tile, int xpos, int ypos,
+			int tex_width, uint32* tex_addr_top)
 {
-    if (pos < 0) pos = 0;
-    if (screen - 1 < pos) pos = screen - 1 ;
-
-    return pos % TEXTURE_SPLIT_PIXEL;
+     /*
+      * テクスチャの座標 (tex_xpos, tex_ypos) の
+      * 分割したブロック内での座標
+      * 例:
+      *  (450, 318) -> 分割されたブロックの (2, 6) になる
+      */
+     tile->tix = xpos % TEXTURE_SPLIT_PIXEL;
+     tile->tiy = ypos % TEXTURE_SPLIT_PIXEL;
+     
+     /**
+      * ブロックIDから、あらかじめ分割したテクスチャの
+      * 先頭addressの addr からの距離を求める。
+      * それがこの 1 pixel が使うテクスチャのブロックになる
+      */
+     int block = get_tex_block(xpos, ypos, tex_width);
+     tile->tile = (void*)(tex_addr_top + block*TEXTURE_BLOCK_SIZE);
 }
 
 /**
  * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく
- * 
  */
 void
-CreateSpan::setTile(SpanPtr span)
+CreateSpan::setTileInfoList(SpanPtr span)
 {
     TileInfoListPtr tilelist =
 	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
@@ -130,14 +176,13 @@
 
     if (span->length_x == 1) {
 	tilelist->init();
-	tile = &tilelist->tileinfo[tilelist->size++];
 
 	tex_xpos = (int)((span->tex_width-1) * tex1);
 	tex_ypos = (int)((span->tex_height-1) * tey1);
 
-	tile->tix = get_tex_pos(tex_xpos, span->tex_width);
-	tile->tiy = get_tex_pos(tex_ypos, span->tex_height);
-	tile->tile = span->tex_addr;
+	tile = &tilelist->tileinfo[tilelist->size++];
+	setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width,
+		    (uint32*)span->tex_addr);
     } else {    
 	while (cur_x <= span->length_x) {
 	    if (cur_x + MAX_TILE_LIST - 1 < span->length_x) {
@@ -159,16 +204,22 @@
 		tex_xpos = (int)((span->tex_width-1) * tex_x);
 		tex_ypos = (int)((span->tex_height-1) * tex_y);
 
-		tile = &tilelist->tileinfo[tilelist->size++];
-		tile->tix = get_tex_pos(tex_xpos, span->tex_width);
-		tile->tiy = get_tex_pos(tex_ypos, span->tex_height);
+		/**
+		 * 座標が [0..MAX-1] を超えない様に
+		 * なんかもっと良い書き方ありそうだけど
+		 */
+		if (tex_xpos < 0) tex_xpos = 0;
+		if (span->tex_width - 1 < tex_xpos) {
+		     tex_xpos = span->tex_width - 1;
+		}
+		if (tex_ypos < 0) tex_ypos = 0;
+		if (span->tex_height - 1 < tex_ypos) {
+		     tex_ypos = span->tex_height - 1;
+		}
 
-		int blockX = tex_xpos / TEXTURE_SPLIT_PIXEL;
-		int blockY = tex_ypos / TEXTURE_SPLIT_PIXEL;
-		int block = blockX +
-		    (span->tex_width/TEXTURE_SPLIT_PIXEL)*blockY;
-		uint32 *addr = (uint32*)span->tex_addr;
-		tile->tile = (void*)(addr + block*64);
+		tile = &tilelist->tileinfo[tilelist->size++];
+		setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width,
+			    (uint32*)span->tex_addr);
 	    }
 	
 	    if (cur_x + MAX_TILE_LIST - 1 < span->length_x) {
@@ -410,9 +461,7 @@
 
 	// TilePtr の計算
 	// tix, tiy (Tile 内での x, y)
-	//
-	//smanager->mainMem_wait();
-	setTile(span);
+	setTileInfoList(span);
     }
 }
 
--- a/TaskManager/Test/test_render/spe/CreateSpan.h	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/spe/CreateSpan.h	Mon Dec 08 16:37:02 2008 +0900
@@ -22,7 +22,9 @@
 		       int charge_y_top, int charge_y_end,
 		       long *tex_addr, long tex_width, long tex_height,
 		       VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1);
-    void setTile(SpanPtr span);
+    void setTileInfoList(SpanPtr span);
+    void setTileInfo(TileInfoPtr tile, int xpos, int ypos,
+		     int tex_width, uint32* tex_addr_top);
 };
 
 #endif
--- a/TaskManager/Test/test_render/spe/DrawSpan.cpp	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.cpp	Mon Dec 08 16:37:02 2008 +0900
@@ -14,7 +14,7 @@
 
 static const int hashsize = 263;
 
-static TilePtr hash_table[hashsize] = {NULL};
+static TilePtr hash_table[hashsize] = {0};
 
 unsigned short PRIME[8] = {
     0x002, 0x065, 0x0c7, 0x133, 0x191, 0x1f3, 0x259, 0x2bd,
@@ -123,7 +123,7 @@
 	tile->texture_addr = addr;
 
 	smanager->dma_load(tile->pixel, (uint32)addr,
-			   sizeof(uint32)*64, TEX_LOAD);
+			   sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD);
 
 	int index = put(tile->texture_addr, tile);
 
@@ -167,15 +167,11 @@
 	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
     TileInfoListPtr next_tilist =
 	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
-    TileInfoPtr tinfo;
-
 
     tileList = (TileListPtr)smanager->allocate(sizeof(TileList));
     tileList->init();
 
-    int render_y = sp->info.y_top;
-    void *texture_image = global_get(TEXTURE_ID);
-
+    void *texture_image = global_get(TEXTURE_ID);    
     int rangex_start  = get_param(0); // Υô x ϰϤλ
     int rangex_end    = get_param(1); //  (start <= x <= end)
     int rangey        = get_param(2); // y ϰ (render_y + rangey - 1)
@@ -212,10 +208,6 @@
 			       sizeof(TileInfoList), TILE_INFO_LOAD);
 
 	    Uint32 rgb = 0x00ff00;
-	    float tex1 = span->tex_x1;
-	    float tex2 = span->tex_x2;
-	    float tey1 = span->tex_y1;
-	    float tey2 = span->tex_y2;
 	    int tex_xpos;
 	    int tex_ypos;
 	    int tex_zpos;
@@ -236,15 +228,10 @@
 		    continue;
 		}
 
-#if 1
 		tex_xpos = tilist->tileinfo[0].tix;
 		tex_ypos = tilist->tileinfo[0].tiy;
+		tex_zpos = (int)z;
 		texture_image = tilist->tileinfo[0].tile;
-#else
-		tex_xpos = (int)((span->tex_width-1) * tex1);
-		tex_ypos = (int)((span->tex_height-1) * tey1);
-		tex_zpos = (int)z;
-#endif					
 
 		if (zpos < zRow[localx + (rangex * localy)]) {
 		    rgb = get_rgb(tex_xpos, tex_ypos, texture_image);
@@ -301,25 +288,16 @@
 			len = max_x - cur_x;
 		    }
 
-		    float tex_x, tex_y, tex_z;
-
 		    for (int j = cur_x; j <= cur_x + len; j++) {
 			TileInfoPtr tinfo = &tilist->tileinfo[j%MAX_TILE_LIST];
+			float tex_z
+			     = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1);
+
 			localx = getLocalX(x-1+j);
-			tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1);
 
-#if 1
 			tex_xpos = tinfo->tix;
 			tex_ypos = tinfo->tiy;
 			texture_image = tinfo->tile;
-#else
-			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_y > 1) tex_y = 1;
-			tex_xpos = (int)((span->tex_width-1) * tex_x);
-			tex_ypos = (int)((span->tex_height-1) * tex_y);
-#endif
 
 			if (tex_z < zRow[localx + (rangex*localy)]) {
 			    rgb = get_rgb(tex_xpos, tex_ypos, texture_image);
--- a/TaskManager/Test/test_render/spe/Makefile	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/spe/Makefile	Mon Dec 08 16:37:02 2008 +0900
@@ -8,7 +8,7 @@
 OBJS = $(SRCS:.cpp=.o)
 
 CC      = spu-g++
-CFLAGS  = -O9 -g -fno-exceptions -fno-rtti #-DDEBUG
+CFLAGS  = -O9 -Wall -g -fno-exceptions -fno-rtti #-DDEBUG
 INCLUDE = -I$(CERIUM)/include/TaskManager -I. -I..
 LIBS    = -L$(CERIUM)/TaskManager -lspemanager
 
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/task/CreateSpan.cpp	Mon Dec 08 16:37:02 2008 +0900
@@ -83,27 +83,73 @@
 }
 
 /**
- * テクスチャの座標 (pos1, pos2) を
- * TEXTURE_SPLIT_PIXEL x TEXTURE_SPLIT_PIXEL の中に入るように変換
+ * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
  *
- * 例:
- *  (450, 318) -> 分割されたブロックの (2, 6) になる
+ * +---+---+---+---+---+---+
+ * | 0 | 1 | 2 | 3 | 4 | 5 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |11 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |17 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |23 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |29 |
+ * +---+---+---+---+---+---+
+ * |   |   |   |   |   |35 |
+ * +---+---+---+---+---+---+
+ *
+ * 一辺を TEXTURE_SPLIT とする
+ * 各ブロックの数字がブロックIDとなる。
+ */
+
+/**
+ * テクスチャの座標から、
+ * テクスチャのどのブロックかを求める
+ *
+ * @param[in] tx X coordinates of texture
+ * @param[in] tx Y coordinates of texture
+ * @param[in] twidth  Width of texture
+ * @return block ID
  */
 static int
-get_tex_pos(int pos, int screen)
+get_tex_block(int tx, int ty, int twidth)
+{
+     int blockX, blockY;
+
+     blockX = tx / TEXTURE_SPLIT_PIXEL;
+     blockY = ty / TEXTURE_SPLIT_PIXEL;
+
+     return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY;
+}
+
+void
+CreateSpan::setTileInfo(TileInfoPtr tile, int xpos, int ypos,
+			int tex_width, uint32* tex_addr_top)
 {
-    if (pos < 0) pos = 0;
-    if (screen - 1 < pos) pos = screen - 1 ;
-
-    return pos % TEXTURE_SPLIT_PIXEL;
+     /*
+      * テクスチャの座標 (tex_xpos, tex_ypos) の
+      * 分割したブロック内での座標
+      * 例:
+      *  (450, 318) -> 分割されたブロックの (2, 6) になる
+      */
+     tile->tix = xpos % TEXTURE_SPLIT_PIXEL;
+     tile->tiy = ypos % TEXTURE_SPLIT_PIXEL;
+     
+     /**
+      * ブロックIDから、あらかじめ分割したテクスチャの
+      * 先頭addressの addr からの距離を求める。
+      * それがこの 1 pixel が使うテクスチャのブロックになる
+      */
+     int block = get_tex_block(xpos, ypos, tex_width);
+     tile->tile = (void*)(tex_addr_top + block*TEXTURE_BLOCK_SIZE);
 }
 
 /**
  * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく
- * 
  */
 void
-CreateSpan::setTile(SpanPtr span)
+CreateSpan::setTileInfoList(SpanPtr span)
 {
     TileInfoListPtr tilelist =
 	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
@@ -130,14 +176,13 @@
 
     if (span->length_x == 1) {
 	tilelist->init();
-	tile = &tilelist->tileinfo[tilelist->size++];
 
 	tex_xpos = (int)((span->tex_width-1) * tex1);
 	tex_ypos = (int)((span->tex_height-1) * tey1);
 
-	tile->tix = get_tex_pos(tex_xpos, span->tex_width);
-	tile->tiy = get_tex_pos(tex_ypos, span->tex_height);
-	tile->tile = span->tex_addr;
+	tile = &tilelist->tileinfo[tilelist->size++];
+	setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width,
+		    (uint32*)span->tex_addr);
     } else {    
 	while (cur_x <= span->length_x) {
 	    if (cur_x + MAX_TILE_LIST - 1 < span->length_x) {
@@ -159,16 +204,22 @@
 		tex_xpos = (int)((span->tex_width-1) * tex_x);
 		tex_ypos = (int)((span->tex_height-1) * tex_y);
 
-		tile = &tilelist->tileinfo[tilelist->size++];
-		tile->tix = get_tex_pos(tex_xpos, span->tex_width);
-		tile->tiy = get_tex_pos(tex_ypos, span->tex_height);
+		/**
+		 * 座標が [0..MAX-1] を超えない様に
+		 * なんかもっと良い書き方ありそうだけど
+		 */
+		if (tex_xpos < 0) tex_xpos = 0;
+		if (span->tex_width - 1 < tex_xpos) {
+		     tex_xpos = span->tex_width - 1;
+		}
+		if (tex_ypos < 0) tex_ypos = 0;
+		if (span->tex_height - 1 < tex_ypos) {
+		     tex_ypos = span->tex_height - 1;
+		}
 
-		int blockX = tex_xpos / TEXTURE_SPLIT_PIXEL;
-		int blockY = tex_ypos / TEXTURE_SPLIT_PIXEL;
-		int block = blockX +
-		    (span->tex_width/TEXTURE_SPLIT_PIXEL)*blockY;
-		uint32 *addr = (uint32*)span->tex_addr;
-		tile->tile = (void*)(addr + block*64);
+		tile = &tilelist->tileinfo[tilelist->size++];
+		setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width,
+			    (uint32*)span->tex_addr);
 	    }
 	
 	    if (cur_x + MAX_TILE_LIST - 1 < span->length_x) {
@@ -410,9 +461,7 @@
 
 	// TilePtr の計算
 	// tix, tiy (Tile 内での x, y)
-	//
-	//smanager->mainMem_wait();
-	setTile(span);
+	setTileInfoList(span);
     }
 }
 
--- a/TaskManager/Test/test_render/task/CreateSpan.h	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/task/CreateSpan.h	Mon Dec 08 16:37:02 2008 +0900
@@ -22,7 +22,9 @@
 		       int charge_y_top, int charge_y_end,
 		       long *tex_addr, long tex_width, long tex_height,
 		       VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1);
-    void setTile(SpanPtr span);
+    void setTileInfoList(SpanPtr span);
+    void setTileInfo(TileInfoPtr tile, int xpos, int ypos,
+		     int tex_width, uint32* tex_addr_top);
 };
 
 #endif
--- a/TaskManager/Test/test_render/task/DrawSpan.cpp	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/task/DrawSpan.cpp	Mon Dec 08 16:37:02 2008 +0900
@@ -14,7 +14,7 @@
 
 static const int hashsize = 263;
 
-static TilePtr hash_table[hashsize] = {NULL};
+static TilePtr hash_table[hashsize] = {0};
 
 unsigned short PRIME[8] = {
     0x002, 0x065, 0x0c7, 0x133, 0x191, 0x1f3, 0x259, 0x2bd,
@@ -123,7 +123,7 @@
 	tile->texture_addr = addr;
 
 	smanager->dma_load(tile->pixel, (uint32)addr,
-			   sizeof(uint32)*64, TEX_LOAD);
+			   sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD);
 
 	int index = put(tile->texture_addr, tile);
 
@@ -167,15 +167,11 @@
 	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
     TileInfoListPtr next_tilist =
 	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
-    TileInfoPtr tinfo;
-
 
     tileList = (TileListPtr)smanager->allocate(sizeof(TileList));
     tileList->init();
 
-    int render_y = sp->info.y_top;
-    void *texture_image = global_get(TEXTURE_ID);
-
+    void *texture_image = global_get(TEXTURE_ID);    
     int rangex_start  = get_param(0); // Υô x ϰϤλ
     int rangex_end    = get_param(1); //  (start <= x <= end)
     int rangey        = get_param(2); // y ϰ (render_y + rangey - 1)
@@ -212,10 +208,6 @@
 			       sizeof(TileInfoList), TILE_INFO_LOAD);
 
 	    Uint32 rgb = 0x00ff00;
-	    float tex1 = span->tex_x1;
-	    float tex2 = span->tex_x2;
-	    float tey1 = span->tex_y1;
-	    float tey2 = span->tex_y2;
 	    int tex_xpos;
 	    int tex_ypos;
 	    int tex_zpos;
@@ -236,15 +228,10 @@
 		    continue;
 		}
 
-#if 1
 		tex_xpos = tilist->tileinfo[0].tix;
 		tex_ypos = tilist->tileinfo[0].tiy;
+		tex_zpos = (int)z;
 		texture_image = tilist->tileinfo[0].tile;
-#else
-		tex_xpos = (int)((span->tex_width-1) * tex1);
-		tex_ypos = (int)((span->tex_height-1) * tey1);
-		tex_zpos = (int)z;
-#endif					
 
 		if (zpos < zRow[localx + (rangex * localy)]) {
 		    rgb = get_rgb(tex_xpos, tex_ypos, texture_image);
@@ -301,25 +288,16 @@
 			len = max_x - cur_x;
 		    }
 
-		    float tex_x, tex_y, tex_z;
-
 		    for (int j = cur_x; j <= cur_x + len; j++) {
 			TileInfoPtr tinfo = &tilist->tileinfo[j%MAX_TILE_LIST];
+			float tex_z
+			     = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1);
+
 			localx = getLocalX(x-1+j);
-			tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1);
 
-#if 1
 			tex_xpos = tinfo->tix;
 			tex_ypos = tinfo->tiy;
 			texture_image = tinfo->tile;
-#else
-			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_y > 1) tex_y = 1;
-			tex_xpos = (int)((span->tex_width-1) * tex_x);
-			tex_ypos = (int)((span->tex_height-1) * tex_y);
-#endif
 
 			if (tex_z < zRow[localx + (rangex*localy)]) {
 			    rgb = get_rgb(tex_xpos, tex_ypos, texture_image);
--- a/TaskManager/Test/test_render/viewer_types.h	Mon Dec 08 10:56:58 2008 +0900
+++ b/TaskManager/Test/test_render/viewer_types.h	Mon Dec 08 16:37:02 2008 +0900
@@ -4,6 +4,7 @@
 // texture  8x8 ʬ
 // ͤϡSpanPack ˤȤ
 const int TEXTURE_SPLIT_PIXEL = 8;
+const int TEXTURE_BLOCK_SIZE = TEXTURE_SPLIT_PIXEL*TEXTURE_SPLIT_PIXEL;
 
 // Ĥ SPE ô width, height (pixel)
 const int split_screen_w = 512;
--- a/include/TaskManager/base.h	Mon Dec 08 10:56:58 2008 +0900
+++ b/include/TaskManager/base.h	Mon Dec 08 16:37:02 2008 +0900
@@ -3,8 +3,8 @@
 #include <stdio.h>
 
 
-#ifdef __SPU__
-//#if 0
+//#ifdef __SPU__
+#if 0
 #  define BASE_NEW_DELETE(T)						\
     /* override new/detele */                                           \
     static void* operator new(size_t size) {                            \