Mercurial > hg > Game > Cerium
changeset 176:be90197f90d4 draft
fix
author | gongo@localhost.localdomain |
---|---|
date | Tue, 16 Dec 2008 17:01:24 +0900 |
parents | 1268e1a9a7db |
children | deb02b0e6291 |
files | TaskManager/Test/test_render/ChangeLog TaskManager/Test/test_render/Tapestry.h TaskManager/Test/test_render/spe/CreateSpan.cpp TaskManager/Test/test_render/spe/CreateSpan.h TaskManager/Test/test_render/sys.cpp TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp TaskManager/Test/test_render/task/CreateSpan.cpp TaskManager/Test/test_render/task/CreateSpan.h TaskManager/Test/test_render/viewer.cpp |
diffstat | 9 files changed, 111 insertions(+), 91 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/ChangeLog Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/ChangeLog Tue Dec 16 17:01:24 2008 +0900 @@ -1,5 +1,30 @@ +2008-12-16 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> + + * spe/CreateSpan.cpp (CreateSpan::half_triangle): fix + getScale に渡す tex_width,tex_height を修正。 + 比較にそのまま tex_width, tex_height を使うと、 + Span が持つテクスチャが全体の一部分だったとしても + 比較結果で縮小が行われてしまうため。 + + - 例 + span->length_x = 32; + tex_width = 128; + tex_x_len = (span->tex_x2 - span->tex_x1) = (0.5 - 0.3) = 0.2; + + 今までの処理だと、span->length_x < tex_width の結果により + 縮小されたテクスチャを使うことになる。 + しかし、実際に Span が使う Texture の長さは + + tex_width*tex_x_len = 24 + + なので、縮小を行う必要は無い + + 2008-12-12 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> + * SceneGraph.cpp (SceneGraph::get_data): Todo + テクスチャの縦横が 8 の倍数でなければ弾く処理を入れる。 + * spe/DrawSpan.cpp (DrawSpan::run): Todo テクスチャの座標計算と、そこから取得できる Tile の DMA を 一スレッドで処理しているのでそれを分けないといけない
--- a/TaskManager/Test/test_render/Tapestry.h Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/Tapestry.h Tue Dec 16 17:01:24 2008 +0900 @@ -86,8 +86,11 @@ int pad[3]; } Tile, *TilePtr; -#define MAX_TILE 100 +#define MAX_TILE 128 +/** + * TileList 中の Tile の追い出しは、現在 FIFO で実装している + */ class TileList { public: int curIndex; @@ -99,6 +102,10 @@ } /** + * 次に扱う tile を取得する + * + * @return tile + * * tile[] をリングバスっぽく扱うことで * FIFO を実現することに。 */ @@ -108,6 +115,10 @@ return t; } + /** + * TileList のクリア + * tile 自体は clear する必要は無い + */ void clear(void) { curIndex = 0; }
--- a/TaskManager/Test/test_render/spe/CreateSpan.cpp Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/spe/CreateSpan.cpp Tue Dec 16 17:01:24 2008 +0900 @@ -180,11 +180,13 @@ * @param[in] tex_addr triangle が参照するテクスチャの先頭アドレス * @param[in] tex_width テクスチャの width * @param[in] tex_height テクスチャの height + * @param[in] tex_scale_max テクスチャの最大縮小率 (2^n) * @param[in] vMin triangle の座標 * @param[in] vMid triangle の座標。triangle を二つに分けて出来た新しい座標 * @param[in] vMid10 triangle の座標 - * @param[in] y_length 分割する前の Triangle の y の長さ - * + * @param[in] length_y 分割する前の Triangle の y の長さ + * @param[in] tex_y_len 分割する前の Triangle に貼られている Texture の + * 長さの割合 (0 ... 1) */ void CreateSpan::half_triangle(SpanPackPtr *spackList, @@ -192,7 +194,7 @@ uint32 *tex_addr, int tex_width, int tex_height, int tex_scale_max, VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10, - int y_length) + int length_y, float tex_y_len) { float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; float tmp_xpos,tmp_end,tmp_zpos; @@ -233,7 +235,6 @@ * 現在はこれで代用。 * half_triangle 呼ぶ前にこれを判断できれば良いかもしれない。 * てかこんなんでいいのかよ。。。 - * */ #if 1 if ((int)div_y == 0) { @@ -372,11 +373,19 @@ span->tex_y1 = start_tex_y; span->tex_y2 = end_tex_y; - int scale = getScale(span->length_x, y_length, - span->tex_width, span->tex_height, tex_scale_max); + + float tex_x_len = span->tex_x2 - span->tex_x1; - //scale = (16 > tex_scale_max) ? tex_scale_max : 16; + /** + * tex_x_len, tex_y_len を掛ける理由は + * Changelog の 2008-12-16 を参照 + */ + 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 = (4 > tex_scale_max) ? tex_scale_max : 4; + uint32 *tapestry = getTapestry(tex_width, tex_height, scale, tex_addr); span->tex_addr = tapestry; @@ -482,14 +491,14 @@ triPack->tex_info.addr, triPack->tex_info.width, triPack->tex_info.height, - triPack->tex_info.scale_max, - vMin, vMid, vMid10, (int)(vMax->y - vMin->y)); + triPack->tex_info.scale_max, vMin, vMid, vMid10, + (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y); half_triangle(spackList, charge_y_top, charge_y_end, 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, (int)(vMax->y - vMin->y)); + pp->tri[0].tex_info.scale_max, vMax, vMid, vMid10, + (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y); } smanager->dma_wait(POLYGON_PACK_LOAD);
--- a/TaskManager/Test/test_render/spe/CreateSpan.h Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/spe/CreateSpan.h Tue Dec 16 17:01:24 2008 +0900 @@ -23,7 +23,7 @@ uint32 *tex_addr, int tex_width, int tex_height, int tex_scale_max, VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1, - int y_length); + int length_y, float tex_y_len); void setTileInfoList(SpanPtr span); void setTileInfo(TileInfoPtr tile, int xpos, int ypos, int tex_width, uint32* tex_addr_top);
--- a/TaskManager/Test/test_render/sys.cpp Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/sys.cpp Tue Dec 16 17:01:24 2008 +0900 @@ -61,7 +61,7 @@ if(stack) { - matrix4x4(matrix, m, stack); + matrix4x4(matrix, m, stack); } }
--- a/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp Tue Dec 16 17:01:24 2008 +0900 @@ -94,7 +94,7 @@ xyz3[1] = sg->data[(i+2)*3+1]; xyz3[2] = sg->data[(i+2)*3+2]*-1; xyz3[3] = 1; - + rotate(xyz1, sg->matrix); rotate(xyz2, sg->matrix); rotate(xyz3, sg->matrix);
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreateSpan.cpp Tue Dec 16 17:01:24 2008 +0900 @@ -83,47 +83,6 @@ } /** - * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する - * - * +---+---+---+---+---+---+ - * | 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_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; -} - -/** * 与えられた scale から、実際に使うテクスチャの Tapestry を選択する * * テクスチャは、オリジナルのサイズから、可能なかぎり 1/2 で縮小していき、 @@ -172,11 +131,11 @@ * span の width,height と texture の width,height を比べて * span を描画する際に使う texture の比率を求める * - * @param width Width of span - * @param height Height of span - * @param tex_width Width of 1/1 texture that span use - * @param tex_height Height of 1/1 texture that span use - * @param scale_max この Span で使う texture の最大縮小率 + * @param[in] width Width of span + * @param[in] height Height of span + * @param[in] tex_width Width of 1/1 texture that span use + * @param[in] tex_height Height of 1/1 texture that span use + * @param[in] scale_max この Span で使う texture の最大縮小率 * 計算結果が scale_max 以上になるのを防ぐ * @return 描画に使う texture の比率 * width と height は 1/scale の画像を使う @@ -215,17 +174,19 @@ * x軸に水平な辺を持つ三角形ポリゴンから、 * Span を抜き出す * - * @param spackList triangle から生成された span を格納する List - * @param charge_y_top 担当する y の範囲開始地点 - * @param charge_y_end 担当する y の範囲終了地点 - * @param tex_addr triangle が参照するテクスチャの先頭アドレス - * @param tex_width テクスチャの width - * @param tex_height テクスチャの height - * @param vMin triangle の座標 - * @param vMid triangle の座標。triangle を二つに分けて出来た新しい座標 - * @param vMid10 triangle の座標 - * @param y_length 分割する前の Triangle の y の長さ - * + * @param[in] spackList triangle から生成された span を格納する List + * @param[in] charge_y_top 担当する y の範囲開始地点 + * @param[in] charge_y_end 担当する y の範囲終了地点 + * @param[in] tex_addr triangle が参照するテクスチャの先頭アドレス + * @param[in] tex_width テクスチャの width + * @param[in] tex_height テクスチャの height + * @param[in] tex_scale_max テクスチャの最大縮小率 (2^n) + * @param[in] vMin triangle の座標 + * @param[in] vMid triangle の座標。triangle を二つに分けて出来た新しい座標 + * @param[in] vMid10 triangle の座標 + * @param[in] length_y 分割する前の Triangle の y の長さ + * @param[in] tex_y_len 分割する前の Triangle に貼られている Texture の + * 長さの割合 (0 ... 1) */ void CreateSpan::half_triangle(SpanPackPtr *spackList, @@ -233,7 +194,7 @@ uint32 *tex_addr, int tex_width, int tex_height, int tex_scale_max, VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10, - int y_length) + int length_y, float tex_y_len) { float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; float tmp_xpos,tmp_end,tmp_zpos; @@ -274,7 +235,6 @@ * 現在はこれで代用。 * half_triangle 呼ぶ前にこれを判断できれば良いかもしれない。 * てかこんなんでいいのかよ。。。 - * */ #if 1 if ((int)div_y == 0) { @@ -413,11 +373,19 @@ span->tex_y1 = start_tex_y; span->tex_y2 = end_tex_y; - int scale = getScale(span->length_x, y_length, - span->tex_width, span->tex_height, tex_scale_max); + + float tex_x_len = span->tex_x2 - span->tex_x1; - //scale = (16 > tex_scale_max) ? tex_scale_max : 16; + /** + * tex_x_len, tex_y_len を掛ける理由は + * Changelog の 2008-12-16 を参照 + */ + 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 = (4 > tex_scale_max) ? tex_scale_max : 4; + uint32 *tapestry = getTapestry(tex_width, tex_height, scale, tex_addr); span->tex_addr = tapestry; @@ -523,14 +491,14 @@ triPack->tex_info.addr, triPack->tex_info.width, triPack->tex_info.height, - triPack->tex_info.scale_max, - vMin, vMid, vMid10, (int)(vMax->y - vMin->y)); + triPack->tex_info.scale_max, vMin, vMid, vMid10, + (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y); half_triangle(spackList, charge_y_top, charge_y_end, 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, (int)(vMax->y - vMin->y)); + pp->tri[0].tex_info.scale_max, vMax, vMid, vMid10, + (int)(vMax->y - vMin->y), vMax->tex_y - vMin->tex_y); } smanager->dma_wait(POLYGON_PACK_LOAD);
--- a/TaskManager/Test/test_render/task/CreateSpan.h Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreateSpan.h Tue Dec 16 17:01:24 2008 +0900 @@ -23,7 +23,7 @@ uint32 *tex_addr, int tex_width, int tex_height, int tex_scale_max, VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1, - int y_length); + int length_y, float tex_y_len); void setTileInfoList(SpanPtr span); void setTileInfo(TileInfoPtr tile, int xpos, int ypos, int tex_width, uint32* tex_addr_top);
--- a/TaskManager/Test/test_render/viewer.cpp Fri Dec 12 17:48:42 2008 +0900 +++ b/TaskManager/Test/test_render/viewer.cpp Tue Dec 16 17:01:24 2008 +0900 @@ -21,7 +21,7 @@ extern SceneGraphPtr scene_graph; extern SceneGraphPtr scene_graph_viewer; -/* Data Pack */ +/* Data Pack sent to Other CPUs (ex. SPE) */ SceneGraphPack *sgpack; PolygonPack *ppack; SpanPackPtr spackList; @@ -30,6 +30,10 @@ int spackList_length_align; /** + * + */ + +/** * Joystick があればそれを使い、 * 無ければキーボードを返す */ @@ -154,9 +158,15 @@ spackList_length = (this->height + split_screen_h - 1) / split_screen_h; spackList = (SpanPack*)manager->malloc(sizeof(SpanPack)*spackList_length); - // SPU に送る address list は 16 倍数でないといけない。 - // spackList_length*sizeof(SpanPack*) が 16 倍数になるような - // length_align を求めている。 + /** + * SPU に送る address list は 16 バイト倍数でないといけない。 + * spackList_length*sizeof(SpanPack*) が 16 バイト倍数になるような + * length_align を求めている。はみ出した部分は使われない + * (ex) spackList_length が 13 の場合 + * spackList_length_align = 16; + * 実際に送るデータは64バイトになるのでOK + * 14,15,16 の部分は何も入らない。 + */ spackList_length_align = (spackList_length + 3)&(~3); /* 各 SPU が持つ、SpanPack の address list */ @@ -185,12 +195,9 @@ task_sgp->spawn(); #endif - int tex_width = scene_graph->texture_image->w; - int tex_height = scene_graph->texture_image->h; - int tex_blocksize = tex_width*tex_height*4; - for (int i = 0; i < spe_num; i++) { task_tex = manager->create_task(TASK_INIT_TEXTURE); + /* ここはもう少しわかりやすい使い方がいいかもしれぬ。こんなもん? */ task_tex->set_cpu((CPU_TYPE)((int)SPE_0 + i)); task_next->wait_for(task_tex); task_tex->spawn(); @@ -323,7 +330,7 @@ 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+start_y-1)],