# HG changeset patch # User Shinji KONO # Date 1254471256 -32400 # Node ID 96c941eae9626138a7e2e7062b2f51507c485f33 # Parent bd5b93d39597581254580e0ca585070f73c5bf9a fix spe/DrawSpan.cc (not yet tested) diff -r bd5b93d39597 -r 96c941eae962 TaskManager/Test/test_render/spe/ChainCal.cc --- a/TaskManager/Test/test_render/spe/ChainCal.cc Fri Oct 02 16:40:43 2009 +0900 +++ b/TaskManager/Test/test_render/spe/ChainCal.cc Fri Oct 02 17:14:16 2009 +0900 @@ -27,8 +27,8 @@ //int parent; } ChainProperty, *ChainPropertyPtr; -int -ChainCal::run(SchedTask *s,void *rbuf, void *wbuf) +static int +run(SchedTask *s,void *rbuf, void *wbuf) { ChainPropertyPtr property = (ChainPropertyPtr)s->get_input(rbuf, 0); ChainPropertyPtr update_property = (ChainPropertyPtr)s->get_output(wbuf, 0); diff -r bd5b93d39597 -r 96c941eae962 TaskManager/Test/test_render/spe/DrawSpan.cc --- a/TaskManager/Test/test_render/spe/DrawSpan.cc Fri Oct 02 16:40:43 2009 +0900 +++ b/TaskManager/Test/test_render/spe/DrawSpan.cc Fri Oct 02 17:14:16 2009 +0900 @@ -12,20 +12,23 @@ #include "global_alloc.h" SchedDefineTask(DrawSpan); +SchedDefineTask1(DrawSpanEnd,draw_span_end); #define TEX_LOAD1 0 #define TEX_LOAD2 1 #define SPAN_PACK_LOAD 2 #define FB_STORE 3 -/* - * done in post func? -DrawSpan::~DrawSpan(void) +static int +draw_span_end(SchedTask *s, void *rbuf, void *wbuf) { - smanager->dma_wait(FB_STORE); // 誰のために待ってるの? - free((void*)((int)linebuf*doneWrite)); + Gptr g = (Gptr)s->get_param(0); + s->dma_wait(FB_STORE); + free((void*)((int)g->linebuf*g->doneWrite)); + free(g); + return 0; } - */ + inline vector float spu_re_nrm(vector float a) @@ -119,7 +122,7 @@ * @return Buffer */ static int* -linebuf_init(int width, int height, int rgb) +linebuf_init(SchedTask *smanager, int width, int height, int rgb) { int *buf = (int*)smanager->allocate(sizeof(int)*width*height); @@ -138,7 +141,7 @@ * @return Z-Buffer */ static float* -zRow_init(int width, int height) +zRow_init(SchedTask *smanager, int width, int height) { float *buf = (float*)smanager->allocate(sizeof(float)*width*height); float def = 65535.0f; @@ -213,16 +216,16 @@ #endif static void -writebuffer(unsigned int display, int buf_width, int height, - int screen_width) +writebuffer(SchedTask *smanager, Gptr g, unsigned int display, + int buf_width, int height, int screen_width) { for (int i = 0; i < height; i++) { - smanager->dma_store(&linebuf[i*buf_width], + smanager->dma_store(&g->linebuf[i*buf_width], display + (sizeof(int)*screen_width*i), sizeof(int)*buf_width, FB_STORE); } - doneWrite = 1; + g->doneWrite = 1; } /** @@ -237,13 +240,13 @@ * @param tex_addr テクスチャのアドレス(MainMemory) */ static void -updateBuffer(float zpos, int rangex, int x, int y, +updateBuffer(Gptr g, float zpos, int rangex, int x, int y, int tex_x, int tex_y, TilePtr tile) { int rgb = get_rgb(tex_x, tex_y, tile); - zRow[x + (rangex*y)] = zpos; - linebuf[x + (rangex*y)] = rgb; + g->zRow[x + (rangex*y)] = zpos; + g->linebuf[x + (rangex*y)] = rgb; } /** @@ -255,7 +258,7 @@ */ static int -drawDot1(SpanPtr span, int startx, int endx, int wait_tag) +drawDot1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag) { int rangex = endx - startx + 1; @@ -288,7 +291,7 @@ tex_xpos = (int)((span->tex_width-1) * tex); tex_ypos = (int)((span->tex_height-1) * tey); - if (zpos < zRow[localx + (rangex*localy)]) { + if (zpos < g->zRow[localx + (rangex*localy)]) { tex_addr = getTile(tex_xpos, tex_ypos, span->tex_width, (memaddr)span->tex_addr); tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; @@ -297,7 +300,7 @@ TilePtr tile = smanager->get_segment(tex_addr,tileList); smanager->wait_segment(tile); - updateBuffer(zpos, rangex, localx, localy, + updateBuffer(g, zpos, rangex, localx, localy, tex_localx, tex_localy, tile); } @@ -323,7 +326,7 @@ * @return 「span のどの位置まで rendering が終わったか」の x 座標 */ static int -drawLine1(SpanPtr span, int startx, int endx, int wait_tag) +drawLine1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag) { int x = span->x; int rangex = endx - startx + 1; @@ -369,7 +372,7 @@ 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)]) { + if (tex_z < g->zRow[localx + (rangex*localy)]) { // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と // そのブロックのアドレス(MainMemory) memaddr tex_addr; @@ -384,7 +387,7 @@ TilePtr tile = smanager->get_segment(tex_addr,tileList); smanager->wait_segment(tile); - updateBuffer(tex_z, rangex, localx, localy, + updateBuffer(g, tex_z, rangex, localx, localy, tex_localx, tex_localy, tile); } } @@ -396,7 +399,8 @@ run(SchedTask *smanager, void *rbuf, void *wbuf) { __debug_spe("DrawSpan\n"); - this->smanager = smanager; + Gptr g = (Gptr)smanager->allocate(sizeof(G)); + SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0); SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); SpanPackPtr free_spack = next_spack; // next_spack の free() 用 @@ -405,7 +409,7 @@ Span nop_span; nop_span.length_x = 1; - int (DrawSpan::*drawFunc1[2])(SpanPtr, int, int, int) = { + int (DrawSpan::*drawFunc1[2])(SchedTask *, Gptr, SpanPtr, int, int, int) = { &DrawSpan::drawDot1, &DrawSpan::drawLine1 }; @@ -422,11 +426,11 @@ tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); - zRow = zRow_init(rangex, rangey); + g->zRow = zRow_init(rangex, rangey); //linebuf = linebuf_init(rangex, rangey, 0x00ffffff); - linebuf = linebuf_init(rangex, rangey, 0); + g->linebuf = linebuf_init(rangex, rangey, 0); - doneWrite = 0; + g->doneWrite = 0; int tl_tag[2] = {TEX_LOAD1, TEX_LOAD2}; int tl_tag_flg1 = 0; @@ -458,7 +462,8 @@ * span の長さによって、drawLine か drawDot を選択している */ next_span_x - = (this->*drawFunc1[(span->length_x != 1)])( + = (*drawFunc1[(span->length_x != 1)])( + smanager, g, span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]); next_span = span; @@ -483,12 +488,12 @@ next_spack = tmp_spack; } while (spack); - writebuffer(display, rangex, rangey, screen_width); + writebuffer(smanager, g, display, rangex, rangey, screen_width); // linebuf は、writebuffer() の dma_store を wait する // DrawSpan::~DrawSpan() 内で free する。 //free(linebuf); - free(zRow); + free(g->zRow); //FINISH: /** @@ -497,5 +502,10 @@ */ free(free_spack); + + TaskPtr nextTask = smanager->create_task(TASK_DRAW_SPAN_END); + nextTask->add_param((int)g); + smanager->wait_task(nextTask); + return 0; } diff -r bd5b93d39597 -r 96c941eae962 TaskManager/Test/test_render/spe/DrawSpan.h --- a/TaskManager/Test/test_render/spe/DrawSpan.h Fri Oct 02 16:40:43 2009 +0900 +++ b/TaskManager/Test/test_render/spe/DrawSpan.h Fri Oct 02 17:14:16 2009 +0900 @@ -15,14 +15,14 @@ static int run(SchedTask *smanager, void *rbuf, void *wbuf); -static int* linebuf_init(int width, int height, int rgb); +static int* linebuf_init(SchedTask *s, int width, int height, int rgb); static float* zRow_init(int width, int height); static uint32 get_rgb(int tx, int ty, TilePtr tile); static memaddr getTile(int tx, int ty, int tw, memaddr tex_addr_top); static int getTexBlock(int tx, int ty, int twidth); -static void writebuffer(unsigned int display, int width, int height, +static void writebuffer(SchedTask *s, Gptr g, unsigned int display, int width, int height, int screen_width); -static void updateBuffer(float zpos, int rangex, int x, int y, +static void updateBuffer(Gptr g, float zpos, int rangex, int x, int y, int tex_x, int tex_y, TilePtr tile); #if 0 @@ -30,9 +30,9 @@ #endif static int drawDot1(SpanPtr span, int startx, int endx, int wait_tag); -static void drawDot2(SpanPtr span, int startx, int endx, int js, int wait_tag); +//static void drawDot2(SpanPtr span, int startx, int endx, int js, int wait_tag); static int drawLine1(SpanPtr span, int startx, int endx, int wait_tag); -static void drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag); +//static void drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag); }; typedef struct { diff -r bd5b93d39597 -r 96c941eae962 TaskManager/Test/test_render/spe/spe-main.cc --- a/TaskManager/Test/test_render/spe/spe-main.cc Fri Oct 02 16:40:43 2009 +0900 +++ b/TaskManager/Test/test_render/spe/spe-main.cc Fri Oct 02 17:14:16 2009 +0900 @@ -24,6 +24,7 @@ SchedRegisterTask(TASK_INIT_TEXTURE, LoadTexture); SchedRegisterTask(TASK_SET_TEXTURE, SetTexture); SchedRegisterTask(TASK_DRAW_SPAN, DrawSpan); + SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd); SchedRegisterTask(CHAINCAL_TASK, ChainCal); SchedRegisterTask(CHAININIT_TASK, ChainInit);