# HG changeset patch # User gongo@localhost.localdomain # Date 1233294904 -32400 # Node ID 204b03ca98f86dc962ba828b07533f694d62492a # Parent 2ae83ca07f0d6c6ab705480803c129778143faf0 fix DrawSpan diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Cell/spe/SchedTask.cc --- 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内で生成されたが、 diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/ChangeLog --- 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 + + * 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 * spe/CreateSpan.cpp (CreateSpan::run): fix diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/Makefile.def --- 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 diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/Tapestry.h --- 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; diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/ball_bound.cpp --- 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; diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/polygon_pack.h --- 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 { diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/spe/CreateSpan.cpp --- 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); } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/spe/CreateSpan.h --- 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 diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/spe/DrawSpan.cpp --- 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; } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/spe/DrawSpan.h --- 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 { diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/spe/DrawSpanRenew.cpp --- 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 } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/spe/TileHash.cpp --- 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; } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/task/CreateSpan.cpp --- 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); } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/task/CreateSpan.h --- 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 diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/task/DrawSpan.cpp --- 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 #include +#include #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; } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/task/DrawSpan.h --- 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 { diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/task/DrawSpanRenew.cpp --- 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 #include +#include #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 } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/task/TileHash.cpp --- 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; } diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/viewer.cpp --- 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; diff -r 2ae83ca07f0d -r 204b03ca98f8 TaskManager/Test/test_render/viewer_types.h --- 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 {