diff TaskManager/Test/test_render/task/CreateSpan.cpp @ 141:fc314f28b66e

TileList を作ろうとしたがに動かない。 今はTileList 無しver
author gongo@charles.cr.ie.u-ryukyu.ac.jp
date Sat, 29 Nov 2008 01:18:32 +0900
parents 6cf991f28c6c
children ff3fb47c2553
line wrap: on
line diff
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp	Fri Nov 28 15:24:55 2008 +0900
+++ b/TaskManager/Test/test_render/task/CreateSpan.cpp	Sat Nov 29 01:18:32 2008 +0900
@@ -4,6 +4,9 @@
 static const int SPAN_PACK_LOAD    = 5;
 static const int SPAN_PACK_STORE   = 6;
 static const int POLYGON_PACK_LOAD = 7;
+static const int TILE_ALLOCATE  = 8;
+static const int TILE_LOAD  = 9;
+static const int TILE_STORE = 10;
 
 static SpanPackPtr spack = NULL;
 static SpanPackPtr send_spack = NULL;
@@ -79,6 +82,101 @@
 
 
 /**
+ * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく
+ * 
+ */
+void
+CreateSpan::setTile(SpanPtr span)
+{
+    TileInfoListPtr tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
+    TileInfoListPtr send_tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));;
+    TileInfoListPtr tilelist_addr;
+    TileInfoListPtr tmp = NULL;
+
+    TileInfoPtr tile;
+    int remain = span->length_x; // 残りのドット(Tile)数
+    int len = 0;
+
+    //smanager->mainMem_wait();
+    tilelist_addr = (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE);
+    span->tilelist = tilelist_addr;
+    smanager->dma_load(tilelist, (uint32)tilelist_addr,
+		       sizeof(TileInfoList), TILE_LOAD);
+
+    uint32 hoge = (uint32)tilelist_addr;
+    
+    while (remain > 0) {
+	if (remain > MAX_TILE_LIST) {
+	    smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
+	    len = MAX_TILE_LIST;
+	} else {
+	    len = remain;
+	}
+
+	float tex1 = span->tex_x1;
+	float tex2 = span->tex_x2;
+	float tey1 = span->tex_y1;
+	float tey2 = span->tex_y2;
+	int tex_xpos;
+	int tex_ypos;
+
+	smanager->dma_wait(TILE_LOAD);
+
+	if (len == 1) {
+	    tile = &tilelist->tileinfo[tilelist->size++];
+	    tex_xpos = (int)((span->tex_width-1) * tex1);
+	    tex_ypos = (int)((span->tex_height-1) * tey1);
+	} else {
+	    float tex_x, tex_y;
+
+	    for (int i = 0; i < len; i++) {
+		tile = &tilelist->tileinfo[tilelist->size++];
+
+		tex_x = tex1*(len-1-i)/(len-1) + tex2*i/(len-1);
+		tex_y = tey1*(len-1-i)/(len-1) + tey2*i/(len-1);
+		if (tex_x > 1) tex_x = 1;
+		if (tex_y > 1) tex_y = 1;
+		tex_xpos = (int)((span->tex_height-1) * tex_x);
+		tex_ypos = (int)((span->tex_width-1) * tex_y);
+
+		tile->tix = tex_xpos;
+		tile->tiy = tex_ypos;
+	    }
+	}
+
+	if (remain > MAX_TILE_LIST) {
+	    TileInfoListPtr send = tilelist_addr;
+
+	    tmp = tilelist;
+	    tilelist = send_tilelist;
+	    send_tilelist = tmp;
+
+	    smanager->mainMem_wait();
+	    tilelist_addr =
+		(TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE);
+
+	    send_tilelist->next = tilelist_addr;
+
+	    smanager->dma_wait(TILE_STORE);
+	    smanager->dma_store(send_tilelist, (uint32)send,
+				sizeof(TileInfoList),TILE_STORE);
+	    
+	    smanager->dma_load(tilelist, (uint32)tilelist_addr,
+			       sizeof(TileInfoList), TILE_LOAD);    
+	}
+	remain -= MAX_TILE_LIST;
+    }
+
+    smanager->dma_wait(TILE_STORE);
+    smanager->dma_store(tilelist, (uint32)tilelist_addr,
+			sizeof(TileInfoList), TILE_STORE);
+    smanager->dma_wait(TILE_STORE);
+
+    free(tilelist);
+    free(send_tilelist);
+}
+
+/**
  * x軸に水平な辺を持つ三角形ポリゴンから、
  * Span を抜き出す
  */
@@ -109,7 +207,6 @@
 
     SpanPackPtr tmp_spack;
 
-
     /**
      * 三角形ポリゴンをx軸に水平に二つに分けようとして
      * ある一辺がすでに水平だった場合、つまり
@@ -185,9 +282,9 @@
 	    if (spack->info.size >= MAX_SIZE_SPAN) {
 		SpanPackPtr next;
 		
-		mainMem_alloc(0, sizeof(SpanPack));
-		mainMem_wait();
-		next = (SpanPackPtr)mainMem_get(0);
+		smanager->mainMem_alloc(0, sizeof(SpanPack));
+		smanager->mainMem_wait();
+		next = (SpanPackPtr)smanager->mainMem_get(0);
 		
 		spack->next = next;
 
@@ -200,7 +297,7 @@
 				    sizeof(SpanPack), SPAN_PACK_STORE);
 
 		spackList[index] = next;
-
+		
 		smanager->dma_load(spack, (uint32)spackList[index],
 				   sizeof(SpanPack), SPAN_PACK_LOAD);
 		smanager->dma_wait(SPAN_PACK_LOAD);
@@ -213,6 +310,11 @@
 	    continue;
 	}
 
+	/**
+	 * メインメモリに、Tile 用の領域確保をここで指定しておく
+	 */ 
+	smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
+	
 	tmp_xpos = calc(vMid10->x - vMin->x ,div_y, i, vMin->x);
 	tmp_end  = calc(vMid->x  - vMin->x ,div_y, i, vMin->x);
 	tmp_z    = calc(vMid10->z - vMin->z ,div_y, i, vMin->z);
@@ -273,6 +375,8 @@
 	// TilePtr の計算
 	// tix, tiy (Tile 内での x, y)
 	//
+	smanager->mainMem_wait();
+	setTile(span);
     }
 }