Mercurial > hg > Members > kono > Cerium
comparison Renderer/Engine/task/DrawSpanRenew.cc @ 507:735f76483bb2
Reorganization..
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 12 Oct 2009 09:39:35 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
506:1d4a8a86f26b | 507:735f76483bb2 |
---|---|
1 #if 0 | |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include "DrawSpanRenew.h" | |
5 #include "polygon_pack.h" | |
6 #include "SpanPack.h" | |
7 #include "texture.h" | |
8 #include "viewer_types.h" | |
9 #include "Func.h" | |
10 #include "global_alloc.h" | |
11 | |
12 #define SPAN_PACK_LOAD 0 | |
13 #define TEX_LOAD 1 | |
14 #define FB_STORE 2 | |
15 | |
16 SchedDefineTask(DrawSpanRenew); | |
17 | |
18 void | |
19 DrawSpanRenew::reboot(SpanPackPtr spack, int cur_span_x) | |
20 { | |
21 TaskPtr renew_task = smanager->create_task(TASK_DRAW_SPAN2); | |
22 | |
23 renew_task->add_param((int)args); | |
24 | |
25 SpanPackPtr curr = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
26 memcpy(curr, spack, sizeof(SpanPack)); | |
27 renew_task->add_param((int)curr); | |
28 renew_task->add_param(cur_span_x); | |
29 | |
30 // linebuf と zRow も引き継がせる | |
31 renew_task->add_param((int)linebuf); | |
32 renew_task->add_param((int)zRow); | |
33 | |
34 //fprintf(stderr, "[%p] start %u\n", curr, spu_readch(SPU_RdDec)); | |
35 | |
36 /** | |
37 * 再起動したタスクを待つ | |
38 */ | |
39 smanager->wait_task(renew_task); | |
40 | |
41 // next_spack は free() するので wait する | |
42 smanager->dma_wait(SPAN_PACK_LOAD); | |
43 } | |
44 | |
45 int | |
46 DrawSpanRenew::run(void *rbuf, void *wbuf) | |
47 { | |
48 SpanPackPtr spack = (SpanPackPtr)smanager->get_param(1); | |
49 SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
50 SpanPackPtr free_spack1 = spack; | |
51 SpanPackPtr free_spack2 = next_spack; | |
52 Span *span; | |
53 | |
54 args = (DrawSpanArgPtr)smanager->get_param(0); | |
55 uint32 display = args->display; | |
56 int screen_width = args->screen_width; | |
57 int rangex_start = args->rangex_start; | |
58 int rangex_end = args->rangex_end; | |
59 | |
60 // このタスクが担当する x の範囲 | |
61 int rangex = rangex_end - rangex_start + 1; | |
62 | |
63 // y の範囲 (render_y + rangey - 1) | |
64 int rangey = args->rangey; | |
65 | |
66 hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); | |
67 tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); | |
68 | |
69 linebuf = (int*)smanager->get_param(3); | |
70 zRow = (float*)smanager->get_param(4); | |
71 | |
72 doneWrite = 0; | |
73 | |
74 // span->length_x の処理での再起動位置 | |
75 int js_cont = smanager->get_param(2); | |
76 | |
77 //fprintf(stderr, "[%p] end %u\n", spack, spu_readch(SPU_RdDec)); | |
78 | |
79 smanager->dma_wait(TEX_LOAD); | |
80 | |
81 do { | |
82 /** | |
83 * SpanPack->next が存在する場合、 | |
84 * 現在の SpanPack を処理してる間に | |
85 * 次の SpanPack の DMA 転送を行う | |
86 */ | |
87 if (spack->next != NULL) { | |
88 smanager->dma_load(next_spack, (uint32)spack->next, | |
89 sizeof(SpanPack), SPAN_PACK_LOAD); | |
90 } else { | |
91 next_spack = NULL; | |
92 } | |
93 | |
94 for (int t = spack->info.start; t < spack->info.size; t++) { | |
95 span = &spack->span[t]; | |
96 | |
97 uint32 rgb = 0x00ff0000; | |
98 float tex1 = span->tex_x1; | |
99 float tex2 = span->tex_x2; | |
100 float tey1 = span->tex_y1; | |
101 float tey2 = span->tex_y2; | |
102 | |
103 /** | |
104 * Span が持つ 1 pixel 毎の | |
105 * テクスチャの座標 | |
106 */ | |
107 int tex_xpos; | |
108 int tex_ypos; | |
109 | |
110 /** | |
111 * (tex_xpos, tex_ypos) の、ブロック内(上の図参照)での座標と | |
112 * そのブロックのアドレス(MainMemory) | |
113 */ | |
114 int tex_localx; | |
115 int tex_localy; | |
116 memaddr tex_addr; | |
117 | |
118 int x = span->x; | |
119 int y = span->y; | |
120 int x_len = span->length_x; | |
121 float z = span->start_z; | |
122 float zpos = span->end_z; | |
123 | |
124 // 座標が [0 .. split_screen_w-1] に入るように x,y を -1 | |
125 int localx = getLocalX(x-1); | |
126 int localy = getLocalY(y-1); | |
127 | |
128 if (x_len == 1) { | |
129 if (x < rangex_start || rangex_end < x) { | |
130 continue; | |
131 } | |
132 | |
133 tex_xpos = (int)((span->tex_width-1) * tex1); | |
134 tex_ypos = (int)((span->tex_height-1) * tey1); | |
135 | |
136 if (zpos < zRow[localx + (rangex * localy)]) { | |
137 tex_addr = getTile(tex_xpos, tex_ypos, | |
138 span->tex_width, (memaddr)span->tex_addr); | |
139 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | |
140 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | |
141 | |
142 TilePtr tile; | |
143 if (!(tile = isAvailableTile(tex_addr))) { | |
144 tile = set_rgb(tex_addr, 0); | |
145 smanager->dma_wait(0); | |
146 } | |
147 | |
148 rgb = get_rgb(tex_localx, tex_localy, tile); | |
149 | |
150 zRow[localx + (rangex*localy)] = zpos; | |
151 linebuf[localx + (rangex*localy)] = rgb; | |
152 } | |
153 } else { | |
154 int js = (x < rangex_start) ? rangex_start - x : 0; | |
155 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; | |
156 float tex_x, tex_y, tex_z; | |
157 | |
158 /** | |
159 * 一回比較すれば、以後再起動するまでは | |
160 * js_cont は使わないから 0 にしてるわけだけど、 | |
161 * 最初の一回のためだけにこれはめんどくさいのー。 | |
162 */ | |
163 js = (js < js_cont) ? js_cont : js; | |
164 js_cont = 0; | |
165 | |
166 for (int j = js; j <= je; j++) { | |
167 localx = getLocalX(x-1+j); | |
168 | |
169 tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1); | |
170 | |
171 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); | |
172 tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); | |
173 if (tex_x > 1) tex_x = 1; | |
174 if (tex_x < 0) tex_x = 0; | |
175 if (tex_y > 1) tex_y = 1; | |
176 if (tex_y < 0) tex_y = 0; | |
177 tex_xpos = (int)((span->tex_width-1) * tex_x); | |
178 tex_ypos = (int)((span->tex_height-1) * tex_y); | |
179 | |
180 if (tex_z < zRow[localx + (rangex*localy)]) { | |
181 tex_addr = getTile(tex_xpos, tex_ypos, | |
182 span->tex_width, (memaddr)span->tex_addr); | |
183 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; | |
184 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; | |
185 | |
186 TilePtr tile; | |
187 if (!(tile = isAvailableTile(tex_addr))) { | |
188 spack->info.start = t; | |
189 tile = set_rgb(tex_addr, TEX_LOAD); | |
190 smanager->dma_wait(TEX_LOAD); | |
191 } | |
192 | |
193 rgb = get_rgb(tex_localx, tex_localy, tile); | |
194 | |
195 zRow[localx + (rangex*localy)] = tex_z; | |
196 linebuf[localx + (rangex*localy)] = rgb; | |
197 } | |
198 } | |
199 } | |
200 } | |
201 | |
202 smanager->dma_wait(SPAN_PACK_LOAD); | |
203 | |
204 SpanPackPtr tmp_spack = spack; | |
205 spack = next_spack; | |
206 next_spack = tmp_spack; | |
207 } while (spack); | |
208 | |
209 writebuffer(display, rangex, rangey, screen_width); | |
210 | |
211 free(zRow); | |
212 free(args); | |
213 | |
214 //FINISH: | |
215 /** | |
216 * linebuf, zRow, args は RenewTask が引き継ぐ | |
217 */ | |
218 free(free_spack1); | |
219 free(free_spack2); | |
220 | |
221 return 0; | |
222 } | |
223 #endif |