Mercurial > hg > Game > Cerium
comparison TaskManager/Test/test_render/spe/DrawSpan.cpp @ 210:e75f9eb97180 draft
fix DrawSpan
author | gongo@localhost.localdomain |
---|---|
date | Fri, 30 Jan 2009 14:55:04 +0900 |
parents | de235e3ef9d3 |
children | 53cd9cf3ab99 |
comparison
equal
deleted
inserted
replaced
209:6107b8c95307 | 210:e75f9eb97180 |
---|---|
5 #include "polygon_pack.h" | 5 #include "polygon_pack.h" |
6 #include "texture.h" | 6 #include "texture.h" |
7 #include "viewer_types.h" | 7 #include "viewer_types.h" |
8 #include "Func.h" | 8 #include "Func.h" |
9 | 9 |
10 #define SPAN_PACK_LOAD 0 | |
11 #define TEX_LOAD 1 | |
12 #define FB_STORE 2 | |
13 | |
14 SchedDefineTask(DrawSpan); | 10 SchedDefineTask(DrawSpan); |
11 | |
12 #define TEX_LOAD1 0 | |
13 #define TEX_LOAD2 1 | |
14 #define SPAN_PACK_LOAD 2 | |
15 #define FB_STORE 3 | |
15 | 16 |
16 DrawSpan::~DrawSpan(void) | 17 DrawSpan::~DrawSpan(void) |
17 { | 18 { |
18 smanager->dma_wait(FB_STORE); | 19 smanager->dma_wait(FB_STORE); |
19 free((void*)((int)linebuf*doneWrite)); | 20 free((void*)((int)linebuf*doneWrite)); |
138 #if 0 | 139 #if 0 |
139 for (int i = 0; i < width*height; i++) { | 140 for (int i = 0; i < width*height; i++) { |
140 buf[i] = def; | 141 buf[i] = def; |
141 } | 142 } |
142 #else | 143 #else |
143 vector float init = {0.0f, 0.0f, 0.0f, 0.0f}; | 144 vector float init = spu_splats(0.0f); |
144 vector float defi = {def, def, def, def}; | 145 vector float defi = spu_splats(def); |
145 | 146 |
146 for (int i = 0; i < width*height; i += 4) { | 147 for (int i = 0; i < width*height; i += 4) { |
147 vector float *out = (vector float *)&buf[i]; | 148 vector float *out = (vector float *)&buf[i]; |
148 | 149 |
149 *out = spu_add(init, defi); | 150 *out = spu_add(init, defi); |
165 { | 166 { |
166 return hash->get(addr); | 167 return hash->get(addr); |
167 } | 168 } |
168 | 169 |
169 void | 170 void |
170 DrawSpan::set_rgb(uint32 *addr) | 171 DrawSpan::set_rgb(uint32 *addr, int tag) |
171 { | 172 { |
172 TilePtr tile; | 173 TilePtr tile; |
174 | |
175 if (isAvailableTile(addr)) { | |
176 return; | |
177 } | |
173 | 178 |
174 tile = tileList->nextTile(); | 179 tile = tileList->nextTile(); |
175 /** | 180 /** |
176 * FIFO なので、もし前のが残っていれば削除 | 181 * FIFO なので、もし前のが残っていれば削除 |
177 */ | 182 */ |
178 hash->remove(tile->texture_addr); | 183 hash->remove(tile->texture_addr); |
179 | 184 |
180 tile->texture_addr = addr; | 185 tile->texture_addr = addr; |
181 | 186 |
182 hash->put(tile->texture_addr, tile); | 187 int index = hash->put(tile->texture_addr, tile); |
183 | |
184 smanager->dma_load(tile->pixel, (uint32)addr, | 188 smanager->dma_load(tile->pixel, (uint32)addr, |
185 sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD); | 189 sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag); |
186 } | 190 } |
187 | 191 |
192 /** | |
193 * | |
194 */ | |
188 void | 195 void |
189 DrawSpan::set_rgbs(uint32 *addr, uint32 *max_addr) | 196 DrawSpan::set_rgbs(uint32 *cur_addr, uint32 *max_addr, int wait_tag) |
190 { | 197 { |
191 uint32 start = (uint32)addr; | 198 uint32 curp = (uint32)cur_addr; |
192 uint32 end = (uint32)max_addr; | 199 uint32 maxp = (uint32)max_addr; |
193 int length = (int)end-start; | 200 uint32 startp = curp; |
194 int diff = sizeof(int)*TEXTURE_BLOCK_SIZE; | 201 uint32 diff = sizeof(int)*TEXTURE_BLOCK_SIZE; |
195 int max_tile = 16; | 202 int length = (int)maxp-(int)curp; |
196 | 203 |
197 for (int i = 0, j = 0; i <= length && j < max_tile; i += diff, j++) { | 204 int cmp = (length < 0); |
198 set_rgb((uint32*)(start + i)); | 205 |
206 #if 1 | |
207 length += cmp*(-1)*length*2; | |
208 startp = cmp*maxp + !cmp*curp; | |
209 #else | |
210 if (length < 0) { | |
211 length = -length; | |
212 startp = maxp; | |
213 } | |
214 #endif | |
215 | |
216 for (int i = 0; i <= length; i += diff) { | |
217 set_rgb((uint32*)(startp + i), wait_tag); | |
199 } | 218 } |
200 } | 219 } |
201 | 220 |
202 uint32 | 221 uint32 |
203 DrawSpan::get_rgb(int tx, int ty, uint32 *addr) | 222 DrawSpan::get_rgb(int tx, int ty, uint32 *addr) |
267 | 286 |
268 doneWrite = 1; | 287 doneWrite = 1; |
269 } | 288 } |
270 | 289 |
271 /** | 290 /** |
291 * zRow と Linebuf を更新する | |
292 * | |
293 * @param zpos 更新する pixel のZ座標 | |
294 * @param rangex このタスクが処理する描画領域の x の長さ | |
295 * @param x pixel の、描画領域内での x 座標 | |
296 * @param y 〃 の、y 座標 | |
297 * @param tex_x pixel が使用するテクスチャの、Tile (8x8) 内での x 座標 | |
298 * @param tex_y 〃 の y 座標 | |
299 * @param tex_addr テクスチャのアドレス(MainMemory) | |
300 */ | |
301 void | |
302 DrawSpan::updateBuffer(float zpos, int rangex, int x, int y, | |
303 int tex_x, int tex_y, uint32 *tex_addr) | |
304 { | |
305 int rgb = get_rgb(tex_x, tex_y, tex_addr); | |
306 | |
307 zRow[x + (rangex*y)] = zpos; | |
308 linebuf[x + (rangex*y)] = rgb; | |
309 } | |
310 | |
311 /** | |
272 * 長さが 1 の Span の描画 (要するに 1 pixel) | 312 * 長さが 1 の Span の描画 (要するに 1 pixel) |
273 * | 313 * |
274 * @param span Span | 314 * @param span Span |
275 * @param startx 描画開始範囲 | 315 * @param startx 描画開始範囲 |
276 * @param endx 描画終了範囲 | 316 * @param endx 描画終了範囲 |
277 */ | 317 */ |
278 void | 318 int |
279 DrawSpan::drawDot(SpanPtr span, int startx, int endx) | 319 DrawSpan::drawDot1(SpanPtr span, int startx, int endx, int wait_tag) |
280 { | 320 { |
281 int rangex = endx - startx + 1; | 321 int rangex = endx - startx + 1; |
282 | 322 |
283 /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */ | 323 /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */ |
284 int tex_xpos, tex_ypos; | 324 int tex_xpos, tex_ypos; |
301 int tex_localx; | 341 int tex_localx; |
302 int tex_localy; | 342 int tex_localy; |
303 uint32 *tex_addr; | 343 uint32 *tex_addr; |
304 | 344 |
305 if (span->x < startx || endx < span->x) { | 345 if (span->x < startx || endx < span->x) { |
306 return; | 346 return -1; |
307 } | 347 } |
308 | 348 |
309 tex_xpos = (int)((span->tex_width-1) * tex); | 349 tex_xpos = (int)((span->tex_width-1) * tex); |
310 tex_ypos = (int)((span->tex_height-1) * tey); | 350 tex_ypos = (int)((span->tex_height-1) * tey); |
311 | 351 |
314 span->tex_width, span->tex_addr); | 354 span->tex_width, span->tex_addr); |
315 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | 355 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
316 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | 356 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
317 | 357 |
318 if (!isAvailableTile(tex_addr)) { | 358 if (!isAvailableTile(tex_addr)) { |
319 set_rgb(tex_addr); | 359 set_rgb(tex_addr, wait_tag); |
320 smanager->dma_wait(TEX_LOAD); | 360 smanager->dma_wait(wait_tag); |
361 //return startx; | |
321 } | 362 } |
322 | 363 |
323 int rgb = get_rgb(tex_localx, tex_localy, tex_addr); | 364 updateBuffer(zpos, rangex, localx, localy, |
324 | 365 tex_localx, tex_localy, tex_addr); |
325 zRow[localx + (rangex*localy)] = zpos; | 366 } |
326 linebuf[localx + (rangex*localy)] = rgb; | 367 |
327 } | 368 return -1; |
328 } | 369 } |
329 | 370 |
330 void | 371 void |
331 DrawSpan::drawLine(SpanPtr span, int startx, int endx) | 372 DrawSpan::drawDot2(SpanPtr span, int startx, int end, int js, int wait_tag) |
373 { | |
374 //printf("%d\n", js); | |
375 } | |
376 | |
377 int | |
378 DrawSpan::drawLine1(SpanPtr span, int startx, int endx, int wait_tag) | |
332 { | 379 { |
333 int x = span->x; | 380 int x = span->x; |
334 int rangex = endx - startx + 1; | 381 int rangex = endx - startx + 1; |
335 int x_len = span->length_x; | 382 int x_len = span->length_x; |
336 | 383 |
353 float zpos2 = span->end_z; | 400 float zpos2 = span->end_z; |
354 | 401 |
355 // Tile 内での座標 | 402 // Tile 内での座標 |
356 int localx, localy = getLocalY(span->y-1); | 403 int localx, localy = getLocalY(span->y-1); |
357 | 404 |
358 // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と | 405 int ret = je+1; |
359 // そのブロックのアドレス(MainMemory) | 406 |
360 int tex_localx; | 407 //for (int j = js; j <= je; j++) { |
361 int tex_localy; | 408 for (int j = je; j >= js; j--) { |
362 uint32 *tex_addr; | 409 float tex_x, tex_y, tex_z; |
363 | 410 |
364 float tex_x, tex_y, tex_z; | |
365 | |
366 #if 0 | |
367 for (int j = js; j <= je; j++) { | |
368 localx = getLocalX(x-1+j); | 411 localx = getLocalX(x-1+j); |
369 | 412 |
370 tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1); | 413 tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1); |
371 | 414 |
372 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); | 415 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); |
377 if (tex_y < 0) tex_y = 0; | 420 if (tex_y < 0) tex_y = 0; |
378 tex_xpos = (int)((span->tex_width-1) * tex_x); | 421 tex_xpos = (int)((span->tex_width-1) * tex_x); |
379 tex_ypos = (int)((span->tex_height-1) * tex_y); | 422 tex_ypos = (int)((span->tex_height-1) * tex_y); |
380 | 423 |
381 if (tex_z < zRow[localx + (rangex*localy)]) { | 424 if (tex_z < zRow[localx + (rangex*localy)]) { |
425 // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と | |
426 // そのブロックのアドレス(MainMemory) | |
427 uint32 *tex_addr; | |
428 int tex_localx; | |
429 int tex_localy; | |
430 | |
382 tex_addr = getTile(tex_xpos, tex_ypos, | 431 tex_addr = getTile(tex_xpos, tex_ypos, |
383 span->tex_width, span->tex_addr); | 432 span->tex_width, span->tex_addr); |
384 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | 433 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
385 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | 434 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
386 | 435 |
387 /** | 436 set_rgb(tex_addr, wait_tag); |
388 * Tile が無い場合、一旦タスクはここで中断し、 | 437 ret = j; |
389 * Tile をロードするタスクを走らせた後に再起動する | 438 continue; |
390 */ | 439 |
391 if (!isAvailableTile(tex_addr)) { | 440 if (!isAvailableTile(tex_addr)) { |
392 set_rgb(tex_addr); | 441 #if 1 |
393 smanager->dma_wait(TEX_LOAD); | 442 tex_x = tex1*(x_len-1-js)/(x_len-1) + tex2*js/(x_len-1); |
443 if (tex_x > 1) tex_x = 1; | |
444 if (tex_x < 0) tex_x = 0; | |
445 tex_xpos = (int)((span->tex_width-1) * tex_x); | |
446 | |
447 uint32 *max_addr = getTile(tex_xpos, tex_ypos, | |
448 span->tex_width, span->tex_addr); | |
449 | |
450 set_rgbs(tex_addr, max_addr, wait_tag); | |
451 return js; | |
452 #else | |
453 set_rgb(tex_addr, wait_tag); | |
454 ret = j; | |
455 //j -= 3; | |
456 continue; | |
457 #endif | |
394 } | 458 } |
395 | 459 |
396 int rgb = get_rgb(tex_localx, tex_localy, tex_addr); | 460 updateBuffer(tex_z, rangex, localx, localy, |
397 | 461 tex_localx, tex_localy, tex_addr); |
398 zRow[localx + (rangex*localy)] = tex_z; | |
399 linebuf[localx + (rangex*localy)] = rgb; | |
400 } | 462 } |
401 } | 463 } |
402 #else | 464 |
403 for (int j = js; j <= je; j += 4) { | 465 return ret; |
404 vector signed int vec_offset_i = {j, j+1, j+2, j+3}; | 466 } |
405 vector float vec_offset_f = {j, j+1, j+2, j+3}; | 467 |
406 vector float len1 = spu_splats((float)(x_len-1)); | 468 void |
407 vector float len2 = spu_sub(len1, vec_offset_f); | 469 DrawSpan::drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag) |
408 | 470 { |
409 vector float vec_zpos1 = spu_splats(zpos1); | 471 int x = span->x; |
410 vector float vec_zpos2 = spu_splats(zpos2); | 472 int rangex = endx - startx + 1; |
411 vector float vec_tex1 = spu_splats(tex1); | 473 int x_len = span->length_x; |
412 vector float vec_tex2 = spu_splats(tex2);; | 474 |
413 vector float vec_tey1 = spu_splats(tey1); | 475 //int js = startx; |
414 vector float vec_tey2 = spu_splats(tey2); | 476 int je = (x + x_len > endx) ? endx - x : x_len; |
415 | 477 |
416 vector float vec_tex_x; | 478 /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */ |
417 vector float vec_tex_y; | 479 int tex_xpos, tex_ypos; |
418 vector float vec_tex_z; | 480 |
419 | 481 // span の始点に対応する座標 (tex1, tey1) |
420 // localx = getLocalX(x-1+j); | 482 float tex1 = span->tex_x1; |
421 vector signed int vec_localx | 483 float tey1 = span->tex_y1; |
422 = getLocalXVec(spu_add(spu_splats(x-1), vec_offset_i)); | 484 |
423 vector signed int vec_localy = spu_splats(localy); | 485 // span の終点に対応する座標 (tex2, tey2) |
424 | 486 float tex2 = span->tex_x2; |
425 // tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1); | 487 float tey2 = span->tex_y2; |
426 vec_tex_z = spu_madd(spu_mul(vec_zpos1, len2), spu_re_nrm(len1), | 488 |
427 spu_mul(spu_mul(vec_zpos2, vec_offset_f), | 489 // span の始点、終点に対応する z 座標 |
428 spu_re_nrm(len1))); | 490 float zpos1 = span->start_z; |
429 | 491 float zpos2 = span->end_z; |
430 // tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); | 492 |
431 vec_tex_x = spu_madd(spu_mul(vec_tex1, len2), spu_re_nrm(len1), | 493 // Tile 内での座標 |
432 spu_mul(spu_mul(vec_tex2, vec_offset_f), | 494 int localx, localy = getLocalY(span->y-1); |
433 spu_re_nrm(len1))); | 495 |
434 | 496 // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と |
435 //tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); | 497 // そのブロックのアドレス(MainMemory) |
436 vec_tex_y = spu_madd(spu_mul(vec_tey1, len2), spu_re_nrm(len1), | 498 int tex_localx; |
437 spu_mul(spu_mul(vec_tey2, vec_offset_f), | 499 int tex_localy; |
438 spu_re_nrm(len1))); | 500 uint32 *tex_addr; |
439 | 501 |
440 #if 0 | 502 float tex_x, tex_y, tex_z; |
441 { | 503 |
442 vector float ov1 = spu_splats(1.0f); | 504 smanager->dma_wait(wait_tag); |
443 vector float ov0 = spu_splats(0.0f); | 505 |
444 | 506 for (int j = js; j <= je; j++) { |
445 // spu_cmpgt() true = 0xffffffff, false = 0x00000000 | 507 localx = getLocalX(x-1+j); |
446 vector unsigned int ovflag_1 = spu_cmpgt(vec_tex_x, ov1); | 508 |
447 vector unsigned int ovflag_0 = spu_cmpgt(vec_tex_x, ov0); | 509 tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1); |
448 | 510 |
449 // *_t = 0xffffffff を 1 に変換 | 511 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); |
450 // *_f = spu_cmpgt() の 論理否定 vector | 512 tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); |
451 // {0, 1, 0, 1} => {1, 0, 1, 0} | 513 if (tex_x > 1) tex_x = 1; |
452 // *_t 同様 0xffffffff => 1 に変換 | 514 if (tex_x < 0) tex_x = 0; |
453 vector signed int ovflag_1_t = spu_and(ovflag_1, 0x1); | 515 if (tex_y > 1) tex_y = 1; |
454 vector signed int ovflag_1_f | 516 if (tex_y < 0) tex_y = 0; |
455 = spu_and(spu_nor(ovflag_1, ovflag_1), 0x1); | 517 tex_xpos = (int)((span->tex_width-1) * tex_x); |
456 | 518 tex_ypos = (int)((span->tex_height-1) * tex_y); |
457 for (int h = 0; h < 4; h++) { | 519 |
458 signed int fl = spu_extract(ovflag_1_f, h); | 520 if (tex_z < zRow[localx + (rangex*localy)]) { |
459 //float x = spu_extract((spu_mul(vec_tex_x, (vector float)ovflag_1_t)), h); | 521 tex_addr = getTile(tex_xpos, tex_ypos, |
460 printf("[%d] %f %d\n", h, 3.3, fl); | 522 span->tex_width, span->tex_addr); |
461 } | 523 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
462 | 524 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
463 vector unsigned int ovflag_0_t = spu_and(ovflag_0, 0x1); | 525 |
464 | 526 updateBuffer(tex_z, rangex, localx, localy, |
465 //vec_tex_x = spu_add(spu_mul(ov1, (vector float)ovflag_1_t), | 527 tex_localx, tex_localy, tex_addr); |
466 //spu_mul(vec_tex_x, (vector float)ovflag_1_f)); | |
467 //vec_tex_x = spu_mul(vec_tex_x, (vector float)ovflag_0_t); | |
468 } | 528 } |
469 #endif | 529 } |
470 int cnt = (je - j > 4) ? 4 : je - j + 1; | |
471 | |
472 for (int i = 0; i < cnt; i++) { | |
473 tex_x = spu_extract(vec_tex_x, i); | |
474 tex_y = spu_extract(vec_tex_y, i); | |
475 tex_z = spu_extract(vec_tex_z, i); | |
476 localx = spu_extract(vec_localx, i); | |
477 | |
478 if (tex_x > 1) tex_x = 1; | |
479 if (tex_x < 0) tex_x = 0; | |
480 if (tex_y > 1) tex_y = 1; | |
481 if (tex_y < 0) tex_y = 0; | |
482 tex_xpos = (int)((span->tex_width-1) * tex_x); | |
483 tex_ypos = (int)((span->tex_height-1) * tex_y); | |
484 | |
485 if (tex_z < zRow[localx + (rangex*localy)]) { | |
486 tex_addr = getTile(tex_xpos, tex_ypos, | |
487 span->tex_width, span->tex_addr); | |
488 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | |
489 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | |
490 | |
491 /** | |
492 * Tile が無い場合、一旦タスクはここで中断し、 | |
493 * Tile をロードするタスクを走らせた後に再起動する | |
494 */ | |
495 if (!isAvailableTile(tex_addr)) { | |
496 set_rgb(tex_addr); | |
497 smanager->dma_wait(TEX_LOAD); | |
498 } | |
499 | |
500 int rgb = get_rgb(tex_localx, tex_localy, tex_addr); | |
501 | |
502 zRow[localx + (rangex*localy)] = tex_z; | |
503 linebuf[localx + (rangex*localy)] = rgb; | |
504 } | |
505 } | |
506 } | |
507 #endif | |
508 } | 530 } |
509 | 531 |
510 int | 532 int |
511 DrawSpan::run(void *rbuf, void *wbuf) | 533 DrawSpan::run(void *rbuf, void *wbuf) |
512 { | 534 { |
513 SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0); | 535 SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0); |
514 SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | 536 SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); |
515 SpanPackPtr free_spack = next_spack; // next_spack の free() 用 | 537 SpanPackPtr free_spack = next_spack; // next_spack の free() 用 |
516 Span *span; | 538 Span *span; |
517 | 539 |
518 void (DrawSpan::*drawFunc[2])(SpanPtr, int, int) = { | 540 Span nop_span; |
519 &DrawSpan::drawDot, &DrawSpan::drawLine | 541 nop_span.length_x = 1; |
542 | |
543 int (DrawSpan::*drawFunc1[2])(SpanPtr, int, int, int) = { | |
544 &DrawSpan::drawDot1, &DrawSpan::drawLine1 | |
545 }; | |
546 | |
547 void (DrawSpan::*drawFunc2[2])(SpanPtr, int, int, int, int) = { | |
548 &DrawSpan::drawDot2, &DrawSpan::drawLine2 | |
520 }; | 549 }; |
521 | 550 |
522 uint32 display = smanager->get_param(0); | 551 uint32 display = smanager->get_param(0); |
523 int screen_width = smanager->get_param(1); | 552 int screen_width = smanager->get_param(1); |
524 int rangex_start = smanager->get_param(2); | 553 int rangex_start = smanager->get_param(2); |
525 int rangex_end = smanager->get_param(3); | 554 int rangex_end = smanager->get_param(3); |
526 | 555 |
527 // このタスクが担当する x の範囲 | 556 // このタスクが担当する x の範囲 |
528 int rangex = rangex_end - rangex_start + 1; | 557 int rangex = rangex_end - rangex_start + 1; |
529 | 558 |
530 // y の範囲 | 559 // y の範囲 |
531 int rangey = smanager->get_param(4); | 560 int rangey = smanager->get_param(4); |
535 | 564 |
536 zRow = zRow_init(rangex, rangey); | 565 zRow = zRow_init(rangex, rangey); |
537 linebuf = linebuf_init(rangex, rangey, 0x00ffffff); | 566 linebuf = linebuf_init(rangex, rangey, 0x00ffffff); |
538 | 567 |
539 doneWrite = 0; | 568 doneWrite = 0; |
569 | |
570 int tl_tag[2] = {TEX_LOAD1, TEX_LOAD2}; | |
571 int tl_tag_flg1 = 0; | |
572 int tl_tag_flg2 = 1; | |
540 | 573 |
541 do { | 574 do { |
542 /** | 575 /** |
543 * SpanPack->next が存在する場合、 | 576 * SpanPack->next が存在する場合、 |
544 * 現在の SpanPack を処理してる間に | 577 * 現在の SpanPack を処理してる間に |
549 sizeof(SpanPack), SPAN_PACK_LOAD); | 582 sizeof(SpanPack), SPAN_PACK_LOAD); |
550 } else { | 583 } else { |
551 next_spack = NULL; | 584 next_spack = NULL; |
552 } | 585 } |
553 | 586 |
587 SpanPtr resume_span = &nop_span; | |
588 int resume_span_x = 0; | |
589 | |
554 for (int t = 0; t < spack->info.size; t++) { | 590 for (int t = 0; t < spack->info.size; t++) { |
591 SpanPtr next_span; | |
592 int next_span_x; | |
593 | |
555 span = &spack->span[t]; | 594 span = &spack->span[t]; |
556 | 595 |
557 int x_len = span->length_x; | 596 next_span_x |
558 | 597 = (this->*drawFunc1[(span->length_x != 1)])( |
559 (this->*drawFunc[(x_len != 1)])(span, rangex_start, rangex_end); | 598 span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]); |
599 next_span = span; | |
600 | |
601 (this->*drawFunc2[(resume_span->length_x != 1)])( | |
602 resume_span, rangex_start, rangex_end, resume_span_x, | |
603 tl_tag[tl_tag_flg2]); | |
604 | |
605 resume_span = next_span; | |
606 resume_span_x = next_span_x; | |
607 | |
608 //smanager->dma_wait(tl_tag[tl_tag_flg1]); | |
609 | |
610 tl_tag_flg1 ^= 1; | |
611 tl_tag_flg2 ^= 1; | |
560 } | 612 } |
613 | |
614 (this->*drawFunc2[(resume_span->length_x != 1)])( | |
615 resume_span, rangex_start, rangex_end, resume_span_x, | |
616 tl_tag[tl_tag_flg1]); | |
561 | 617 |
562 smanager->dma_wait(SPAN_PACK_LOAD); | 618 smanager->dma_wait(SPAN_PACK_LOAD); |
563 | 619 |
564 SpanPackPtr tmp_spack = spack; | 620 SpanPackPtr tmp_spack = spack; |
565 spack = next_spack; | 621 spack = next_spack; |
571 // linebuf は、writebuffer() の dma_store を wait する | 627 // linebuf は、writebuffer() の dma_store を wait する |
572 // DrawSpan::~DrawSpan() 内で free する。 | 628 // DrawSpan::~DrawSpan() 内で free する。 |
573 //free(linebuf); | 629 //free(linebuf); |
574 free(zRow); | 630 free(zRow); |
575 | 631 |
576 FINISH: | 632 //FINISH: |
577 /** | 633 /** |
578 * goto FINISH; の時は reboot なので | 634 * goto FINISH; の時は reboot なので |
579 * linebuf, zRow は free() しない | 635 * linebuf, zRow は free() しない |
580 */ | 636 */ |
637 | |
581 free(free_spack); | 638 free(free_spack); |
582 | |
583 return 0; | 639 return 0; |
584 } | 640 } |