cdrom: change pause timing again
[pcsx_rearmed.git] / plugins / gpu_neon / psx_gpu / psx_gpu.h
index 71b99cd..2539521 100644 (file)
 #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
+
+#ifndef __ASSEMBLER__
+
+#include "vector_types.h"
+
 typedef enum
 {
   PRIMITIVE_TYPE_TRIANGLE = 0,
@@ -57,7 +67,6 @@ typedef enum
 {
   RENDER_INTERLACE_ENABLED     = 0x1,
   RENDER_INTERLACE_ODD         = 0x2,
-  RENDER_DOUBLE_MODE           = 0x4,
 } render_mode_enum;
 
 typedef struct
@@ -68,7 +77,7 @@ typedef struct
   u16 y;
 } edge_data_struct;
 
-// 64 bytes total
+// 64 (72) bytes total
 typedef struct
 {
   // 16 bytes
@@ -92,7 +101,7 @@ typedef struct
     vec_8x16u pixels;
   };
 
-  // 8 bytes
+  // 8 (16) bytes
   u32 draw_mask_bits;
   u16 *fb_ptr;
 
@@ -100,12 +109,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
@@ -123,7 +126,6 @@ typedef struct
   vec_4x32u g_block_span;
   vec_4x32u b_block_span;
 
-  // 76 bytes
   u32 b;
   u32 b_dy;
 
@@ -146,19 +148,14 @@ typedef struct
   u16 *vram_ptr;
   u16 *vram_out_ptr;
 
-  // 26 bytes
+  u32 uvrgb_phase;
+
   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 +163,6 @@ typedef struct
 
   u16 mask_msb;
 
-  // 8 bytes
   u8 triangle_winding;
 
   u8 display_area_draw_enable;
@@ -182,16 +178,34 @@ typedef struct
   u8 primitive_type;
   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;
+  u16 *enhancement_buf_ptr;          // main alloc
+  u16 *enhancement_current_buf_ptr;  // offset into above, 4 bufs
+  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 hack_disable_main:1;
+  u32 hack_texture_adj:1;
 
   // 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[184 + 9*4 - 9*sizeof(void *)];
 
   // 8KB
   block_struct blocks[MAX_BLOCKS_PER_ROW];
@@ -219,6 +233,8 @@ typedef struct __attribute__((aligned(16)))
 
   s16 x;
   s16 y;
+
+  u32 padding;
 } vertex_struct;
 
 void render_block_fill(psx_gpu_struct *psx_gpu, u32 color, u32 x, u32 y,
@@ -231,18 +247,24 @@ 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 initialize_psx_gpu(psx_gpu_struct *psx_gpu, u16 *vram);
-u32 gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size, u32 *last_command);
+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