Mercurial > hg > Game > Cerium
annotate TaskManager/Test/test_render/spe/DrawSpan.cpp @ 203:1eba8570808c draft
fix CreateSpan::run
author | gongo@localhost.localdomain |
---|---|
date | Mon, 26 Jan 2009 18:30:35 +0900 |
parents | efd7e4712342 |
children | de235e3ef9d3 |
rev | line source |
---|---|
109 | 1 #include <stdlib.h> |
2 #include <string.h> | |
200 | 3 #include <spu_intrinsics.h> |
109 | 4 #include "DrawSpan.h" |
5 #include "polygon_pack.h" | |
6 #include "texture.h" | |
7 #include "viewer_types.h" | |
184 | 8 #include "Func.h" |
109 | 9 |
10 #define SPAN_PACK_LOAD 0 | |
120 | 11 #define TEX_LOAD 1 |
193 | 12 #define FB_STORE 2 |
109 | 13 |
194 | 14 //#define PROFILE |
15 | |
16 #if defined(PROFILE) | |
17 # include <spu_mfcio.h> | |
18 #endif | |
19 | |
109 | 20 SchedDefineTask(DrawSpan); |
21 | |
193 | 22 DrawSpan::~DrawSpan(void) |
23 { | |
24 smanager->dma_wait(FB_STORE); | |
25 free((void*)((int)linebuf*doneWrite)); | |
26 } | |
27 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
28 /** |
193 | 29 * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
30 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
31 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
32 * | 0 | 1 | 2 | 3 | 4 | 5 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
33 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
34 * | | | | | |11 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
35 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
36 * | | | | | |17 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
37 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
38 * | | | | | |23 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
39 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
40 * | | | | | |29 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
41 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
42 * | | | | | |35 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
43 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
44 * |
193 | 45 * 一辺を TEXTURE_SPLIT とする |
46 * 各ブロックの数字がブロックIDとなる。 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
47 */ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
48 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
49 /** |
193 | 50 * テクスチャの座標から、 |
51 * テクスチャのどのブロックかを求める | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
52 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
53 * @param[in] tx X coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
54 * @param[in] tx Y coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
55 * @param[in] twidth Width of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
56 * @return block ID |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
57 */ |
184 | 58 int |
59 DrawSpan::getTexBlock(int tx, int ty, int twidth) | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
60 { |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
61 int blockX, blockY; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
62 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
63 blockX = tx / TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
64 blockY = ty / TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
65 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
66 return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
67 } |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
68 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
69 /** |
193 | 70 * block ID と、テクスチャの TOP address から |
71 * (tx,ty) で使われるテクスチャの Tile addres を求める | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
72 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
73 * @param[in] tx X coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
74 * @param[in] tx Y coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
75 * @param[in] tw Width of texture |
193 | 76 * @param[in] tex_addr_top (tx,ty) で使うテクスチャの先頭address |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
77 * @return block ID |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
78 */ |
184 | 79 uint32* |
80 DrawSpan::getTile(int tx, int ty, int tw, uint32 *tex_addr_top) | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
81 { |
184 | 82 int block = getTexBlock(tx, ty, tw); |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
83 return tex_addr_top + block*TEXTURE_BLOCK_SIZE; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
84 } |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
85 |
193 | 86 /** |
87 * FrameBuffer に書き込む rgb の領域初期化 | |
88 * | |
89 * @param width Width of Buffer | |
90 * @param height Height of Buffer | |
91 * @param rgb Initial value of RGB at Buffer | |
92 * @return Buffer | |
93 */ | |
94 int* | |
95 DrawSpan::linebuf_init(int width, int height, int rgb) | |
109 | 96 { |
193 | 97 int *buf = (int*)smanager->allocate(sizeof(int)*width*height); |
98 | |
99 for (int i = 0; i < width*height; i++) { | |
109 | 100 buf[i] = rgb; |
101 } | |
193 | 102 |
103 return buf; | |
109 | 104 } |
105 | |
184 | 106 /** |
193 | 107 * Z-Buffer の初期化 |
184 | 108 * |
193 | 109 * @param width Width of Z-Buffer |
110 * @param height Height of Z-Buffer | |
111 * @return Z-Buffer | |
112 */ | |
113 float* | |
114 DrawSpan::zRow_init(int width, int height) | |
115 { | |
116 float *buf = (float*)smanager->allocate(sizeof(float)*width*height); | |
117 float def = 65535.0f; | |
118 | |
200 | 119 #if 1 |
193 | 120 for (int i = 0; i < width*height; i++) { |
121 buf[i] = def; | |
122 } | |
200 | 123 #else |
124 vector float init = {0.0f, 0.0f, 0.0f, 0.0f}; | |
125 vector float defi = {def, def, def, def}; | |
126 | |
127 for (int i = 0; i < width*height; i += 4) { | |
128 vector float *out = (vector float *)&buf[i]; | |
129 | |
130 *out = spu_add(init, defi); | |
131 } | |
132 #endif | |
193 | 133 |
134 return buf; | |
135 } | |
136 | |
137 | |
138 /** | |
139 * Span が使う Texture Tile があるか | |
140 * | |
141 * @retval != NULL 存在する | |
142 * @retval NULL 存在しない | |
184 | 143 */ |
144 TilePtr | |
145 DrawSpan::isAvailableTile(uint32 *addr) | |
146 { | |
147 return hash->get(addr); | |
148 } | |
149 | |
150 void | |
151 DrawSpan::set_rgb(uint32 *addr) | |
152 { | |
153 TilePtr tile; | |
154 | |
193 | 155 tile = tileList->nextTile(); |
156 /** | |
157 * FIFO なので、もし前のが残っていれば削除 | |
158 */ | |
159 hash->remove(tile->texture_addr); | |
160 | |
161 tile->texture_addr = addr; | |
162 | |
163 hash->put(tile->texture_addr, tile); | |
164 | |
165 smanager->dma_load(tile->pixel, (uint32)addr, | |
166 sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD); | |
184 | 167 } |
168 | |
169 void | |
170 DrawSpan::set_rgbs(uint32 *addr, uint32 *max_addr) | |
171 { | |
172 uint32 start = (uint32)addr; | |
173 uint32 end = (uint32)max_addr; | |
193 | 174 int length = (int)end-start; |
175 int diff = sizeof(int)*TEXTURE_BLOCK_SIZE; | |
176 int max_tile = 16; | |
177 | |
178 for (int i = 0, j = 0; i <= length && j < max_tile; i += diff, j++) { | |
184 | 179 set_rgb((uint32*)(start + i)); |
180 } | |
181 } | |
182 | |
193 | 183 uint32 |
166 | 184 DrawSpan::get_rgb(int tx, int ty, uint32 *addr) |
109 | 185 { |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
186 TilePtr tile; |
109 | 187 |
167
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
188 tile = hash->get(addr); |
168 | 189 return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx]; |
109 | 190 } |
191 | |
184 | 192 /** |
193 | 193 * DrawSpan の再起動 (DrawSpanRenew 生成) |
184 | 194 * |
193 | 195 * @param[in] spack 現在処理している SpanPack |
196 * @param[in] cur_span_x span->length_x != 1 の時の Span の処理で | |
197 * どこまで進んでいるか | |
184 | 198 */ |
199 void | |
200 DrawSpan::reboot(SpanPackPtr spack, int cur_span_x) | |
201 { | |
193 | 202 DrawSpanArgPtr args = |
203 (DrawSpanArgPtr)smanager->allocate(sizeof(DrawSpanArg)); | |
184 | 204 TaskPtr renew_task = smanager->create_task(TASK_DRAW_SPAN2); |
193 | 205 |
206 // 数が多いので構造体で渡す | |
207 args->display = smanager->get_param(0); | |
208 args->screen_width = smanager->get_param(1); | |
209 args->rangex_start = smanager->get_param(2); | |
210 args->rangex_end = smanager->get_param(3); | |
211 args->rangey = smanager->get_param(4); | |
212 renew_task->add_param((int)args); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
213 |
184 | 214 /** |
193 | 215 * SpanPack は続きから開始するので、 |
216 * 現在の状態をコピーしておく。 | |
217 * spack は rbuf から取得してる可能性があり | |
218 * rbuf はシステムが自動的に free() するため | |
219 * アドレスだけ渡すのはNG | |
184 | 220 */ |
221 SpanPackPtr curr = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
222 memcpy(curr, spack, sizeof(SpanPack)); | |
223 renew_task->add_param((int)curr); | |
224 renew_task->add_param(cur_span_x); | |
225 | |
193 | 226 // linebuf と zRow も引き継がせる |
227 renew_task->add_param((int)linebuf); | |
228 renew_task->add_param((int)zRow); | |
229 | |
184 | 230 /** |
193 | 231 * 再起動したタスクを待つ |
184 | 232 */ |
233 smanager->wait_task(renew_task); | |
234 | |
193 | 235 // next_spack は free() するので wait する |
184 | 236 smanager->dma_wait(SPAN_PACK_LOAD); |
237 } | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
238 |
193 | 239 void |
240 DrawSpan::writebuffer(unsigned int display, int buf_width, int height, | |
241 int screen_width) | |
242 { | |
243 for (int i = 0; i < height; i++) { | |
244 smanager->dma_store(&linebuf[i*buf_width], | |
245 display + (sizeof(int)*screen_width*i), | |
246 sizeof(int)*buf_width, FB_STORE); | |
247 } | |
248 | |
249 doneWrite = 1; | |
250 } | |
251 | |
194 | 252 #define Prof(st,cur) (((st)-(cur))/79800000.0f * 1000.0f) |
253 | |
109 | 254 int |
255 DrawSpan::run(void *rbuf, void *wbuf) | |
256 { | |
193 | 257 SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0); |
258 SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
259 SpanPackPtr free_spack = next_spack; // next_spack の free() 用 | |
260 Span *span; | |
261 | |
262 uint32 display = smanager->get_param(0); | |
263 int screen_width = smanager->get_param(1); | |
264 int rangex_start = smanager->get_param(2); | |
265 int rangex_end = smanager->get_param(3); | |
266 | |
267 // このタスクが担当する x の範囲 | |
268 int rangex = rangex_end - rangex_start + 1; | |
269 | |
270 // y の範囲 | |
271 int rangey = smanager->get_param(4); | |
203 | 272 |
167
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
273 hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); |
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
274 tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); |
128
95e2046eb46f
texture load use hash table
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
126
diff
changeset
|
275 |
193 | 276 zRow = zRow_init(rangex, rangey); |
277 linebuf = linebuf_init(rangex, rangey, 0xffffffff); | |
184 | 278 |
193 | 279 doneWrite = 0; |
184 | 280 |
194 | 281 int tileNum = 0; |
282 int flag = 0; | |
283 | |
284 #if defined(PROFILE) | |
285 uint32 profile = spu_read_decrementer(); | |
286 printf("%d %u DrawSpan start\n", smanager->get_cpuid(), profile); | |
287 #endif | |
109 | 288 do { |
289 /** | |
193 | 290 * SpanPack->next が存在する場合、 |
291 * 現在の SpanPack を処理してる間に | |
292 * 次の SpanPack の DMA 転送を行う | |
109 | 293 */ |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
294 if (spack->next != NULL) { |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
295 smanager->dma_load(next_spack, (uint32)spack->next, |
109 | 296 sizeof(SpanPack), SPAN_PACK_LOAD); |
297 } else { | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
298 next_spack = NULL; |
109 | 299 } |
300 | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
301 for (int t = 0; t < spack->info.size; t++) { |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
302 span = &spack->span[t]; |
109 | 303 |
193 | 304 uint32 rgb = 0x0000ff00; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
305 float tex1 = span->tex_x1; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
306 float tex2 = span->tex_x2; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
307 float tey1 = span->tex_y1; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
308 float tey2 = span->tex_y2; |
147 | 309 |
166 | 310 /** |
193 | 311 * Span が持つ 1 pixel 毎の |
312 * テクスチャの座標 | |
166 | 313 */ |
109 | 314 int tex_xpos; |
315 int tex_ypos; | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
316 |
166 | 317 /** |
193 | 318 * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と |
319 * そのブロックのアドレス(MainMemory) | |
166 | 320 */ |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
321 int tex_localx; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
322 int tex_localy; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
323 uint32 *tex_addr; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
324 |
109 | 325 int x = span->x; |
326 int y = span->y; | |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
327 int x_len = span->length_x; |
109 | 328 float z = span->start_z; |
329 float zpos = span->end_z; | |
330 | |
193 | 331 // 座標が [0 .. split_screen_w-1] に入るように x,y を -1 |
109 | 332 int localx = getLocalX(x-1); |
333 int localy = getLocalY(y-1); | |
131 | 334 |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
335 if (x_len == 1) { |
109 | 336 if (x < rangex_start || rangex_end < x) { |
337 continue; | |
338 } | |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
339 |
194 | 340 flag = 1; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
341 tex_xpos = (int)((span->tex_width-1) * tex1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
342 tex_ypos = (int)((span->tex_height-1) * tey1); |
109 | 343 |
193 | 344 if (zpos < zRow[localx + (rangex*localy)]) { |
166 | 345 tex_addr = getTile(tex_xpos, tex_ypos, |
346 span->tex_width, span->tex_addr); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
347 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
348 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
166 | 349 |
184 | 350 if (!isAvailableTile(tex_addr)) { |
194 | 351 # if defined(PROFILE) |
352 printf("%d %u start load tile\n", | |
353 smanager->get_cpuid(), spu_read_decrementer()); | |
354 # endif | |
192 | 355 set_rgb(tex_addr); |
193 | 356 smanager->dma_wait(TEX_LOAD); |
194 | 357 # if defined(PROFILE) |
358 printf("%d %u end load tile\n", | |
359 smanager->get_cpuid(), spu_read_decrementer()); | |
360 # endif | |
361 tileNum++; | |
184 | 362 } |
363 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
364 rgb = get_rgb(tex_localx, tex_localy, tex_addr); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
365 |
193 | 366 zRow[localx + (rangex*localy)] = zpos; |
367 linebuf[localx + (rangex*localy)] = rgb; | |
109 | 368 } |
369 } else { | |
370 int js = (x < rangex_start) ? rangex_start - x : 0; | |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
371 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
372 float tex_x, tex_y, tex_z; |
109 | 373 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
374 for (int j = js; j <= je; j++) { |
194 | 375 flag = 1; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
376 localx = getLocalX(x-1+j); |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
377 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
378 tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1); |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
379 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
380 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
381 tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
382 if (tex_x > 1) tex_x = 1; |
165 | 383 if (tex_x < 0) tex_x = 0; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
384 if (tex_y > 1) tex_y = 1; |
165 | 385 if (tex_y < 0) tex_y = 0; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
386 tex_xpos = (int)((span->tex_width-1) * tex_x); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
387 tex_ypos = (int)((span->tex_height-1) * tex_y); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
388 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
389 if (tex_z < zRow[localx + (rangex*localy)]) { |
166 | 390 tex_addr = getTile(tex_xpos, tex_ypos, |
391 span->tex_width, span->tex_addr); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
392 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
393 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
184 | 394 |
193 | 395 /** |
396 * Tile が無い場合、一旦タスクはここで中断し、 | |
397 * Tile をロードするタスクを走らせた後に再起動する | |
398 */ | |
184 | 399 if (!isAvailableTile(tex_addr)) { |
400 spack->info.start = t; | |
194 | 401 #if 0 |
184 | 402 set_rgbs(tex_addr, |
403 getTile(span->tex_width-1, tex_ypos, | |
404 span->tex_width, span->tex_addr)); | |
193 | 405 //smanager->dma_wait(TEX_LOAD); |
184 | 406 reboot(spack, j); |
407 goto FINISH; | |
193 | 408 #else |
194 | 409 |
410 # if defined(PROFILE) | |
411 printf("%d %u start load tile\n", | |
412 smanager->get_cpuid(), | |
413 spu_read_decrementer()); | |
414 # endif | |
415 | |
193 | 416 set_rgb(tex_addr); |
417 smanager->dma_wait(TEX_LOAD); | |
194 | 418 tileNum++; |
419 | |
420 # if defined(PROFILE) | |
421 printf("%d %u end load tile\n", | |
422 smanager->get_cpuid(), | |
423 spu_read_decrementer()); | |
424 # endif | |
193 | 425 #endif |
184 | 426 } |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
427 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
428 rgb = get_rgb(tex_localx, tex_localy, tex_addr); |
194 | 429 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
430 zRow[localx + (rangex*localy)] = tex_z; |
193 | 431 linebuf[localx + (rangex*localy)] = rgb; |
147 | 432 } |
109 | 433 } |
434 } | |
435 } | |
147 | 436 |
200 | 437 for (int t = 0; t < spack->info.size; t++) { |
438 span = &spack->span[t]; | |
439 | |
440 uint32 rgb = 0x0000ff00; | |
441 float tex1 = span->tex_x1; | |
442 float tex2 = span->tex_x2; | |
443 float tey1 = span->tex_y1; | |
444 float tey2 = span->tex_y2; | |
445 | |
446 /** | |
447 * Span が持つ 1 pixel 毎の | |
448 * テクスチャの座標 | |
449 */ | |
450 int tex_xpos; | |
451 int tex_ypos; | |
452 | |
453 /** | |
454 * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と | |
455 * そのブロックのアドレス(MainMemory) | |
456 */ | |
457 int tex_localx; | |
458 int tex_localy; | |
459 uint32 *tex_addr; | |
460 | |
461 int x = span->x; | |
462 int y = span->y; | |
463 int x_len = span->length_x; | |
464 float z = span->start_z; | |
465 float zpos = span->end_z; | |
466 | |
467 // 座標が [0 .. split_screen_w-1] に入るように x,y を -1 | |
468 int localx = getLocalX(x-1); | |
469 int localy = getLocalY(y-1); | |
470 | |
471 if (x_len == 1) { | |
472 if (x < rangex_start || rangex_end < x) { | |
473 continue; | |
474 } | |
475 | |
476 flag = 1; | |
477 tex_xpos = (int)((span->tex_width-1) * tex1); | |
478 tex_ypos = (int)((span->tex_height-1) * tey1); | |
479 | |
480 if (zpos < zRow[localx + (rangex*localy)]) { | |
481 tex_addr = getTile(tex_xpos, tex_ypos, | |
482 span->tex_width, span->tex_addr); | |
483 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | |
484 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | |
485 | |
486 if (!isAvailableTile(tex_addr)) { | |
487 # if defined(PROFILE) | |
488 printf("%d %u start load tile\n", | |
489 smanager->get_cpuid(), spu_read_decrementer()); | |
490 # endif | |
491 set_rgb(tex_addr); | |
492 smanager->dma_wait(TEX_LOAD); | |
493 # if defined(PROFILE) | |
494 printf("%d %u end load tile\n", | |
495 smanager->get_cpuid(), spu_read_decrementer()); | |
496 # endif | |
497 tileNum++; | |
498 } | |
499 | |
500 rgb = get_rgb(tex_localx, tex_localy, tex_addr); | |
501 | |
502 zRow[localx + (rangex*localy)] = zpos; | |
503 linebuf[localx + (rangex*localy)] = rgb; | |
504 } | |
505 } else { | |
506 int js = (x < rangex_start) ? rangex_start - x : 0; | |
507 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; | |
508 float tex_x, tex_y, tex_z; | |
509 | |
510 for (int j = js; j <= je; j++) { | |
511 flag = 1; | |
512 localx = getLocalX(x-1+j); | |
513 | |
514 tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1); | |
515 | |
516 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); | |
517 tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); | |
518 if (tex_x > 1) tex_x = 1; | |
519 if (tex_x < 0) tex_x = 0; | |
520 if (tex_y > 1) tex_y = 1; | |
521 if (tex_y < 0) tex_y = 0; | |
522 tex_xpos = (int)((span->tex_width-1) * tex_x); | |
523 tex_ypos = (int)((span->tex_height-1) * tex_y); | |
524 | |
525 if (tex_z < zRow[localx + (rangex*localy)]) { | |
526 tex_addr = getTile(tex_xpos, tex_ypos, | |
527 span->tex_width, span->tex_addr); | |
528 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | |
529 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | |
530 | |
531 /** | |
532 * Tile が無い場合、一旦タスクはここで中断し、 | |
533 * Tile をロードするタスクを走らせた後に再起動する | |
534 */ | |
535 if (!isAvailableTile(tex_addr)) { | |
536 spack->info.start = t; | |
537 #if 0 | |
538 set_rgbs(tex_addr, | |
539 getTile(span->tex_width-1, tex_ypos, | |
540 span->tex_width, span->tex_addr)); | |
541 //smanager->dma_wait(TEX_LOAD); | |
542 reboot(spack, j); | |
543 goto FINISH; | |
544 #else | |
545 | |
546 # if defined(PROFILE) | |
547 printf("%d %u start load tile\n", | |
548 smanager->get_cpuid(), | |
549 spu_read_decrementer()); | |
550 # endif | |
551 | |
552 set_rgb(tex_addr); | |
553 smanager->dma_wait(TEX_LOAD); | |
554 tileNum++; | |
555 | |
556 # if defined(PROFILE) | |
557 printf("%d %u end load tile\n", | |
558 smanager->get_cpuid(), | |
559 spu_read_decrementer()); | |
560 # endif | |
561 #endif | |
562 } | |
563 | |
564 rgb = get_rgb(tex_localx, tex_localy, tex_addr); | |
565 | |
566 zRow[localx + (rangex*localy)] = tex_z; | |
567 linebuf[localx + (rangex*localy)] = rgb; | |
568 } | |
569 } | |
570 } | |
571 } | |
572 | |
109 | 573 smanager->dma_wait(SPAN_PACK_LOAD); |
574 | |
184 | 575 SpanPackPtr tmp_spack = spack; |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
576 spack = next_spack; |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
577 next_spack = tmp_spack; |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
578 } while (spack); |
109 | 579 |
193 | 580 writebuffer(display, rangex, rangey, screen_width); |
581 | |
582 // linebuf は、writebuffer() の dma_store を wait する | |
583 // DrawSpan::~DrawSpan() 内で free する。 | |
584 //free(linebuf); | |
585 free(zRow); | |
184 | 586 |
587 FINISH: | |
193 | 588 /** |
589 * goto FINISH; の時は reboot なので | |
590 * linebuf, zRow は free() しない | |
591 */ | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
592 free(free_spack); |
194 | 593 |
594 #if defined(PROFILE) | |
595 printf("%d %u DrawSpan end\n", | |
596 smanager->get_cpuid(), spu_read_decrementer()); | |
597 if (flag) { | |
598 printf("%d %d tileNum\n", smanager->get_cpuid(), tileNum); | |
599 } | |
600 #endif | |
109 | 601 |
602 return 0; | |
603 } |