Mercurial > hg > Members > kono > Cerium
changeset 147:3ecf43bd1a35
fix
author | gongo@charles.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Tue, 02 Dec 2008 15:47:25 +0900 |
parents | 2284efc89f63 |
children | 9642aeef298d |
files | TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/spe/CreateSpan.cpp TaskManager/Test/test_render/spe/DrawSpan.cpp |
diffstat | 3 files changed, 73 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/Makefile.def Tue Dec 02 14:12:01 2008 +0900 +++ b/TaskManager/Test/test_render/Makefile.def Tue Dec 02 15:47:25 2008 +0900 @@ -3,10 +3,10 @@ # 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 = ../../..
--- a/TaskManager/Test/test_render/spe/CreateSpan.cpp Tue Dec 02 14:12:01 2008 +0900 +++ b/TaskManager/Test/test_render/spe/CreateSpan.cpp Tue Dec 02 15:47:25 2008 +0900 @@ -126,6 +126,7 @@ while (cur_x < span->length_x) { if (cur_x + MAX_TILE_LIST < span->length_x) { len = MAX_TILE_LIST; + smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); } else { len = span->length_x - cur_x; } @@ -155,7 +156,6 @@ send_tilelist_addr = tilelist_addr; - smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); smanager->mainMem_wait(); tilelist_addr = (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE); @@ -392,7 +392,7 @@ // TilePtr の計算 // tix, tiy (Tile 内での x, y) // - smanager->mainMem_wait(); + //smanager->mainMem_wait(); setTile(span); } }
--- a/TaskManager/Test/test_render/spe/DrawSpan.cpp Tue Dec 02 14:12:01 2008 +0900 +++ b/TaskManager/Test/test_render/spe/DrawSpan.cpp Tue Dec 02 15:47:25 2008 +0900 @@ -8,6 +8,7 @@ #define SPAN_PACK_LOAD 0 #define TEX_LOAD 1 +#define TILE_INFO_LOAD 2 SchedDefineTask(DrawSpan); @@ -176,6 +177,14 @@ SpanPack *tmp_sp = NULL; Span *span; + TileInfoListPtr tilist = + (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); + TileInfoListPtr next_tilist = + (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); + TileInfoListPtr tmp_tilist = NULL; + TileInfoPtr tinfo; + + tileList = (TileListPtr)smanager->allocate(sizeof(TileList)); tileList->init(); @@ -214,6 +223,9 @@ for (int t = 0; t < sp->info.size; t++) { span = &sp->span[t]; + smanager->dma_load(tilist, (uint32)span->tilelist, + sizeof(TileInfoList), TILE_INFO_LOAD); + Uint32 rgb = 0x00ff00; float tex1 = span->tex_x1; float tex2 = span->tex_x2; @@ -232,6 +244,8 @@ int localx = getLocalX(x-1); int localy = getLocalY(y-1); + smanager->dma_wait(TILE_INFO_LOAD); + if (x_len == 1) { if (x < rangex_start || rangex_end < x) { continue; @@ -247,32 +261,68 @@ linebuf[localy][localx] = rgb; } } else { - float tex_x, tex_y, tex_z; int js = (x < rangex_start) ? rangex_start - x : 0; int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; - for (int j = js; j <= je; j++) { - localx = getLocalX(x-1+j); + if (js > je) continue; + + int cur_x = 0; + int max_x = je; + int len; - tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1); + while (cur_x + MAX_TILE_LIST < js) { + smanager->dma_wait(TILE_INFO_LOAD); + smanager->dma_load(tilist, (uint32)tilist->next, + sizeof(TileInfoList), TILE_INFO_LOAD); + cur_x += MAX_TILE_LIST; + } + + cur_x = js; - 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); - - if (tex_z < zRow[localx + (rangex*localy)]) { - rgb = get_rgb(tex_xpos, tex_ypos, span->tex_width, - span->tex_height, texture_image); - zRow[localx + (rangex*localy)] = tex_z; - linebuf[localy][localx] = rgb; + while (cur_x < max_x) { + smanager->dma_wait(TILE_INFO_LOAD); + + if (cur_x + MAX_TILE_LIST < max_x) { + smanager->dma_load(next_tilist, (uint32)tilist->next, + sizeof(TileInfoList), TILE_INFO_LOAD); + len = MAX_TILE_LIST; + } else { + len = max_x - cur_x; } + + float tex_x, tex_y, tex_z; + + for (int j = cur_x; j <= cur_x + len; 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_y > 1) tex_y = 1; + 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)]) { + rgb = get_rgb(tex_xpos, tex_ypos, span->tex_width, + span->tex_height, texture_image); + zRow[localx + (rangex*localy)] = tex_z; + linebuf[localy][localx] = rgb; + } + } + + smanager->dma_wait(TILE_INFO_LOAD); + + TileInfoListPtr tmp = tilist; + tilist = next_tilist; + next_tilist = tmp; + + cur_x += MAX_TILE_LIST; } } } - + smanager->dma_wait(SPAN_PACK_LOAD); tmp_sp = sp; @@ -284,6 +334,8 @@ free(linebuf); free(zRow); free(tileList); + free(tilist); + free(next_tilist); return 0; }