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