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;
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);
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;
vec_4x32u g_block_span;
vec_4x32u b_block_span;
- // 76 bytes
u32 b;
u32 b_dy;
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;
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;
u16 mask_msb;
- // 8 bytes
u8 triangle_winding;
u8 display_area_draw_enable;
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;
// 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];
#define uvrg_dx3l d6
#define uvrg_dx3h d7
+#define uvrgb_phase q13
.align 4
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
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 }
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
#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
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);
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);
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);
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() { \
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) { \