X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fgpu_neon%2Fpsx_gpu%2Fpsx_gpu.h;h=1eaa99a4b0aad0719cb664b263f2c39f4adaef45;hp=4605c39f042cec9fea858c68c2525910747f8d7b;hb=HEAD;hpb=69b09c0d33efd71ebe4886cfae41c162803683d5 diff --git a/plugins/gpu_neon/psx_gpu/psx_gpu.h b/plugins/gpu_neon/psx_gpu/psx_gpu.h index 4605c39f..e585611e 100644 --- a/plugins/gpu_neon/psx_gpu/psx_gpu.h +++ b/plugins/gpu_neon/psx_gpu/psx_gpu.h @@ -15,6 +15,26 @@ #ifndef PSX_GPU_H #define PSX_GPU_H +#define MAX_SPANS 512 +#define MAX_BLOCKS 64 +#define MAX_BLOCKS_PER_ROW 128 + +#define SPAN_DATA_BLOCKS_SIZE 32 + +#define AHACK_TEXTURE_ADJ_U (1 << 0) +#define AHACK_TEXTURE_ADJ_V (1 << 1) + +#ifndef __ASSEMBLER__ + +#include "vector_types.h" + +#ifndef unlikely +#define unlikely(x) __builtin_expect((x), 0) +#endif + +#define sign_extend_11bit(value) \ + (((s32)((value) << 21)) >> 21) + typedef enum { PRIMITIVE_TYPE_TRIANGLE = 0, @@ -56,8 +76,8 @@ typedef enum typedef enum { RENDER_INTERLACE_ENABLED = 0x1, - RENDER_INTERLACE_ODD = 0x2 -} render_interlace_enum; + RENDER_INTERLACE_ODD = 0x2, +} render_mode_enum; typedef struct { @@ -67,7 +87,7 @@ typedef struct u16 y; } edge_data_struct; -// 64 bytes total +// 64 (72) bytes total typedef struct { // 16 bytes @@ -91,7 +111,7 @@ typedef struct vec_8x16u pixels; }; - // 8 bytes + // 8 (16) bytes u32 draw_mask_bits; u16 *fb_ptr; @@ -99,12 +119,6 @@ typedef struct vec_8x16u dither_offsets; } block_struct; -#define MAX_SPANS 512 -#define MAX_BLOCKS 64 -#define MAX_BLOCKS_PER_ROW 128 - -#define SPAN_DATA_BLOCKS_SIZE 32 - typedef struct render_block_handler_struct render_block_handler_struct; typedef struct @@ -122,7 +136,6 @@ typedef struct vec_4x32u g_block_span; vec_4x32u b_block_span; - // 72 bytes u32 b; u32 b_dy; @@ -143,20 +156,16 @@ typedef struct void *texture_page_base; u16 *clut_ptr; u16 *vram_ptr; + u16 *vram_out_ptr; + + u32 uvrgb_phase; - // 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; @@ -164,7 +173,6 @@ typedef struct u16 mask_msb; - // 8 bytes u8 triangle_winding; u8 display_area_draw_enable; @@ -178,11 +186,43 @@ typedef struct u8 texture_window_y; u8 primitive_type; - u8 interlace_mode; + u8 render_mode; + + s16 offset_x; + s16 offset_y; + + u16 clut_settings; + u16 texture_settings; + + u32 *reciprocal_table_ptr; + + // enhancement stuff + u16 *enhancement_buf_ptr; // main alloc + u16 *enhancement_current_buf_ptr; // offset into above, 4 bufs + u32 hacks_active; // AHACK_TEXTURE_ADJ_U ... + u32 saved_hres; + s16 saved_viewport_start_x; + s16 saved_viewport_start_y; + s16 saved_viewport_end_x; + s16 saved_viewport_end_y; + struct psx_gpu_scanout { + u16 x, y, w, h; + } enhancement_scanouts[4]; // 0-3 specifying which buf to use + u16 enhancement_scanout_eselect; // eviction selector + u16 enhancement_current_buf; + + u32 allow_dithering:1; + u32 force_dithering:1; + u32 hack_disable_main:1; + u32 hack_texture_adj:1; // Align up to 64 byte boundary to keep the upcoming buffers cache line - // aligned - //u8 reserved_a[0]; + // aligned, also make reachable with single immediate addition + u8 reserved_a[68 + 9*4 - 9*sizeof(void *)]; + + // space for saving regs on c call to flush_render_block_buffer() and asm + u32 saved_tmp[48 / sizeof(u32)]; + u32 saved_q4_q7[64 / sizeof(u32)]; // 8KB block_struct blocks[MAX_BLOCKS_PER_ROW]; @@ -210,8 +250,17 @@ typedef struct __attribute__((aligned(16))) s16 x; s16 y; + + u32 padding; } vertex_struct; +typedef struct +{ + vertex_struct *vertexes[3]; + s16 offset_x; + s16 offset_y; +} prepared_triangle; + void render_block_fill(psx_gpu_struct *psx_gpu, u32 color, u32 x, u32 y, u32 width, u32 height); void render_block_copy(psx_gpu_struct *psx_gpu, u16 *source, u32 x, u32 y, @@ -222,18 +271,27 @@ void render_block_move(psx_gpu_struct *psx_gpu, u32 source_x, u32 source_y, void render_triangle(psx_gpu_struct *psx_gpu, vertex_struct *vertexes, u32 flags); void render_sprite(psx_gpu_struct *psx_gpu, s32 x, s32 y, u32 u, u32 v, - s32 width, s32 height, u32 flags, u32 color); + s32 *width, s32 *height, u32 flags, u32 color); void render_line(psx_gpu_struct *gpu, vertex_struct *vertexes, u32 flags, - u32 color); + u32 color, int double_resolution); u32 texture_region_mask(s32 x1, s32 y1, s32 x2, s32 y2); +void update_texture_8bpp_cache(psx_gpu_struct *psx_gpu); void flush_render_block_buffer(psx_gpu_struct *psx_gpu); +void setup_blocks_uv_adj_hack(psx_gpu_struct *psx_gpu, block_struct *block, + edge_data_struct *span_edge_data, vec_4x32u *span_uvrg_offset); + void initialize_psx_gpu(psx_gpu_struct *psx_gpu, u16 *vram); -void gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size); +u32 gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size, + s32 *cpu_cycles_sum_out, s32 *cpu_cycles_last, u32 *last_command); void triangle_benchmark(psx_gpu_struct *psx_gpu); -#endif +void compute_all_gradients(psx_gpu_struct * __restrict__ psx_gpu, + const vertex_struct * __restrict__ a, const vertex_struct * __restrict__ b, + const vertex_struct * __restrict__ c); +#endif // __ASSEMBLER__ +#endif // PSX_GPU_H