Mercurial > hg > Game > Cerium
annotate TaskManager/Test/test_render/spe/DrawSpan.cpp @ 188:fe854a6ee9e2 draft
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
author | gongo@localhost.localdomain |
---|---|
date | Thu, 08 Jan 2009 15:34:19 +0900 |
parents | 06cdf8baa989 |
children | 6694da357750 |
rev | line source |
---|---|
109 | 1 #include <stdlib.h> |
2 #include <string.h> | |
3 #include "DrawSpan.h" | |
4 #include "polygon_pack.h" | |
5 #include "texture.h" | |
6 #include "viewer_types.h" | |
184 | 7 #include "Func.h" |
109 | 8 |
9 #define SPAN_PACK_LOAD 0 | |
120 | 10 #define TEX_LOAD 1 |
109 | 11 |
12 SchedDefineTask(DrawSpan); | |
13 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
14 /** |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
15 * ƥϡTEXTURE_SPLIT_PIXEL^2 Υ֥åʬ䤹 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
16 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
17 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
18 * | 0 | 1 | 2 | 3 | 4 | 5 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
19 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
20 * | | | | | |11 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
21 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
22 * | | | | | |17 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
23 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
24 * | | | | | |23 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
25 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
26 * | | | | | |29 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
27 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
28 * | | | | | |35 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
29 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
30 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
31 * դ TEXTURE_SPLIT Ȥ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
32 * ƥ֥åο֥åIDȤʤ롣 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
33 */ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
34 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
35 /** |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
36 * ƥκɸ顢 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
37 * ƥΤɤΥ֥å |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
38 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
39 * @param[in] tx X coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
40 * @param[in] tx Y coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
41 * @param[in] twidth Width of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
42 * @return block ID |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
43 */ |
184 | 44 int |
45 DrawSpan::getTexBlock(int tx, int ty, int twidth) | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
46 { |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
47 int blockX, blockY; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
48 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
49 blockX = tx / TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
50 blockY = ty / TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
51 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
52 return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
53 } |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
54 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
55 /** |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
56 * block ID ȡƥ TOP address |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
57 * (tx,ty) ǻȤƥ Tile addres |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
58 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
59 * @param[in] tx X coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
60 * @param[in] tx Y coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
61 * @param[in] tw Width of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
62 * @param[in] tex_addr_top (tx,ty) ǻȤƥƬaddress |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
63 * @return block ID |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
64 */ |
184 | 65 uint32* |
66 DrawSpan::getTile(int tx, int ty, int tw, uint32 *tex_addr_top) | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
67 { |
184 | 68 int block = getTexBlock(tx, ty, tw); |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
69 return tex_addr_top + block*TEXTURE_BLOCK_SIZE; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
70 } |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
71 |
109 | 72 void |
73 DrawSpan::linebuf_init(int *buf, int x, int rgb) | |
74 { | |
75 for (int i = 0; i < x; i++) { | |
76 buf[i] = rgb; | |
77 } | |
78 } | |
79 | |
184 | 80 /** |
81 * Span Ȥ Texture Tile 뤫 | |
82 * | |
83 * @retval != NULL ¸ߤ | |
84 * @retval NULL ¸ߤʤ | |
85 */ | |
86 TilePtr | |
87 DrawSpan::isAvailableTile(uint32 *addr) | |
88 { | |
89 return hash->get(addr); | |
90 } | |
91 | |
92 void | |
93 DrawSpan::set_rgb(uint32 *addr) | |
94 { | |
95 TilePtr tile; | |
96 | |
97 if (!isAvailableTile(addr)) { | |
98 tile = tileList->nextTile(); | |
99 /** | |
100 * FIFO ʤΤǡ⤷ΤĤäƤк | |
101 */ | |
102 hash->remove(tile->texture_addr); | |
103 | |
104 tile->texture_addr = addr; | |
105 | |
106 hash->put(tile->texture_addr, tile); | |
107 | |
108 smanager->dma_load(tile->pixel, (uint32)addr, | |
109 sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD); | |
110 | |
188
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
111 //smanager->dma_wait(TEX_LOAD); |
184 | 112 } |
113 } | |
114 | |
115 void | |
116 DrawSpan::set_rgbs(uint32 *addr, uint32 *max_addr) | |
117 { | |
118 uint32 start = (uint32)addr; | |
119 uint32 end = (uint32)max_addr; | |
120 uint32 length = end-start; | |
121 uint32 diff = sizeof(uint32)*TEXTURE_BLOCK_SIZE; | |
188
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
122 uint32 max_tile = 16; |
184 | 123 |
124 for (uint32 i = 0, j = 0; i <= length && j < max_tile; i += diff, j++) { | |
125 set_rgb((uint32*)(start + i)); | |
126 } | |
127 } | |
128 | |
109 | 129 Uint32 |
166 | 130 DrawSpan::get_rgb(int tx, int ty, uint32 *addr) |
109 | 131 { |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
132 TilePtr tile; |
109 | 133 |
167
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
134 tile = hash->get(addr); |
168 | 135 return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx]; |
109 | 136 } |
137 | |
184 | 138 /** |
139 * DrawSpan κƵư (DrawSpanRenew ) | |
140 * | |
141 * @param[in] spack ߽Ƥ SpanPack | |
142 * @param[in] cur_span_x span->length_x != 1 λ Span ν | |
143 * ɤޤǿʤǤ뤫 | |
144 */ | |
145 void | |
146 DrawSpan::reboot(SpanPackPtr spack, int cur_span_x) | |
147 { | |
148 TaskPtr renew_task = smanager->create_task(TASK_DRAW_SPAN2); | |
149 int rangey = smanager->get_param(2); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
150 |
184 | 151 /** |
152 * ̤ outData, param ϤΤޤϤ | |
153 */ | |
154 for (int i = 0; i < rangey; i++) { | |
155 renew_task->add_outData(smanager->get_outputAddr(i), | |
156 smanager->get_outputSize(i)); | |
157 } | |
158 | |
159 // rangex_start, rangex_end, rangey | |
160 renew_task->add_param(smanager->get_param(0)); | |
161 renew_task->add_param(smanager->get_param(1)); | |
162 renew_task->add_param(smanager->get_param(2)); | |
163 | |
164 /** | |
165 * SpanPack ³鳫ϤΤǡ | |
166 * ߤξ֤ԡƤ | |
167 * spack rbuf Ƥǽ | |
168 * rbuf ϥƥबưŪ free() 뤿 | |
169 * ɥ쥹ϤΤNG | |
170 */ | |
171 SpanPackPtr curr = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
172 memcpy(curr, spack, sizeof(SpanPack)); | |
173 renew_task->add_param((int)curr); | |
174 renew_task->add_param(cur_span_x); | |
175 | |
176 /** | |
177 * ƵưԤ | |
178 */ | |
179 smanager->wait_task(renew_task); | |
180 | |
181 // next_spack free() Τ wait | |
182 smanager->dma_wait(SPAN_PACK_LOAD); | |
183 } | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
184 |
109 | 185 int |
186 DrawSpan::run(void *rbuf, void *wbuf) | |
187 { | |
167
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
188 hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); |
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
189 tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); |
128
95e2046eb46f
texture load use hash table
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
126
diff
changeset
|
190 |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
191 int rangex_start = smanager->get_param(0); |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
192 int rangex_end = smanager->get_param(1); |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
193 |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
194 // Υô x ϰ |
109 | 195 int rangex = rangex_end - rangex_start + 1; |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
196 |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
197 // y ϰ (render_y + rangey - 1) |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
198 int rangey = smanager->get_param(2); |
177 | 199 |
184 | 200 float *zRow = (float*)smanager->allocate(sizeof(float)*rangex*rangey); |
201 | |
202 for (int i = 0; i < rangex*rangey; i++) { | |
203 zRow[i] = 65535.0f; | |
204 } | |
205 | |
109 | 206 int **linebuf = (int**)smanager->allocate(sizeof(int*)*rangey); |
207 | |
208 for (int i = 0; i < rangey; i++) { | |
209 linebuf[i] = (int*)smanager->get_output(i); | |
170 | 210 linebuf_init(linebuf[i], rangex, 0xffffffff); |
109 | 211 } |
212 | |
184 | 213 SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0); |
214 SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
215 SpanPackPtr free_spack = next_spack; // next_spack free() | |
216 Span *span; | |
217 | |
109 | 218 do { |
219 /** | |
220 * SpanPack->next ¸ߤ硢 | |
221 * ߤ SpanPack Ƥ֤ | |
222 * SpanPack DMA žԤ | |
223 */ | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
224 if (spack->next != NULL) { |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
225 smanager->dma_load(next_spack, (uint32)spack->next, |
109 | 226 sizeof(SpanPack), SPAN_PACK_LOAD); |
227 } else { | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
228 next_spack = NULL; |
109 | 229 } |
230 | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
231 for (int t = 0; t < spack->info.size; t++) { |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
232 span = &spack->span[t]; |
109 | 233 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
234 Uint32 rgb = 0x00ff00; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
235 float tex1 = span->tex_x1; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
236 float tex2 = span->tex_x2; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
237 float tey1 = span->tex_y1; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
238 float tey2 = span->tex_y2; |
147 | 239 |
166 | 240 /** |
241 * Span 1 pixel | |
242 * ƥκɸ | |
243 */ | |
109 | 244 int tex_xpos; |
245 int tex_ypos; | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
246 |
166 | 247 /** |
248 * (tex_xpos, tex_ypos) Ρ֥å(ο)Ǥκɸ | |
249 * Υ֥åΥɥ쥹(MainMemory) | |
250 */ | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
251 int tex_localx; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
252 int tex_localy; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
253 uint32 *tex_addr; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
254 |
109 | 255 int x = span->x; |
256 int y = span->y; | |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
257 int x_len = span->length_x; |
109 | 258 float z = span->start_z; |
259 float zpos = span->end_z; | |
260 | |
261 // ɸ [0 .. split_screen_w-1] 褦 x,y -1 | |
262 int localx = getLocalX(x-1); | |
263 int localy = getLocalY(y-1); | |
131 | 264 |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
265 if (x_len == 1) { |
109 | 266 if (x < rangex_start || rangex_end < x) { |
267 continue; | |
268 } | |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
269 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
270 tex_xpos = (int)((span->tex_width-1) * tex1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
271 tex_ypos = (int)((span->tex_height-1) * tey1); |
109 | 272 |
273 if (zpos < zRow[localx + (rangex * localy)]) { | |
166 | 274 tex_addr = getTile(tex_xpos, tex_ypos, |
275 span->tex_width, span->tex_addr); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
276 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
277 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
166 | 278 |
184 | 279 /** |
280 * Tile ̵硢öϤǤ | |
281 * Tile ɤ륿餻˺Ƶư | |
282 */ | |
283 if (!isAvailableTile(tex_addr)) { | |
284 spack->info.start = t; | |
188
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
285 //set_rgb(tex_addr); |
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
286 set_rgbs(tex_addr, |
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
287 getTile(span->tex_width-1, tex_ypos, |
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
288 span->tex_width, span->tex_addr)); |
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
289 reboot(spack, 0); |
fe854a6ee9e2
メモりリーク箇所発見:TaskManager/Test/test_render/ChangeLog参照
gongo@localhost.localdomain
parents:
186
diff
changeset
|
290 goto FINISH; |
184 | 291 } |
292 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
293 rgb = get_rgb(tex_localx, tex_localy, tex_addr); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
294 |
109 | 295 zRow[localx + (rangex * localy)] = zpos; |
296 linebuf[localy][localx] = rgb; | |
297 } | |
298 } else { | |
299 int js = (x < rangex_start) ? rangex_start - x : 0; | |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
300 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
301 float tex_x, tex_y, tex_z; |
109 | 302 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
303 for (int j = js; j <= je; j++) { |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
304 localx = getLocalX(x-1+j); |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
305 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
306 tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1); |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
307 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
308 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
309 tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
310 if (tex_x > 1) tex_x = 1; |
165 | 311 if (tex_x < 0) tex_x = 0; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
312 if (tex_y > 1) tex_y = 1; |
165 | 313 if (tex_y < 0) tex_y = 0; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
314 tex_xpos = (int)((span->tex_width-1) * tex_x); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
315 tex_ypos = (int)((span->tex_height-1) * tex_y); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
316 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
317 if (tex_z < zRow[localx + (rangex*localy)]) { |
166 | 318 tex_addr = getTile(tex_xpos, tex_ypos, |
319 span->tex_width, span->tex_addr); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
320 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
321 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
184 | 322 |
323 if (!isAvailableTile(tex_addr)) { | |
324 spack->info.start = t; | |
325 //set_rgb(tex_addr); | |
326 set_rgbs(tex_addr, | |
327 getTile(span->tex_width-1, tex_ypos, | |
328 span->tex_width, span->tex_addr)); | |
329 reboot(spack, j); | |
330 goto FINISH; | |
331 } | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
332 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
333 rgb = get_rgb(tex_localx, tex_localy, tex_addr); |
168 | 334 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
335 zRow[localx + (rangex*localy)] = tex_z; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
336 linebuf[localy][localx] = rgb; |
147 | 337 } |
109 | 338 } |
339 } | |
340 } | |
147 | 341 |
109 | 342 smanager->dma_wait(SPAN_PACK_LOAD); |
343 | |
184 | 344 SpanPackPtr tmp_spack = spack; |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
345 spack = next_spack; |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
346 next_spack = tmp_spack; |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
347 } while (spack); |
109 | 348 |
184 | 349 |
350 FINISH: | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
351 free(free_spack); |
109 | 352 free(linebuf); |
186 | 353 free(zRow); |
109 | 354 |
355 return 0; | |
356 } |