From: notaz Date: Wed, 15 Aug 2012 20:52:38 +0000 (+0300) Subject: psx_gpu: use different uvrgb phase for enhancement X-Git-Tag: r16~15^2~20 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c6063f8985c69362a89a12111f393229ab65d05f;p=pcsx_rearmed.git psx_gpu: use different uvrgb phase for enhancement --- diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu.c b/plugins/gpu_neon/psx_gpu/psx_gpu.c index 1385e2e5..28ebcf51 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu.c +++ b/plugins/gpu_neon/psx_gpu/psx_gpu.c @@ -567,7 +567,7 @@ void compute_all_gradients(psx_gpu_struct *psx_gpu, vertex_struct *a, vec_4x32u uvrg_base; vec_4x32u b_base; - vec_4x32u const_0x8000; + vec_4x32u uvrgb_phase; vec_4x16s d0_a_d3_c, d0_b, d0_c; vec_4x16s d1_a, d1_b, d1_c_d2_a; @@ -596,12 +596,12 @@ void compute_all_gradients(psx_gpu_struct *psx_gpu, vertex_struct *a, setup_gradient_calculation_input(1, b); setup_gradient_calculation_input(2, c); - dup_4x32b(const_0x8000, 0x8000); + dup_4x32b(uvrgb_phase, psx_gpu->uvrgb_phase); shl_long_4x16b(uvrg_base, x0_a_y0_c, 16); shl_long_4x16b(b_base, x0_b, 16); - add_4x32b(uvrg_base, uvrg_base, const_0x8000); - add_4x32b(b_base, b_base, const_0x8000); + add_4x32b(uvrg_base, uvrg_base, uvrgb_phase); + add_4x32b(b_base, b_base, uvrgb_phase); // Can probably pair these, but it'll require careful register allocation sub_4x16b(d0_a_d3_c, x1_a_y1_c, x0_a_y0_c); @@ -4632,6 +4632,7 @@ void initialize_psx_gpu(psx_gpu_struct *psx_gpu, u16 *vram) psx_gpu->render_state = 0; psx_gpu->render_state_base = 0; psx_gpu->num_blocks = 0; + psx_gpu->uvrgb_phase = 0x8000; psx_gpu->vram_ptr = vram; psx_gpu->vram_out_ptr = vram; diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu.h b/plugins/gpu_neon/psx_gpu/psx_gpu.h index 71b99cd9..7252dc2b 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu.h +++ b/plugins/gpu_neon/psx_gpu/psx_gpu.h @@ -123,7 +123,6 @@ typedef struct vec_4x32u g_block_span; vec_4x32u b_block_span; - // 76 bytes u32 b; u32 b_dy; @@ -139,6 +138,8 @@ typedef struct u32 triangle_color; u32 dither_table[4]; + u32 uvrgb_phase; + struct render_block_handler_struct *render_block_handler; void *texture_page_ptr; void *texture_page_base; @@ -146,19 +147,12 @@ typedef struct u16 *vram_ptr; u16 *vram_out_ptr; - // 26 bytes u16 render_state_base; u16 render_state; u16 num_spans; u16 num_blocks; - s16 offset_x; - s16 offset_y; - - u16 clut_settings; - u16 texture_settings; - s16 viewport_start_x; s16 viewport_start_y; s16 viewport_end_x; @@ -166,7 +160,6 @@ typedef struct u16 mask_msb; - // 8 bytes u8 triangle_winding; u8 display_area_draw_enable; @@ -182,6 +175,12 @@ typedef struct u8 primitive_type; u8 render_mode; + s16 offset_x; + s16 offset_y; + + u16 clut_settings; + u16 texture_settings; + // enhancement stuff u16 *enhancement_buf_ptr; s16 saved_viewport_start_x; @@ -191,7 +190,7 @@ typedef struct // Align up to 64 byte boundary to keep the upcoming buffers cache line // aligned, also make reachable with single immediate addition - u8 reserved_a[240]; + u8 reserved_a[236]; // 8KB block_struct blocks[MAX_BLOCKS_PER_ROW]; diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu_arm_neon.S b/plugins/gpu_neon/psx_gpu/psx_gpu_arm_neon.S index 6393e15b..3239412b 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu_arm_neon.S +++ b/plugins/gpu_neon/psx_gpu/psx_gpu_arm_neon.S @@ -182,6 +182,7 @@ #define uvrg_dx3l d6 #define uvrg_dx3h d7 +#define uvrgb_phase q13 .align 4 @@ -313,11 +314,16 @@ function(compute_all_gradients) vmull.s16 ga_uvrg_y, d0_b, d1_b rsbmi ga_bx, ga_bx, #0 + @ r12 = psx_gpu->uvrgb_phase + ldr r12, [ psx_gpu, #psx_gpu_uvrgb_phase_offset ] + vmlsl.s16 ga_uvrg_y, d2_b, d3_b movs gs_by, ga_by, asr #31 vshr.u64 d0, d30, #22 - mov b_base, b0, lsl #16 + add b_base, r12, b0, lsl #16 + + vdup.u32 uvrgb_phase, r12 rsbmi ga_by, ga_by, #0 vclt.s32 gs_uvrg_x, ga_uvrg_x, #0 @ gs_uvrg_x = ga_uvrg_x < 0 @@ -326,7 +332,6 @@ function(compute_all_gradients) ldrb r12, [ psx_gpu, #psx_gpu_triangle_winding_offset ] vclt.s32 gs_uvrg_y, ga_uvrg_y, #0 @ gs_uvrg_y = ga_uvrg_y < 0 - add b_base, b_base, #0x8000 rsb r12, r12, #0 @ r12 = -(triangle->winding) vdup.u32 w_mask, r12 @ w_mask = { -w, -w, -w, -w } @@ -335,7 +340,7 @@ function(compute_all_gradients) vshll.u16 uvrg_base, uvrg0, #16 @ uvrg_base = uvrg0 << 16 vdup.u32 r_shift, r14 @ r_shift = { shift, shift, shift, shift } - vorr.u32 uvrg_base, #0x8000 + vadd.u32 uvrg_base, uvrgb_phase vabs.s32 ga_uvrg_x, ga_uvrg_x @ ga_uvrg_x = abs(ga_uvrg_x) vmov area_r_s, s0 @ area_r_s = triangle_reciprocal diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu_offsets.h b/plugins/gpu_neon/psx_gpu/psx_gpu_offsets.h index 7ebf7dbe..1307891e 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu_offsets.h +++ b/plugins/gpu_neon/psx_gpu/psx_gpu_offsets.h @@ -18,35 +18,36 @@ #define psx_gpu_dirty_textures_8bpp_alternate_mask_offset 0xb0 #define psx_gpu_triangle_color_offset 0xb4 #define psx_gpu_dither_table_offset 0xb8 -#define psx_gpu_render_block_handler_offset 0xc8 -#define psx_gpu_texture_page_ptr_offset 0xcc -#define psx_gpu_texture_page_base_offset 0xd0 -#define psx_gpu_clut_ptr_offset 0xd4 -#define psx_gpu_vram_ptr_offset 0xd8 -#define psx_gpu_vram_out_ptr_offset 0xdc -#define psx_gpu_render_state_base_offset 0xe0 -#define psx_gpu_render_state_offset 0xe2 -#define psx_gpu_num_spans_offset 0xe4 -#define psx_gpu_num_blocks_offset 0xe6 -#define psx_gpu_offset_x_offset 0xe8 -#define psx_gpu_offset_y_offset 0xea -#define psx_gpu_clut_settings_offset 0xec -#define psx_gpu_texture_settings_offset 0xee -#define psx_gpu_viewport_start_x_offset 0xf0 -#define psx_gpu_viewport_start_y_offset 0xf2 -#define psx_gpu_viewport_end_x_offset 0xf4 -#define psx_gpu_viewport_end_y_offset 0xf6 -#define psx_gpu_mask_msb_offset 0xf8 -#define psx_gpu_triangle_winding_offset 0xfa -#define psx_gpu_display_area_draw_enable_offset 0xfb -#define psx_gpu_current_texture_page_offset 0xfc -#define psx_gpu_last_8bpp_texture_page_offset 0xfd -#define psx_gpu_texture_mask_width_offset 0xfe -#define psx_gpu_texture_mask_height_offset 0xff -#define psx_gpu_texture_window_x_offset 0x100 -#define psx_gpu_texture_window_y_offset 0x101 -#define psx_gpu_primitive_type_offset 0x102 -#define psx_gpu_render_mode_offset 0x103 +#define psx_gpu_uvrgb_phase_offset 0xc8 +#define psx_gpu_render_block_handler_offset 0xcc +#define psx_gpu_texture_page_ptr_offset 0xd0 +#define psx_gpu_texture_page_base_offset 0xd4 +#define psx_gpu_clut_ptr_offset 0xd8 +#define psx_gpu_vram_ptr_offset 0xdc +#define psx_gpu_vram_out_ptr_offset 0xe0 +#define psx_gpu_render_state_base_offset 0xe4 +#define psx_gpu_render_state_offset 0xe6 +#define psx_gpu_num_spans_offset 0xe8 +#define psx_gpu_num_blocks_offset 0xea +#define psx_gpu_viewport_start_x_offset 0xec +#define psx_gpu_viewport_start_y_offset 0xee +#define psx_gpu_viewport_end_x_offset 0xf0 +#define psx_gpu_viewport_end_y_offset 0xf2 +#define psx_gpu_mask_msb_offset 0xf4 +#define psx_gpu_triangle_winding_offset 0xf6 +#define psx_gpu_display_area_draw_enable_offset 0xf7 +#define psx_gpu_current_texture_page_offset 0xf8 +#define psx_gpu_last_8bpp_texture_page_offset 0xf9 +#define psx_gpu_texture_mask_width_offset 0xfa +#define psx_gpu_texture_mask_height_offset 0xfb +#define psx_gpu_texture_window_x_offset 0xfc +#define psx_gpu_texture_window_y_offset 0xfd +#define psx_gpu_primitive_type_offset 0xfe +#define psx_gpu_render_mode_offset 0xff +#define psx_gpu_offset_x_offset 0x100 +#define psx_gpu_offset_y_offset 0x102 +#define psx_gpu_clut_settings_offset 0x104 +#define psx_gpu_texture_settings_offset 0x106 #define psx_gpu_blocks_offset 0x200 #define psx_gpu_span_uvrg_offset_offset 0x2200 #define psx_gpu_span_edge_data_offset 0x4200 diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu_offsets_update.c b/plugins/gpu_neon/psx_gpu/psx_gpu_offsets_update.c index ff74f34b..5adfb75f 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu_offsets_update.c +++ b/plugins/gpu_neon/psx_gpu/psx_gpu_offsets_update.c @@ -43,6 +43,7 @@ int main() WRITE_OFFSET(f, dirty_textures_8bpp_alternate_mask); WRITE_OFFSET(f, triangle_color); WRITE_OFFSET(f, dither_table); + WRITE_OFFSET(f, uvrgb_phase); WRITE_OFFSET(f, render_block_handler); WRITE_OFFSET(f, texture_page_ptr); WRITE_OFFSET(f, texture_page_base); @@ -53,10 +54,6 @@ int main() WRITE_OFFSET(f, render_state); WRITE_OFFSET(f, num_spans); WRITE_OFFSET(f, num_blocks); - WRITE_OFFSET(f, offset_x); - WRITE_OFFSET(f, offset_y); - WRITE_OFFSET(f, clut_settings); - WRITE_OFFSET(f, texture_settings); WRITE_OFFSET(f, viewport_start_x); WRITE_OFFSET(f, viewport_start_y); WRITE_OFFSET(f, viewport_end_x); @@ -72,6 +69,10 @@ int main() WRITE_OFFSET(f, texture_window_y); WRITE_OFFSET(f, primitive_type); WRITE_OFFSET(f, render_mode); + WRITE_OFFSET(f, offset_x); + WRITE_OFFSET(f, offset_y); + WRITE_OFFSET(f, clut_settings); + WRITE_OFFSET(f, texture_settings); WRITE_OFFSET(f, blocks); WRITE_OFFSET(f, span_uvrg_offset); WRITE_OFFSET(f, span_edge_data); diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c b/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c index 2e1c0b86..1c449eac 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c +++ b/plugins/gpu_neon/psx_gpu/psx_gpu_parse.c @@ -757,6 +757,7 @@ breakloop: psx_gpu->viewport_end_x = psx_gpu->saved_viewport_end_x; \ psx_gpu->viewport_end_y = psx_gpu->saved_viewport_end_y; \ psx_gpu->render_mode &= ~RENDER_DOUBLE_MODE; \ + psx_gpu->uvrgb_phase = 0x8000; \ } #define enhancement_enable() { \ @@ -766,6 +767,7 @@ breakloop: 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->render_mode |= RENDER_DOUBLE_MODE; \ + psx_gpu->uvrgb_phase = 0x1000; \ } #define shift_vertices3(v) { \