# HG changeset patch # User gongo@localhost.localdomain # Date 1233048072 -32400 # Node ID efb1df3176f4862b3987312ba0f6bb499607ad19 # Parent 3c632793eaf8406c4b520e4c99c2ef123ddb1c8a fix diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/fb.h --- a/TaskManager/Test/test_render/fb.h Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/fb.h Tue Jan 27 18:21:12 2009 +0900 @@ -13,19 +13,6 @@ #define DEVICE_NAME "/dev/fb0" #define DIV_BYTE 8 -#define X_PIXEL_MAX 320 -#define Y_LINE_MAX 240 - -#define BORDER1 80 -#define BORDER2 160 - -#define COLOR_RED 0xf800 -#define COLOR_GREEN 0x07e0 -#define COLOR_BLUE 0x001f -#define COLOR_WHITE 0xffff -#define COLOR_BLACK 0x0000 -#define COLOR_YELLOW 0xffe0 - /* function prototype */ void send_current_error_msg(const char *ptr); void send_current_information(const char *ptr); diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/ieshoot.cpp --- a/TaskManager/Test/test_render/ieshoot.cpp Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/ieshoot.cpp Tue Jan 27 18:21:12 2009 +0900 @@ -10,6 +10,18 @@ static const float boss_radius_x = 64.0f; static const float boss_radius_y = 128.0f; +static const float iebosstama_speed = 15.0f; + +static void +ieboss_collision(SceneGraphPtr node, int screen_w, int screen_h, + SceneGraphPtr tree); +static void +ieboss_collision_invincibil(SceneGraphPtr node, int screen_w, int screen_h, SceneGraphPtr tree); +static void ieboss_move(SceneGraphPtr node, int screen_w, int screen_h); + +static void iebosstama_move(SceneGraphPtr node, int screen_w, int screen_h); + + static void iejiki_collision(SceneGraphPtr node, int screen_w, int screen_h, SceneGraphPtr tree) @@ -22,7 +34,6 @@ { } - static void ieboss_collision(SceneGraphPtr node, int screen_w, int screen_h, SceneGraphPtr tree) @@ -39,6 +50,15 @@ && node->xyz[1] + boss_radius_y > tama->xyz[1] - tama_radius) { tama->remove(); + node->set_move_collision(ieboss_move, ieboss_collision_invincibil); + + SceneGraphPtr iebosstama = sgroot->createSceneGraph(Earth); + iebosstama->set_move_collision(iebosstama_move, ietama_collision); + iebosstama->xyz[0] = node->xyz[0]; + iebosstama->xyz[1] = node->xyz[1] + boss_radius_y; + iebosstama->xyz[2] = 30000.0f; + node->addBrother(iebosstama); + damage++; } } @@ -69,6 +89,34 @@ } static void +ieboss_collision_invincibil(SceneGraphPtr node, int screen_w, int screen_h, + SceneGraphPtr tree) +{ + static int frame = 0; + + frame++; + + node->flag_drawable ^= 1; + + if (frame > 60) { + frame = 0; + node->flag_drawable = 1; + node->set_move_collision(ieboss_move, ieboss_collision); + } +} + +static void +iebosstama_move(SceneGraphPtr node, int screen_w, int screen_h) +{ + node->xyz[1] += iebosstama_speed; + + // 描画領域から抜けたら削除 + if (node->xyz[1] > screen_h) { + node->remove(); + } +} + +static void ietama_move(SceneGraphPtr node, int screen_w, int screen_h) { node->xyz[1] -= tama_speed; @@ -140,12 +188,12 @@ sgroot->createFromXMLfile("xml_file/ietama.xml"); sgroot->createFromXMLfile("xml_file/ieboss.xml"); sgroot->createFromXMLfile("xml_file/iejiki.xml"); + sgroot->createFromXMLfile("xml_file/universe.xml"); back = sgroot->createSceneGraph(); iejiki = sgroot->createSceneGraph(IEJIKI); iejiki->set_move_collision(iejiki_move, iejiki_collision); - //iejiki->flag_drawable = 0; back->addChild(iejiki); enemy = sgroot->createSceneGraph(IEBOSS); diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/spe/DrawSpan.cpp --- a/TaskManager/Test/test_render/spe/DrawSpan.cpp Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/spe/DrawSpan.cpp Tue Jan 27 18:21:12 2009 +0900 @@ -11,12 +11,6 @@ #define TEX_LOAD 1 #define FB_STORE 2 -//#define PROFILE - -#if defined(PROFILE) -# include -#endif - SchedDefineTask(DrawSpan); DrawSpan::~DrawSpan(void) @@ -25,6 +19,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); +} + + /** * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する * @@ -116,7 +135,7 @@ float *buf = (float*)smanager->allocate(sizeof(float)*width*height); float def = 65535.0f; -#if 1 +#if 0 for (int i = 0; i < width*height; i++) { buf[i] = def; } @@ -249,7 +268,244 @@ doneWrite = 1; } -#define Prof(st,cur) (((st)-(cur))/79800000.0f * 1000.0f) +/** + * 長さが 1 の Span の描画 (要するに 1 pixel) + * + * @param span Span + * @param startx 描画開始範囲 + * @param endx 描画終了範囲 + */ +void +DrawSpan::drawDot(SpanPtr span, int startx, int endx) +{ + 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; + } + + 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); + smanager->dma_wait(TEX_LOAD); + } + + int rgb = get_rgb(tex_localx, tex_localy, tex_addr); + + zRow[localx + (rangex*localy)] = zpos; + linebuf[localx + (rangex*localy)] = rgb; + } +} + +void +DrawSpan::drawLine(SpanPtr span, int startx, int endx) +{ + 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); + + // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と + // そのブロックのアドレス(MainMemory) + int tex_localx; + int tex_localy; + uint32 *tex_addr; + + float tex_x, tex_y, tex_z; + +#if 0 + 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; + + /** + * 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; + } + } +#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 DrawSpan::run(void *rbuf, void *wbuf) @@ -259,6 +515,10 @@ SpanPackPtr free_spack = next_spack; // next_spack の free() 用 Span *span; + void (DrawSpan::*drawFunc[2])(SpanPtr, int, int) = { + &DrawSpan::drawDot, &DrawSpan::drawLine + }; + uint32 display = smanager->get_param(0); int screen_width = smanager->get_param(1); int rangex_start = smanager->get_param(2); @@ -274,17 +534,10 @@ 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 tileNum = 0; - int flag = 0; -#if defined(PROFILE) - uint32 profile = spu_read_decrementer(); - printf("%d %u DrawSpan start\n", smanager->get_cpuid(), profile); -#endif do { /** * SpanPack->next が存在する場合、 @@ -301,273 +554,9 @@ for (int t = 0; t < spack->info.size; t++) { 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 毎の - * テクスチャの座標 - */ - int tex_xpos; - int tex_ypos; - - /** - * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と - * そのブロックのアドレス(MainMemory) - */ - int tex_localx; - int tex_localy; - uint32 *tex_addr; - - 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; - } - - flag = 1; - 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)) { -# if defined(PROFILE) - printf("%d %u start load tile\n", - smanager->get_cpuid(), spu_read_decrementer()); -# endif - set_rgb(tex_addr); - smanager->dma_wait(TEX_LOAD); -# if defined(PROFILE) - printf("%d %u end load tile\n", - smanager->get_cpuid(), spu_read_decrementer()); -# endif - tileNum++; - } - - rgb = get_rgb(tex_localx, tex_localy, tex_addr); - - 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++) { - flag = 1; - 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; - - /** - * Tile が無い場合、一旦タスクはここで中断し、 - * Tile をロードするタスクを走らせた後に再起動する - */ - if (!isAvailableTile(tex_addr)) { - spack->info.start = t; -#if 0 - 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 - -# if defined(PROFILE) - printf("%d %u start load tile\n", - smanager->get_cpuid(), - spu_read_decrementer()); -# endif - - set_rgb(tex_addr); - smanager->dma_wait(TEX_LOAD); - tileNum++; - -# if defined(PROFILE) - printf("%d %u end load tile\n", - smanager->get_cpuid(), - spu_read_decrementer()); -# endif -#endif - } - - rgb = get_rgb(tex_localx, tex_localy, tex_addr); - - zRow[localx + (rangex*localy)] = tex_z; - linebuf[localx + (rangex*localy)] = rgb; - } - } - } - } - for (int t = 0; t < spack->info.size; t++) { - 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 毎の - * テクスチャの座標 - */ - int tex_xpos; - int tex_ypos; - - /** - * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と - * そのブロックのアドレス(MainMemory) - */ - int tex_localx; - int tex_localy; - uint32 *tex_addr; - - 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; - } - - flag = 1; - 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)) { -# if defined(PROFILE) - printf("%d %u start load tile\n", - smanager->get_cpuid(), spu_read_decrementer()); -# endif - set_rgb(tex_addr); - smanager->dma_wait(TEX_LOAD); -# if defined(PROFILE) - printf("%d %u end load tile\n", - smanager->get_cpuid(), spu_read_decrementer()); -# endif - tileNum++; - } - - rgb = get_rgb(tex_localx, tex_localy, tex_addr); - - 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++) { - flag = 1; - 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; - - /** - * Tile が無い場合、一旦タスクはここで中断し、 - * Tile をロードするタスクを走らせた後に再起動する - */ - if (!isAvailableTile(tex_addr)) { - spack->info.start = t; -#if 0 - 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 - -# if defined(PROFILE) - printf("%d %u start load tile\n", - smanager->get_cpuid(), - spu_read_decrementer()); -# endif - - set_rgb(tex_addr); - smanager->dma_wait(TEX_LOAD); - tileNum++; - -# if defined(PROFILE) - printf("%d %u end load tile\n", - smanager->get_cpuid(), - spu_read_decrementer()); -# endif -#endif - } - - rgb = get_rgb(tex_localx, tex_localy, tex_addr); - - zRow[localx + (rangex*localy)] = tex_z; - linebuf[localx + (rangex*localy)] = rgb; - } - } - } + (this->*drawFunc[(x_len != 1)])(span, rangex_start, rangex_end); } smanager->dma_wait(SPAN_PACK_LOAD); @@ -590,14 +579,6 @@ * linebuf, zRow は free() しない */ free(free_spack); - -#if defined(PROFILE) - printf("%d %u DrawSpan end\n", - smanager->get_cpuid(), spu_read_decrementer()); - if (flag) { - printf("%d %d tileNum\n", smanager->get_cpuid(), tileNum); - } -#endif return 0; } diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/spe/DrawSpan.h --- a/TaskManager/Test/test_render/spe/DrawSpan.h Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/spe/DrawSpan.h Tue Jan 27 18:21:12 2009 +0900 @@ -42,6 +42,9 @@ void writebuffer(unsigned int display, int width, int height, int screen_width); void reboot(SpanPackPtr spack, int cur_span_x); + + void drawDot(SpanPtr span, int startx, int endx); + void drawLine(SpanPtr span, int startx, int endx); }; typedef struct { diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp --- a/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp Tue Jan 27 18:21:12 2009 +0900 @@ -59,21 +59,6 @@ CreatePolygonFromSceneGraph::run(void *rbuf, void *wbuf) { float xyz1[4], xyz2[4], xyz3[4]; - float mat[16] = {fx, 0, 0, 0, 0, fy, 0, 0, 0, 0, 1.0f, 1.0f, 20.0f, 30.0f, 0, 0}; - - //fx -= fd; - //fy -= fd; - - if (fx < 0.0f) { - fx = 0.0f; - fy = 0.0f; - fd = -fd; - } else if (fx > 1.0f) { - fx = 1.0f; - fy = 1.0f; - fd = -fd; - } - SceneGraphPtr sg_top = (SceneGraphPtr)smanager->get_param(0); SceneGraphPtr sg = sg_top; @@ -84,6 +69,21 @@ = (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack)); PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(1); PolygonPackPtr tmp_pp; + + float n = 10.0f; + float f = 1000.0f; + float t = 30.0f; + float b = -30.0f; + float r = 30.0f; + float l = -30.0f; + + float mat[16] = { + 2*n/(r-l), 0, (r+l)/(r-l), 0, + 0, 2*n/(t-b), (t+b)/(t-b), 0, + 0, 0, -(f+n)/(f-n), -2*n*f/(f-n), + 0, 0, -1, 0 + }; + pp->init(); send_pp->init(); diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/viewer.cpp --- a/TaskManager/Test/test_render/viewer.cpp Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/viewer.cpp Tue Jan 27 18:21:12 2009 +0900 @@ -332,7 +332,7 @@ // Draw Background (現在は塗りつぶし) task_draw = manager->create_task(TASK_DRAW_BACK); task_draw->add_param(0xffffffff); - + for (int k = 0; k < rangey; k++) { task_draw->add_outData( &pixels[(startx-1)+this->width*(k+starty-1)], @@ -340,7 +340,7 @@ } #else memset(&pixels[(startx-1)+this->width*(starty-1)], - 0x00, (this->width)*sizeof(int)*rangey); + 0xFF, (this->width)*sizeof(int)*rangey); break; #endif } diff -r 3c632793eaf8 -r efb1df3176f4 TaskManager/Test/test_render/viewer_types.cpp --- a/TaskManager/Test/test_render/viewer_types.cpp Mon Jan 26 18:34:30 2009 +0900 +++ b/TaskManager/Test/test_render/viewer_types.cpp Tue Jan 27 18:21:12 2009 +0900 @@ -8,10 +8,10 @@ * 現在は offset は 2 の冪乗のみなので * これで問題ないけどどうなの? */ - //return d & (offset-1); + return d & (offset-1); // offset が 2 の冪乗以外はこれにしないとだめ - return d % offset; + //return d % offset; } /**