changeset 176:08e2bb36639b

fix
author gongo@localhost.localdomain
date Tue, 16 Dec 2008 17:01:24 +0900
parents 3cc5f0000e29
children e742053c4c87
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)],