Mercurial > hg > Members > kono > Cerium
comparison TaskManager/Test/test_render/task/DrawSpanRenew.cpp @ 298:58fd16298954
from EUC to UTF-8
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 07 Jun 2009 15:17:41 +0900 |
parents | e1d24c951408 |
children | 7efc5ede2c03 |
comparison
equal
deleted
inserted
replaced
297:f8006660a45c | 298:58fd16298954 |
---|---|
23 SpanPackPtr curr = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | 23 SpanPackPtr curr = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); |
24 memcpy(curr, spack, sizeof(SpanPack)); | 24 memcpy(curr, spack, sizeof(SpanPack)); |
25 renew_task->add_param((int)curr); | 25 renew_task->add_param((int)curr); |
26 renew_task->add_param(cur_span_x); | 26 renew_task->add_param(cur_span_x); |
27 | 27 |
28 // linebuf と zRow も引き継がせる | 28 // linebuf zRow 綣膓 |
29 renew_task->add_param((int)linebuf); | 29 renew_task->add_param((int)linebuf); |
30 renew_task->add_param((int)zRow); | 30 renew_task->add_param((int)zRow); |
31 | 31 |
32 //fprintf(stderr, "[%p] start %u\n", curr, spu_readch(SPU_RdDec)); | 32 //fprintf(stderr, "[%p] start %u\n", curr, spu_readch(SPU_RdDec)); |
33 | 33 |
34 /** | 34 /** |
35 * 再起動したタスクを待つ | 35 * 莎桁帥鴻緇 |
36 */ | 36 */ |
37 smanager->wait_task(renew_task); | 37 smanager->wait_task(renew_task); |
38 | 38 |
39 // next_spack は free() するので wait する | 39 // next_spack free() wait |
40 smanager->dma_wait(SPAN_PACK_LOAD); | 40 smanager->dma_wait(SPAN_PACK_LOAD); |
41 } | 41 } |
42 | 42 |
43 int | 43 int |
44 DrawSpanRenew::run(void *rbuf, void *wbuf) | 44 DrawSpanRenew::run(void *rbuf, void *wbuf) |
53 uint32 display = args->display; | 53 uint32 display = args->display; |
54 int screen_width = args->screen_width; | 54 int screen_width = args->screen_width; |
55 int rangex_start = args->rangex_start; | 55 int rangex_start = args->rangex_start; |
56 int rangex_end = args->rangex_end; | 56 int rangex_end = args->rangex_end; |
57 | 57 |
58 // このタスクが担当する x の範囲 | 58 // 帥鴻綵 x 膀 |
59 int rangex = rangex_end - rangex_start + 1; | 59 int rangex = rangex_end - rangex_start + 1; |
60 | 60 |
61 // y の範囲 (render_y + rangey - 1) | 61 // y 膀 (render_y + rangey - 1) |
62 int rangey = args->rangey; | 62 int rangey = args->rangey; |
63 | 63 |
64 hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); | 64 hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); |
65 tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); | 65 tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); |
66 | 66 |
67 linebuf = (int*)smanager->get_param(3); | 67 linebuf = (int*)smanager->get_param(3); |
68 zRow = (float*)smanager->get_param(4); | 68 zRow = (float*)smanager->get_param(4); |
69 | 69 |
70 doneWrite = 0; | 70 doneWrite = 0; |
71 | 71 |
72 // span->length_x の処理での再起動位置 | 72 // span->length_x с莎桁篏臀 |
73 int js_cont = smanager->get_param(2); | 73 int js_cont = smanager->get_param(2); |
74 | 74 |
75 //fprintf(stderr, "[%p] end %u\n", spack, spu_readch(SPU_RdDec)); | 75 //fprintf(stderr, "[%p] end %u\n", spack, spu_readch(SPU_RdDec)); |
76 | 76 |
77 smanager->dma_wait(TEX_LOAD); | 77 smanager->dma_wait(TEX_LOAD); |
78 | 78 |
79 do { | 79 do { |
80 /** | 80 /** |
81 * SpanPack->next が存在する場合、 | 81 * SpanPack->next 絖翫 |
82 * 現在の SpanPack を処理してる間に | 82 * 憜 SpanPack |
83 * 次の SpanPack の DMA 転送を行う | 83 * 罨< SpanPack DMA 荵∫茵 |
84 */ | 84 */ |
85 if (spack->next != NULL) { | 85 if (spack->next != NULL) { |
86 smanager->dma_load(next_spack, (uint32)spack->next, | 86 smanager->dma_load(next_spack, (uint32)spack->next, |
87 sizeof(SpanPack), SPAN_PACK_LOAD); | 87 sizeof(SpanPack), SPAN_PACK_LOAD); |
88 } else { | 88 } else { |
97 float tex2 = span->tex_x2; | 97 float tex2 = span->tex_x2; |
98 float tey1 = span->tex_y1; | 98 float tey1 = span->tex_y1; |
99 float tey2 = span->tex_y2; | 99 float tey2 = span->tex_y2; |
100 | 100 |
101 /** | 101 /** |
102 * Span が持つ 1 pixel 毎の | 102 * Span 1 pixel 罸 |
103 * テクスチャの座標 | 103 * 鴻c綺ф |
104 */ | 104 */ |
105 int tex_xpos; | 105 int tex_xpos; |
106 int tex_ypos; | 106 int tex_ypos; |
107 | 107 |
108 /** | 108 /** |
109 * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と | 109 * (tex_xpos, tex_ypos) (筝喝)с綺ф |
110 * そのブロックのアドレス(MainMemory) | 110 * ≪(MainMemory) |
111 */ | 111 */ |
112 int tex_localx; | 112 int tex_localx; |
113 int tex_localy; | 113 int tex_localy; |
114 uint32 *tex_addr; | 114 uint32 *tex_addr; |
115 | 115 |
117 int y = span->y; | 117 int y = span->y; |
118 int x_len = span->length_x; | 118 int x_len = span->length_x; |
119 float z = span->start_z; | 119 float z = span->start_z; |
120 float zpos = span->end_z; | 120 float zpos = span->end_z; |
121 | 121 |
122 // 座標が [0 .. split_screen_w-1] に入るように x,y を -1 | 122 // 綺ф [0 .. split_screen_w-1] ャ x,y -1 |
123 int localx = getLocalX(x-1); | 123 int localx = getLocalX(x-1); |
124 int localy = getLocalY(y-1); | 124 int localy = getLocalY(y-1); |
125 | 125 |
126 if (x_len == 1) { | 126 if (x_len == 1) { |
127 if (x < rangex_start || rangex_end < x) { | 127 if (x < rangex_start || rangex_end < x) { |
151 int js = (x < rangex_start) ? rangex_start - x : 0; | 151 int js = (x < rangex_start) ? rangex_start - x : 0; |
152 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; | 152 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; |
153 float tex_x, tex_y, tex_z; | 153 float tex_x, tex_y, tex_z; |
154 | 154 |
155 /** | 155 /** |
156 * 一回比較すれば、以後再起動するまでは | 156 * 筝罸莠違篁ュ莎桁障с |
157 * js_cont は使わないから 0 にしてるわけだけど、 | 157 * js_cont 篏帥 0 |
158 * 最初の一回のためだけにこれはめんどくさいのー。 | 158 * 筝若 |
159 */ | 159 */ |
160 js = (js < js_cont) ? js_cont : js; | 160 js = (js < js_cont) ? js_cont : js; |
161 js_cont = 0; | 161 js_cont = 0; |
162 | 162 |
163 for (int j = js; j <= je; j++) { | 163 for (int j = js; j <= je; j++) { |
215 free(zRow); | 215 free(zRow); |
216 free(args); | 216 free(args); |
217 | 217 |
218 //FINISH: | 218 //FINISH: |
219 /** | 219 /** |
220 * linebuf, zRow, args は RenewTask が引き継ぐ | 220 * linebuf, zRow, args RenewTask 綣膓 |
221 */ | 221 */ |
222 free(free_spack1); | 222 free(free_spack1); |
223 free(free_spack2); | 223 free(free_spack2); |
224 | 224 |
225 return 0; | 225 return 0; |