X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fgpu_neon%2Fpsx_gpu%2Fpsx_gpu_parse.c;h=4260bc70330b7885f3f720635143ebdea53600ec;hb=59d15d23d97d4347d8046057013f8979db0914f0;hp=af82d7e542191eac6dfeea310c03b068396ee72b;hpb=50f9355a2338111d940ed408f52fe1defe4df23e;p=pcsx_rearmed.git diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c b/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c index af82d7e5..4260bc70 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c +++ b/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c @@ -601,12 +601,22 @@ u32 gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_command) break; } - case 0x80: // vid -> vid - render_block_move(psx_gpu, list_s16[2] & 0x3FF, list_s16[3] & 0x1FF, - list_s16[4] & 0x3FF, list_s16[5] & 0x1FF, - ((list_s16[6] - 1) & 0x3FF) + 1, ((list_s16[7] - 1) & 0x1FF) + 1); - break; - + case 0x80: // vid -> vid + { + u32 sx = list_s16[2] & 0x3FF; + u32 sy = list_s16[3] & 0x1FF; + u32 dx = list_s16[4] & 0x3FF; + u32 dy = list_s16[5] & 0x1FF; + u32 w = ((list_s16[6] - 1) & 0x3FF) + 1; + u32 h = ((list_s16[7] - 1) & 0x1FF) + 1; + + if (sx == dx && sy == dy && psx_gpu->mask_msb == 0) + break; + + render_block_move(psx_gpu, sx, sy, dx, dy, w, h); + break; + } + #ifdef PCSX case 0xA0: // sys -> vid case 0xC0: // vid -> sys @@ -750,15 +760,20 @@ breakloop: return list - list_start; } -#define select_enhancement_buf(psx_gpu) { \ - u32 _x, _b; \ - _x = psx_gpu->saved_viewport_start_x + 8; \ - for (_b = 0; _x >= psx_gpu->enhancement_x_threshold; _b++) \ - _x -= psx_gpu->enhancement_x_threshold; \ - psx_gpu->enhancement_current_buf_ptr = \ - psx_gpu->enhancement_buf_ptr + _b * 1024 * 1024; \ +#ifdef PCSX + +static void *select_enhancement_buf_ptr(psx_gpu_struct *psx_gpu, u32 x) +{ + u32 b; + for (b = 0; x >= psx_gpu->enhancement_x_threshold; b++) + x -= psx_gpu->enhancement_x_threshold; + return psx_gpu->enhancement_buf_ptr + b * 1024 * 1024; } +#define select_enhancement_buf(psx_gpu) \ + psx_gpu->enhancement_current_buf_ptr = \ + select_enhancement_buf_ptr(psx_gpu, psx_gpu->saved_viewport_start_x + 8) + #define enhancement_disable() { \ psx_gpu->vram_out_ptr = psx_gpu->vram_ptr; \ psx_gpu->viewport_start_x = psx_gpu->saved_viewport_start_x; \ @@ -772,8 +787,8 @@ breakloop: psx_gpu->vram_out_ptr = psx_gpu->enhancement_current_buf_ptr; \ psx_gpu->viewport_start_x = psx_gpu->saved_viewport_start_x * 2; \ psx_gpu->viewport_start_y = psx_gpu->saved_viewport_start_y * 2; \ - psx_gpu->viewport_end_x = psx_gpu->saved_viewport_end_x * 2; \ - psx_gpu->viewport_end_y = psx_gpu->saved_viewport_end_y * 2; \ + psx_gpu->viewport_end_x = psx_gpu->saved_viewport_end_x * 2 + 1; \ + psx_gpu->viewport_end_y = psx_gpu->saved_viewport_end_y * 2 + 1; \ psx_gpu->uvrgb_phase = 0x1000; \ } @@ -800,6 +815,11 @@ breakloop: extern void scale2x_tiles8(void *dst, const void *src, int w8, int h); +#ifndef NEON_BUILD +// TODO? +void scale2x_tiles8(void *dst, const void *src, int w8, int h) {} +#endif + static int disable_main_render; static void do_triangle_enhanced(psx_gpu_struct *psx_gpu, @@ -846,6 +866,8 @@ static void do_quad_enhanced(psx_gpu_struct *psx_gpu, vertex_struct *vertexes, } } +#if 0 + #define fill_vertex(i, x_, y_, u_, v_, rgb_) \ vertexes[i].x = x_; \ vertexes[i].y = y_; \ @@ -855,7 +877,7 @@ static void do_quad_enhanced(psx_gpu_struct *psx_gpu, vertex_struct *vertexes, vertexes[i].g = (rgb_) >> 8; \ vertexes[i].b = (rgb_) >> 16 -static void do_esprite_in_triangles(psx_gpu_struct *psx_gpu, int x, int y, +static void do_sprite_enhanced(psx_gpu_struct *psx_gpu, int x, int y, u32 u, u32 v, u32 w, u32 h, u32 cmd_rgb) { vertex_struct *vertex_ptrs[3]; @@ -910,6 +932,17 @@ static void do_esprite_in_triangles(psx_gpu_struct *psx_gpu, int x, int y, psx_gpu->render_state_base = render_state_base_saved; } +#else +static void do_sprite_enhanced(psx_gpu_struct *psx_gpu, int x, int y, + u32 u, u32 v, u32 w, u32 h, u32 cmd_rgb) +{ + u32 flags = (cmd_rgb >> 24); + u32 color = cmd_rgb & 0xffffff; + + psx_gpu->vram_out_ptr = psx_gpu->enhancement_current_buf_ptr; + render_sprite_4x(psx_gpu, x, y, u, v, w, h, flags, color); +} +#endif u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_command) { @@ -1198,7 +1231,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c u32 height = list_s16[5] & 0x1FF; render_sprite(psx_gpu, x, y, 0, 0, width, height, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, 0, 0, width, height, list[0]); + do_sprite_enhanced(psx_gpu, x, y, 0, 0, width, height, list[0]); break; } @@ -1215,7 +1248,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c render_sprite(psx_gpu, x, y, u, v, width, height, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, u, v, width, height, list[0]); + do_sprite_enhanced(psx_gpu, x, y, u, v, width, height, list[0]); break; } @@ -1228,7 +1261,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c s32 y = sign_extend_11bit(list_s16[3] + psx_gpu->offset_y); render_sprite(psx_gpu, x, y, 0, 0, 1, 1, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, 0, 0, 1, 1, list[0]); + do_sprite_enhanced(psx_gpu, x, y, 0, 0, 1, 1, list[0]); break; } @@ -1241,7 +1274,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c s32 y = sign_extend_11bit(list_s16[3] + psx_gpu->offset_y); render_sprite(psx_gpu, x, y, 0, 0, 8, 8, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, 0, 0, 8, 8, list[0]); + do_sprite_enhanced(psx_gpu, x, y, 0, 0, 8, 8, list[0]); break; } @@ -1259,7 +1292,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c render_sprite(psx_gpu, x, y, u, v, 8, 8, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, u, v, 8, 8, list[0]); + do_sprite_enhanced(psx_gpu, x, y, u, v, 8, 8, list[0]); break; } @@ -1272,7 +1305,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c s32 y = sign_extend_11bit(list_s16[3] + psx_gpu->offset_y); render_sprite(psx_gpu, x, y, 0, 0, 16, 16, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, 0, 0, 16, 16, list[0]); + do_sprite_enhanced(psx_gpu, x, y, 0, 0, 16, 16, list[0]); break; } @@ -1289,7 +1322,7 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c set_clut(psx_gpu, list_s16[5]); render_sprite(psx_gpu, x, y, u, v, 16, 16, current_command, list[0]); - do_esprite_in_triangles(psx_gpu, x, y, u, v, 16, 16, list[0]); + do_sprite_enhanced(psx_gpu, x, y, u, v, 16, 16, list[0]); break; } @@ -1301,6 +1334,10 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c u32 dy = list_s16[5] & 0x1FF; u32 w = ((list_s16[6] - 1) & 0x3FF) + 1; u32 h = ((list_s16[7] - 1) & 0x1FF) + 1; + u16 *buf; + + if (sx == dx && sy == dy && psx_gpu->mask_msb == 0) + break; render_block_move(psx_gpu, sx, sy, dx, dy, w, h); if (dy + h > 512) @@ -1308,8 +1345,10 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c sx = sx & ~7; // FIXME? dx = dx * 2 & ~7; dy *= 2; - scale2x_tiles8(psx_gpu->enhancement_buf_ptr + dy * 1024 + dx, - psx_gpu->vram_ptr + sy * 1024 + sx, w / 8, h); + w = (w + 7) / 8; + buf = select_enhancement_buf_ptr(psx_gpu, dx / 2); + scale2x_tiles8(buf + dy * 1024 + dx, + psx_gpu->vram_ptr + sy * 1024 + sx, w, h); break; } @@ -1430,13 +1469,14 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_c } } -#ifdef PCSX + enhancement_disable(); + breakloop: -#endif -enhancement_disable(); if (last_command != NULL) *last_command = current_command; return list - list_start; } +#endif /* PCSX */ + // vim:shiftwidth=2:expandtab