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