1 #define setup_sprite_tiled_initialize_4bpp_4x() \
\r
2 u16 *clut_ptr = psx_gpu->clut_ptr; \
\r
3 vec_8x16u clut_a, clut_b; \
\r
4 vec_16x8u clut_low, clut_high; \
\r
6 load_8x16b(clut_a, clut_ptr); \
\r
7 load_8x16b(clut_b, clut_ptr + 8); \
\r
8 unzip_16x8b(clut_low, clut_high, clut_a, clut_b) \
\r
11 #define setup_sprite_tiled_initialize_8bpp_4x() \
\r
14 #define setup_sprite_tile_fetch_texel_block_8bpp_4x(offset) \
\r
15 texture_block_ptr = psx_gpu->texture_page_ptr + \
\r
16 ((texture_offset + offset) & texture_mask); \
\r
18 load_64b(texels, texture_block_ptr) \
\r
21 #define setup_sprite_tile_setup_block_yes_4x(side, offset, texture_mode) \
\r
23 #define setup_sprite_tile_setup_block_no_4x(side, offset, texture_mode) \
\r
25 #define setup_sprite_tile_add_blocks_4x(tile_num_blocks) \
\r
26 num_blocks += tile_num_blocks * 4; \
\r
27 sprite_blocks += tile_num_blocks * 4; \
\r
29 if(num_blocks > MAX_BLOCKS) \
\r
31 flush_render_block_buffer(psx_gpu); \
\r
32 num_blocks = tile_num_blocks * 4; \
\r
33 block = psx_gpu->blocks; \
\r
36 #define setup_sprite_tile_full_4bpp_4x(edge) \
\r
38 vec_8x8u texels_low, texels_high; \
\r
39 vec_8x16u pixels, pixels_wide; \
\r
40 setup_sprite_tile_add_blocks_4x(sub_tile_height * 2); \
\r
41 u32 left_mask_bits_a = left_mask_bits & 0xFF; \
\r
42 u32 left_mask_bits_b = left_mask_bits >> 8; \
\r
43 u32 right_mask_bits_a = right_mask_bits & 0xFF; \
\r
44 u32 right_mask_bits_b = right_mask_bits >> 8; \
\r
46 while(sub_tile_height) \
\r
48 setup_sprite_tile_fetch_texel_block_8bpp_4x(0); \
\r
49 tbl_16(texels_low, texels, clut_low); \
\r
50 tbl_16(texels_high, texels, clut_high); \
\r
51 zip_8x16b(pixels, texels_low, texels_high); \
\r
53 zip_4x32b(vector_cast(vec_4x32u, pixels_wide), pixels.low, pixels.low); \
\r
54 block->texels = pixels_wide; \
\r
55 block->draw_mask_bits = left_mask_bits_a; \
\r
56 block->fb_ptr = fb_ptr; \
\r
59 block->texels = pixels_wide; \
\r
60 block->draw_mask_bits = left_mask_bits_a; \
\r
61 block->fb_ptr = fb_ptr + 1024; \
\r
64 zip_4x32b(vector_cast(vec_4x32u, pixels_wide), pixels.high, pixels.high); \
\r
65 block->texels = pixels_wide; \
\r
66 block->draw_mask_bits = left_mask_bits_b; \
\r
67 block->fb_ptr = fb_ptr + 8; \
\r
70 block->texels = pixels_wide; \
\r
71 block->draw_mask_bits = left_mask_bits_b; \
\r
72 block->fb_ptr = fb_ptr + 1024 + 8; \
\r
75 setup_sprite_tile_fetch_texel_block_8bpp_4x(8); \
\r
76 tbl_16(texels_low, texels, clut_low); \
\r
77 tbl_16(texels_high, texels, clut_high); \
\r
78 zip_8x16b(pixels, texels_low, texels_high); \
\r
80 zip_4x32b(vector_cast(vec_4x32u, pixels_wide), pixels.low, pixels.low); \
\r
81 block->texels = pixels_wide; \
\r
82 block->draw_mask_bits = right_mask_bits_a; \
\r
83 block->fb_ptr = fb_ptr + 16; \
\r
86 block->texels = pixels_wide; \
\r
87 block->draw_mask_bits = right_mask_bits_a; \
\r
88 block->fb_ptr = fb_ptr + 1024 + 16; \
\r
91 zip_4x32b(vector_cast(vec_4x32u, pixels_wide), pixels.high, pixels.high); \
\r
92 block->texels = pixels_wide; \
\r
93 block->draw_mask_bits = right_mask_bits_b; \
\r
94 block->fb_ptr = fb_ptr + 24; \
\r
97 block->texels = pixels_wide; \
\r
98 block->draw_mask_bits = right_mask_bits_b; \
\r
99 block->fb_ptr = fb_ptr + 1024 + 24; \
\r
103 texture_offset += 0x10; \
\r
104 sub_tile_height--; \
\r
106 texture_offset += 0xF00; \
\r
107 psx_gpu->num_blocks = num_blocks; \
\r
110 #define setup_sprite_tile_half_4bpp_4x(edge) \
\r
112 vec_8x8u texels_low, texels_high; \
\r
113 vec_8x16u pixels, pixels_wide; \
\r
114 setup_sprite_tile_add_blocks_4x(sub_tile_height); \
\r
115 u32 edge##_mask_bits_a = edge##_mask_bits & 0xFF; \
\r
116 u32 edge##_mask_bits_b = edge##_mask_bits >> 8; \
\r
118 while(sub_tile_height) \
\r
120 setup_sprite_tile_fetch_texel_block_8bpp_4x(0); \
\r
121 tbl_16(texels_low, texels, clut_low); \
\r
122 tbl_16(texels_high, texels, clut_high); \
\r
123 zip_8x16b(pixels, texels_low, texels_high); \
\r
125 zip_4x32b(vector_cast(vec_4x32u, pixels_wide), pixels.low, pixels.low); \
\r
126 block->texels = pixels_wide; \
\r
127 block->draw_mask_bits = edge##_mask_bits_a; \
\r
128 block->fb_ptr = fb_ptr; \
\r
131 block->texels = pixels_wide; \
\r
132 block->draw_mask_bits = edge##_mask_bits_a; \
\r
133 block->fb_ptr = fb_ptr + 1024; \
\r
136 zip_4x32b(vector_cast(vec_4x32u, pixels_wide), pixels.high, pixels.high); \
\r
137 block->texels = pixels_wide; \
\r
138 block->draw_mask_bits = edge##_mask_bits_b; \
\r
139 block->fb_ptr = fb_ptr + 8; \
\r
142 block->texels = pixels_wide; \
\r
143 block->draw_mask_bits = edge##_mask_bits_b; \
\r
144 block->fb_ptr = fb_ptr + 1024 + 8; \
\r
148 texture_offset += 0x10; \
\r
149 sub_tile_height--; \
\r
151 texture_offset += 0xF00; \
\r
152 psx_gpu->num_blocks = num_blocks; \
\r
156 #define setup_sprite_tile_full_8bpp_4x(edge) \
\r
158 setup_sprite_tile_add_blocks_4x(sub_tile_height * 2); \
\r
159 vec_16x8u texels_wide; \
\r
160 u32 left_mask_bits_a = left_mask_bits & 0xFF; \
\r
161 u32 left_mask_bits_b = left_mask_bits >> 8; \
\r
162 u32 right_mask_bits_a = right_mask_bits & 0xFF; \
\r
163 u32 right_mask_bits_b = right_mask_bits >> 8; \
\r
165 while(sub_tile_height) \
\r
167 setup_sprite_tile_fetch_texel_block_8bpp_4x(0); \
\r
168 zip_8x16b(vector_cast(vec_8x16u, texels_wide), texels, texels); \
\r
169 block->r = texels_wide.low; \
\r
170 block->draw_mask_bits = left_mask_bits_a; \
\r
171 block->fb_ptr = fb_ptr; \
\r
174 block->r = texels_wide.low; \
\r
175 block->draw_mask_bits = left_mask_bits_a; \
\r
176 block->fb_ptr = fb_ptr + 1024; \
\r
179 block->r = texels_wide.high; \
\r
180 block->draw_mask_bits = left_mask_bits_b; \
\r
181 block->fb_ptr = fb_ptr + 8; \
\r
184 block->r = texels_wide.high; \
\r
185 block->draw_mask_bits = left_mask_bits_b; \
\r
186 block->fb_ptr = fb_ptr + 1024 + 8; \
\r
189 setup_sprite_tile_fetch_texel_block_8bpp_4x(8); \
\r
190 zip_8x16b(vector_cast(vec_8x16u, texels_wide), texels, texels); \
\r
191 block->r = texels_wide.low; \
\r
192 block->draw_mask_bits = right_mask_bits_a; \
\r
193 block->fb_ptr = fb_ptr + 16; \
\r
196 block->r = texels_wide.low; \
\r
197 block->draw_mask_bits = right_mask_bits_a; \
\r
198 block->fb_ptr = fb_ptr + 1024 + 16; \
\r
201 block->r = texels_wide.high; \
\r
202 block->draw_mask_bits = right_mask_bits_b; \
\r
203 block->fb_ptr = fb_ptr + 24; \
\r
206 block->r = texels_wide.high; \
\r
207 block->draw_mask_bits = right_mask_bits_b; \
\r
208 block->fb_ptr = fb_ptr + 24 + 1024; \
\r
212 texture_offset += 0x10; \
\r
213 sub_tile_height--; \
\r
215 texture_offset += 0xF00; \
\r
216 psx_gpu->num_blocks = num_blocks; \
\r
219 #define setup_sprite_tile_half_8bpp_4x(edge) \
\r
221 setup_sprite_tile_add_blocks_4x(sub_tile_height); \
\r
222 vec_16x8u texels_wide; \
\r
223 u32 edge##_mask_bits_a = edge##_mask_bits & 0xFF; \
\r
224 u32 edge##_mask_bits_b = edge##_mask_bits >> 8; \
\r
226 while(sub_tile_height) \
\r
228 setup_sprite_tile_fetch_texel_block_8bpp_4x(0); \
\r
229 zip_8x16b(vector_cast(vec_8x16u, texels_wide), texels, texels); \
\r
230 block->r = texels_wide.low; \
\r
231 block->draw_mask_bits = edge##_mask_bits_a; \
\r
232 block->fb_ptr = fb_ptr; \
\r
235 block->r = texels_wide.low; \
\r
236 block->draw_mask_bits = edge##_mask_bits_a; \
\r
237 block->fb_ptr = fb_ptr + 1024; \
\r
240 block->r = texels_wide.high; \
\r
241 block->draw_mask_bits = edge##_mask_bits_b; \
\r
242 block->fb_ptr = fb_ptr + 8; \
\r
245 block->r = texels_wide.high; \
\r
246 block->draw_mask_bits = edge##_mask_bits_b; \
\r
247 block->fb_ptr = fb_ptr + 8 + 1024; \
\r
251 texture_offset += 0x10; \
\r
252 sub_tile_height--; \
\r
254 texture_offset += 0xF00; \
\r
255 psx_gpu->num_blocks = num_blocks; \
\r
259 #define setup_sprite_tile_column_edge_pre_adjust_half_right_4x() \
\r
260 texture_offset = texture_offset_base + 8; \
\r
263 #define setup_sprite_tile_column_edge_pre_adjust_half_left_4x() \
\r
264 texture_offset = texture_offset_base \
\r
266 #define setup_sprite_tile_column_edge_pre_adjust_half_4x(edge) \
\r
267 setup_sprite_tile_column_edge_pre_adjust_half_##edge##_4x() \
\r
269 #define setup_sprite_tile_column_edge_pre_adjust_full_4x(edge) \
\r
270 texture_offset = texture_offset_base \
\r
272 #define setup_sprite_tile_column_edge_post_adjust_half_right_4x() \
\r
275 #define setup_sprite_tile_column_edge_post_adjust_half_left_4x() \
\r
277 #define setup_sprite_tile_column_edge_post_adjust_half_4x(edge) \
\r
278 setup_sprite_tile_column_edge_post_adjust_half_##edge##_4x() \
\r
280 #define setup_sprite_tile_column_edge_post_adjust_full_4x(edge) \
\r
283 #define setup_sprite_tile_column_height_single_4x(edge_mode, edge, \
\r
287 sub_tile_height = column_data; \
\r
288 setup_sprite_tile_column_edge_pre_adjust_##edge_mode##_4x(edge); \
\r
289 setup_sprite_tile_##edge_mode##_##texture_mode##_4x(edge); \
\r
290 setup_sprite_tile_column_edge_post_adjust_##edge_mode##_4x(edge); \
\r
293 #define setup_sprite_tile_column_height_multi_4x(edge_mode, edge, \
\r
297 u32 tiles_remaining = column_data >> 16; \
\r
298 sub_tile_height = column_data & 0xFF; \
\r
299 setup_sprite_tile_column_edge_pre_adjust_##edge_mode##_4x(edge); \
\r
300 setup_sprite_tile_##edge_mode##_##texture_mode##_4x(edge); \
\r
301 tiles_remaining -= 1; \
\r
303 while(tiles_remaining) \
\r
305 sub_tile_height = 16; \
\r
306 setup_sprite_tile_##edge_mode##_##texture_mode##_4x(edge); \
\r
307 tiles_remaining--; \
\r
310 sub_tile_height = (column_data >> 8) & 0xFF; \
\r
311 setup_sprite_tile_##edge_mode##_##texture_mode##_4x(edge); \
\r
312 setup_sprite_tile_column_edge_post_adjust_##edge_mode##_4x(edge); \
\r
316 #define setup_sprite_column_data_single_4x() \
\r
317 column_data = height \
\r
319 #define setup_sprite_column_data_multi_4x() \
\r
320 column_data = 16 - offset_v; \
\r
321 column_data |= ((height_rounded & 0xF) + 1) << 8; \
\r
322 column_data |= (tile_height - 1) << 16 \
\r
325 #define setup_sprite_tile_column_width_single_4x(texture_mode, multi_height, \
\r
328 setup_sprite_column_data_##multi_height##_4x(); \
\r
329 left_mask_bits = left_block_mask | right_block_mask; \
\r
330 right_mask_bits = left_mask_bits >> 16; \
\r
332 setup_sprite_tile_column_height_##multi_height##_4x(edge_mode, edge, \
\r
336 #define setup_sprite_tiled_advance_column_4x() \
\r
337 texture_offset_base += 0x100; \
\r
338 if((texture_offset_base & 0xF00) == 0) \
\r
339 texture_offset_base -= (0x100 + 0xF00) \
\r
341 #define setup_sprite_tile_column_width_multi_4x(texture_mode, multi_height, \
\r
342 left_mode, right_mode) \
\r
344 setup_sprite_column_data_##multi_height##_4x(); \
\r
345 s32 fb_ptr_advance_column = 32 - (2048 * height); \
\r
348 left_mask_bits = left_block_mask; \
\r
349 right_mask_bits = left_mask_bits >> 16; \
\r
351 setup_sprite_tile_column_height_##multi_height##_4x(left_mode, right, \
\r
353 fb_ptr += fb_ptr_advance_column; \
\r
355 left_mask_bits = 0x00; \
\r
356 right_mask_bits = 0x00; \
\r
358 while(tile_width) \
\r
360 setup_sprite_tiled_advance_column_4x(); \
\r
361 setup_sprite_tile_column_height_##multi_height##_4x(full, none, \
\r
363 fb_ptr += fb_ptr_advance_column; \
\r
367 left_mask_bits = right_block_mask; \
\r
368 right_mask_bits = left_mask_bits >> 16; \
\r
370 setup_sprite_tiled_advance_column(); \
\r
371 setup_sprite_tile_column_height_##multi_height##_4x(right_mode, left, \
\r
376 #define setup_sprite_tiled_builder_4x(texture_mode) \
\r
377 void setup_sprite_##texture_mode##_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y, \
\r
378 s32 u, s32 v, s32 width, s32 height, u32 color) \
\r
380 s32 offset_u = u & 0xF; \
\r
381 s32 offset_v = v & 0xF; \
\r
383 s32 width_rounded = offset_u + width + 15; \
\r
384 s32 height_rounded = offset_v + height + 15; \
\r
385 s32 tile_height = height_rounded / 16; \
\r
386 s32 tile_width = width_rounded / 16; \
\r
387 u32 offset_u_right = width_rounded & 0xF; \
\r
389 u32 left_block_mask = ~(0xFFFFFFFF << (offset_u * 2)); \
\r
390 u32 right_block_mask = 0xFFFFFFFC << (offset_u_right * 2); \
\r
392 u32 left_mask_bits; \
\r
393 u32 right_mask_bits; \
\r
395 u32 sub_tile_height; \
\r
398 u32 texture_mask = (psx_gpu->texture_mask_width & 0xF) | \
\r
399 ((psx_gpu->texture_mask_height & 0xF) << 4) | \
\r
400 ((psx_gpu->texture_mask_width >> 4) << 8) | \
\r
401 ((psx_gpu->texture_mask_height >> 4) << 12); \
\r
402 u32 texture_offset = ((v & 0xF) << 4) | ((u & 0xF0) << 4) | \
\r
403 ((v & 0xF0) << 8); \
\r
404 u32 texture_offset_base = texture_offset; \
\r
405 u32 control_mask; \
\r
407 u16 *fb_ptr = psx_gpu->vram_out_ptr + (y * 1024) + (x - offset_u * 2); \
\r
408 u32 num_blocks = psx_gpu->num_blocks; \
\r
409 block_struct *block = psx_gpu->blocks + num_blocks; \
\r
411 u16 *texture_block_ptr; \
\r
414 setup_sprite_tiled_initialize_##texture_mode##_4x(); \
\r
416 control_mask = tile_width == 1; \
\r
417 control_mask |= (tile_height == 1) << 1; \
\r
418 control_mask |= ((left_block_mask & 0xFFFF) == 0xFFFF) << 2; \
\r
419 control_mask |= (((right_block_mask >> 16) & 0xFFFF) == 0xFFFF) << 3; \
\r
421 sprites_##texture_mode++; \
\r
423 switch(control_mask) \
\r
427 setup_sprite_tile_column_width_multi_4x(texture_mode, multi, full, \
\r
432 setup_sprite_tile_column_width_single_4x(texture_mode, multi, full, \
\r
437 setup_sprite_tile_column_width_multi_4x(texture_mode, single, full, \
\r
442 setup_sprite_tile_column_width_single_4x(texture_mode, single, full, \
\r
447 setup_sprite_tile_column_width_multi_4x(texture_mode, multi, half, \
\r
452 setup_sprite_tile_column_width_single_4x(texture_mode, multi, half, \
\r
457 setup_sprite_tile_column_width_multi_4x(texture_mode, single, half, \
\r
462 setup_sprite_tile_column_width_single_4x(texture_mode, single, half, \
\r
467 setup_sprite_tile_column_width_multi_4x(texture_mode, multi, full, \
\r
472 setup_sprite_tile_column_width_single_4x(texture_mode, multi, half, \
\r
477 setup_sprite_tile_column_width_multi_4x(texture_mode, single, full, \
\r
482 setup_sprite_tile_column_width_single_4x(texture_mode, single, half, \
\r
487 setup_sprite_tile_column_width_multi_4x(texture_mode, multi, half, \
\r
492 setup_sprite_tile_column_width_multi_4x(texture_mode, single, half, \
\r
499 void setup_sprite_4bpp_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u, s32 v,
\r
500 s32 width, s32 height, u32 color);
\r
501 void setup_sprite_8bpp_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u, s32 v,
\r
502 s32 width, s32 height, u32 color);
\r
503 void setup_sprite_16bpp_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u, s32 v,
\r
504 s32 width, s32 height, u32 color);
\r
506 //#ifndef NEON_BUILD
\r
508 setup_sprite_tiled_builder_4x(4bpp);
\r
509 setup_sprite_tiled_builder_4x(8bpp);
\r
511 void setup_sprite_16bpp_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u,
\r
512 s32 v, s32 width, s32 height, u32 color)
\r
514 u32 left_offset = u & 0x7;
\r
515 u32 width_rounded = width + left_offset + 7;
\r
517 u16 *fb_ptr = psx_gpu->vram_out_ptr + (y * 1024) + (s32)(x - left_offset * 2);
\r
518 u32 right_width = width_rounded & 0x7;
\r
519 u32 block_width = width_rounded / 8;
\r
520 u32 fb_ptr_pitch = (2048 + 16) - (block_width * 16);
\r
522 u32 left_mask_bits = ~(0xFFFF << (left_offset * 2));
\r
523 u32 right_mask_bits = 0xFFFC << (right_width * 2);
\r
525 u32 texture_offset_base = u + (v * 1024);
\r
527 psx_gpu->texture_mask_width | (psx_gpu->texture_mask_height * 1024);
\r
529 u32 blocks_remaining;
\r
530 u32 num_blocks = psx_gpu->num_blocks;
\r
531 block_struct *block = psx_gpu->blocks + num_blocks;
\r
533 u16 *texture_page_ptr = psx_gpu->texture_page_ptr;
\r
534 u16 *texture_block_ptr;
\r
536 texture_offset_base &= ~0x7;
\r
540 if(block_width == 1)
\r
542 u32 mask_bits = left_mask_bits | right_mask_bits;
\r
543 u32 mask_bits_a = mask_bits & 0xFF;
\r
544 u32 mask_bits_b = mask_bits >> 8;
\r
547 vec_8x16u texels_wide;
\r
552 sprite_blocks += 4;
\r
554 if(num_blocks > MAX_BLOCKS)
\r
556 flush_render_block_buffer(psx_gpu);
\r
558 block = psx_gpu->blocks;
\r
561 texture_block_ptr =
\r
562 texture_page_ptr + (texture_offset_base & texture_mask);
\r
564 load_128b(texels, texture_block_ptr);
\r
566 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.low, texels.low);
\r
567 block->texels = texels_wide;
\r
568 block->draw_mask_bits = mask_bits_a;
\r
569 block->fb_ptr = fb_ptr;
\r
572 block->texels = texels_wide;
\r
573 block->draw_mask_bits = mask_bits_a;
\r
574 block->fb_ptr = fb_ptr + 1024;
\r
577 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.high, texels.high);
\r
578 block->texels = texels_wide;
\r
579 block->draw_mask_bits = mask_bits_b;
\r
580 block->fb_ptr = fb_ptr + 8;
\r
583 block->texels = texels_wide;
\r
584 block->draw_mask_bits = mask_bits_b;
\r
585 block->fb_ptr = fb_ptr + 8 + 1024;
\r
588 texture_offset_base += 1024;
\r
592 psx_gpu->num_blocks = num_blocks;
\r
597 u32 texture_offset;
\r
599 u32 left_mask_bits_a = left_mask_bits & 0xFF;
\r
600 u32 left_mask_bits_b = left_mask_bits >> 8;
\r
601 u32 right_mask_bits_a = right_mask_bits & 0xFF;
\r
602 u32 right_mask_bits_b = right_mask_bits >> 8;
\r
605 vec_8x16u texels_wide;
\r
609 blocks_remaining = block_width - 2;
\r
610 num_blocks += block_width * 4;
\r
611 sprite_blocks += block_width * 4;
\r
613 if(num_blocks > MAX_BLOCKS)
\r
615 flush_render_block_buffer(psx_gpu);
\r
616 num_blocks = block_width * 4;
\r
617 block = psx_gpu->blocks;
\r
620 texture_offset = texture_offset_base;
\r
621 texture_offset_base += 1024;
\r
623 texture_block_ptr = texture_page_ptr + (texture_offset & texture_mask);
\r
625 load_128b(texels, texture_block_ptr);
\r
627 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.low, texels.low);
\r
628 block->texels = texels_wide;
\r
629 block->draw_mask_bits = left_mask_bits_a;
\r
630 block->fb_ptr = fb_ptr;
\r
633 block->texels = texels_wide;
\r
634 block->draw_mask_bits = left_mask_bits_a;
\r
635 block->fb_ptr = fb_ptr + 1024;
\r
638 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.high, texels.high);
\r
639 block->texels = texels_wide;
\r
640 block->draw_mask_bits = left_mask_bits_b;
\r
641 block->fb_ptr = fb_ptr + 8;
\r
644 block->texels = texels_wide;
\r
645 block->draw_mask_bits = left_mask_bits_b;
\r
646 block->fb_ptr = fb_ptr + 8 + 1024;
\r
649 texture_offset += 8;
\r
652 while(blocks_remaining)
\r
654 texture_block_ptr = texture_page_ptr + (texture_offset & texture_mask);
\r
655 load_128b(texels, texture_block_ptr);
\r
657 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.low, texels.low);
\r
658 block->texels = texels_wide;
\r
659 block->draw_mask_bits = 0;
\r
660 block->fb_ptr = fb_ptr;
\r
663 block->texels = texels_wide;
\r
664 block->draw_mask_bits = 0;
\r
665 block->fb_ptr = fb_ptr + 1024;
\r
668 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.high, texels.high);
\r
669 block->texels = texels_wide;
\r
670 block->draw_mask_bits = 0;
\r
671 block->fb_ptr = fb_ptr + 8;
\r
674 block->texels = texels_wide;
\r
675 block->draw_mask_bits = 0;
\r
676 block->fb_ptr = fb_ptr + 8 + 1024;
\r
679 texture_offset += 8;
\r
682 blocks_remaining--;
\r
685 texture_block_ptr = texture_page_ptr + (texture_offset & texture_mask);
\r
686 load_128b(texels, texture_block_ptr);
\r
688 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.low, texels.low);
\r
689 block->texels = texels_wide;
\r
690 block->draw_mask_bits = right_mask_bits_a;
\r
691 block->fb_ptr = fb_ptr;
\r
694 block->texels = texels_wide;
\r
695 block->draw_mask_bits = right_mask_bits_a;
\r
696 block->fb_ptr = fb_ptr + 1024;
\r
699 zip_4x32b(vector_cast(vec_4x32u, texels_wide), texels.high, texels.high);
\r
700 block->texels = texels_wide;
\r
701 block->draw_mask_bits = right_mask_bits_b;
\r
702 block->fb_ptr = fb_ptr + 8;
\r
705 block->texels = texels_wide;
\r
706 block->draw_mask_bits = right_mask_bits_b;
\r
707 block->fb_ptr = fb_ptr + 8 + 1024;
\r
710 fb_ptr += fb_ptr_pitch;
\r
713 psx_gpu->num_blocks = num_blocks;
\r
720 static void setup_sprite_untextured_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y,
\r
721 s32 u, s32 v, s32 width, s32 height, u32 color)
\r
723 setup_sprite_untextured(psx_gpu, x, y, u, v, width * 2, height * 2, color);
\r
726 #define setup_sprite_blocks_switch_textured_4x(texture_mode) \
\r
727 setup_sprite_##texture_mode##_4x \
\r
729 #define setup_sprite_blocks_switch_untextured_4x(texture_mode) \
\r
730 setup_sprite_untextured_4x \
\r
732 #define setup_sprite_blocks_switch_4x(texturing, texture_mode) \
\r
733 setup_sprite_blocks_switch_##texturing##_4x(texture_mode) \
\r
736 #define render_sprite_blocks_switch_block_modulation_4x(texture_mode, \
\r
737 blend_mode, mask_evaluate, shading, dithering, texturing, blending, \
\r
740 setup_sprite_blocks_switch_4x(texturing, texture_mode), \
\r
741 texture_sprite_blocks_switch_##texturing(texture_mode), \
\r
742 shade_blocks_switch(unshaded, texturing, modulation, undithered, blending, \
\r
744 blend_blocks_switch(texturing, blending, blend_mode, mask_evaluate) \
\r
747 #define render_sprite_blocks_switch_block_blending_4x(texture_mode, \
\r
748 blend_mode, mask_evaluate, shading, dithering, texturing, blending) \
\r
749 render_sprite_blocks_switch_block_modulation_4x(texture_mode, blend_mode, \
\r
750 mask_evaluate, shading, dithering, texturing, blending, modulated), \
\r
751 render_sprite_blocks_switch_block_modulation_4x(texture_mode, blend_mode, \
\r
752 mask_evaluate, shading, dithering, texturing, blending, unmodulated) \
\r
754 #define render_sprite_blocks_switch_block_texturing_4x(texture_mode, \
\r
755 blend_mode, mask_evaluate, shading, dithering, texturing) \
\r
756 render_sprite_blocks_switch_block_blending_4x(texture_mode, blend_mode, \
\r
757 mask_evaluate, shading, dithering, texturing, unblended), \
\r
758 render_sprite_blocks_switch_block_blending_4x(texture_mode, blend_mode, \
\r
759 mask_evaluate, shading, dithering, texturing, blended) \
\r
761 #define render_sprite_blocks_switch_block_dithering_4x(texture_mode, \
\r
762 blend_mode, mask_evaluate, shading, dithering) \
\r
763 render_sprite_blocks_switch_block_texturing_4x(texture_mode, blend_mode, \
\r
764 mask_evaluate, shading, dithering, untextured), \
\r
765 render_sprite_blocks_switch_block_texturing_4x(texture_mode, blend_mode, \
\r
766 mask_evaluate, shading, dithering, textured) \
\r
768 #define render_sprite_blocks_switch_block_shading_4x(texture_mode, blend_mode, \
\r
769 mask_evaluate, shading) \
\r
770 render_sprite_blocks_switch_block_dithering_4x(texture_mode, blend_mode, \
\r
771 mask_evaluate, shading, undithered), \
\r
772 render_sprite_blocks_switch_block_dithering_4x(texture_mode, blend_mode, \
\r
773 mask_evaluate, shading, dithered) \
\r
775 #define render_sprite_blocks_switch_block_mask_evaluate_4x(texture_mode, \
\r
776 blend_mode, mask_evaluate) \
\r
777 render_sprite_blocks_switch_block_shading_4x(texture_mode, blend_mode, \
\r
778 mask_evaluate, unshaded), \
\r
779 render_sprite_blocks_switch_block_shading_4x(texture_mode, blend_mode, \
\r
780 mask_evaluate, shaded) \
\r
782 #define render_sprite_blocks_switch_block_blend_mode_4x(texture_mode, \
\r
784 render_sprite_blocks_switch_block_mask_evaluate_4x(texture_mode, blend_mode, \
\r
786 render_sprite_blocks_switch_block_mask_evaluate_4x(texture_mode, blend_mode, \
\r
789 #define render_sprite_blocks_switch_block_texture_mode_4x(texture_mode) \
\r
790 render_sprite_blocks_switch_block_blend_mode_4x(texture_mode, average), \
\r
791 render_sprite_blocks_switch_block_blend_mode_4x(texture_mode, add), \
\r
792 render_sprite_blocks_switch_block_blend_mode_4x(texture_mode, subtract), \
\r
793 render_sprite_blocks_switch_block_blend_mode_4x(texture_mode, add_fourth) \
\r
795 #define render_sprite_blocks_switch_block_4x() \
\r
796 render_sprite_blocks_switch_block_texture_mode_4x(4bpp), \
\r
797 render_sprite_blocks_switch_block_texture_mode_4x(8bpp), \
\r
798 render_sprite_blocks_switch_block_texture_mode_4x(16bpp), \
\r
799 render_sprite_blocks_switch_block_texture_mode_4x(4bpp) \
\r
802 render_block_handler_struct render_sprite_block_handlers_4x[] =
\r
804 render_sprite_blocks_switch_block_4x()
\r
808 void render_sprite_4x(psx_gpu_struct *psx_gpu, s32 x, s32 y, u32 u, u32 v,
\r
809 s32 width, s32 height, u32 flags, u32 color)
\r
811 s32 x_right = x + width - 1;
\r
812 s32 y_bottom = y + height - 1;
\r
818 if(x < psx_gpu->viewport_start_x)
\r
820 u32 clip = psx_gpu->viewport_start_x - x;
\r
826 if(y < psx_gpu->viewport_start_y)
\r
828 s32 clip = psx_gpu->viewport_start_y - y;
\r
834 if(x_right > psx_gpu->viewport_end_x)
\r
835 width -= x_right - psx_gpu->viewport_end_x;
\r
837 if(y_bottom > psx_gpu->viewport_end_y)
\r
838 height -= y_bottom - psx_gpu->viewport_end_y;
\r
840 if((width <= 0) || (height <= 0))
\r
847 span_pixels += width * height;
\r
851 u32 render_state = flags &
\r
852 (RENDER_FLAGS_MODULATE_TEXELS | RENDER_FLAGS_BLEND |
\r
853 RENDER_FLAGS_TEXTURE_MAP);
\r
855 (psx_gpu->render_state_base & ~RENDER_STATE_DITHER);
\r
857 if((psx_gpu->render_state != render_state) ||
\r
858 (psx_gpu->primitive_type != PRIMITIVE_TYPE_SPRITE))
\r
860 psx_gpu->render_state = render_state;
\r
861 flush_render_block_buffer(psx_gpu);
\r
867 psx_gpu->primitive_type = PRIMITIVE_TYPE_SPRITE;
\r
871 if(psx_gpu->triangle_color != color)
\r
873 flush_render_block_buffer(psx_gpu);
\r
874 psx_gpu->triangle_color = color;
\r
877 if(color == 0x808080)
\r
878 render_state |= RENDER_FLAGS_MODULATE_TEXELS;
\r
880 render_block_handler_struct *render_block_handler =
\r
881 &(render_sprite_block_handlers_4x[render_state]);
\r
882 psx_gpu->render_block_handler = render_block_handler;
\r
884 ((setup_sprite_function_type *)render_block_handler->setup_blocks)
\r
885 (psx_gpu, x, y, u, v, width, height, color);
\r