psx_gpu: do enhanced lines
[pcsx_rearmed.git] / plugins / gpu_neon / psx_gpu / psx_gpu.h
index 15d9469..f8547f3 100644 (file)
@@ -53,6 +53,12 @@ typedef enum
   RENDER_STATE_MASK_EVALUATE   = 0x20,
 } render_state_enum;
 
+typedef enum
+{
+  RENDER_INTERLACE_ENABLED     = 0x1,
+  RENDER_INTERLACE_ODD         = 0x2,
+} render_mode_enum;
+
 typedef struct
 {
   u16 left_x;
@@ -116,7 +122,6 @@ typedef struct
   vec_4x32u g_block_span;
   vec_4x32u b_block_span;
 
-  // 72 bytes
   u32 b;
   u32 b_dy;
 
@@ -130,28 +135,23 @@ typedef struct
   u32 dirty_textures_8bpp_alternate_mask;
 
   u32 triangle_color;
-  u32 primitive_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 *clut_ptr;
   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;
@@ -159,7 +159,6 @@ typedef struct
 
   u16 mask_msb;
 
-  // 8 bytes
   u8 triangle_winding;
 
   u8 display_area_draw_enable;
@@ -173,10 +172,26 @@ typedef struct
   u8 texture_window_y;
 
   u8 primitive_type;
+  u8 render_mode;
+
+  s16 offset_x;
+  s16 offset_y;
+
+  u16 clut_settings;
+  u16 texture_settings;
+
+  // enhancement stuff
+  u16 *enhancement_buf_ptr;
+  u16 *enhancement_current_buf_ptr;
+  u32 enhancement_x_threshold;
+  s16 saved_viewport_start_x;
+  s16 saved_viewport_start_y;
+  s16 saved_viewport_end_x;
+  s16 saved_viewport_end_y;
 
   // Align up to 64 byte boundary to keep the upcoming buffers cache line
-  // aligned
-  u8 reserved_a[1];
+  // aligned, also make reachable with single immediate addition
+  u8 reserved_a[228];
 
   // 8KB
   block_struct blocks[MAX_BLOCKS_PER_ROW];
@@ -186,17 +201,9 @@ typedef struct
   edge_data_struct span_edge_data[MAX_SPANS];
   u32 span_b_offset[MAX_SPANS];
 
-  u16 _vram[1024 * 512];
   u8 texture_4bpp_cache[32][256 * 256];
   u8 texture_8bpp_even_cache[16][256 * 256];
   u8 texture_8bpp_odd_cache[16][256 * 256];
-
-  u32 pixel_count_mode;
-  u32 pixel_compare_mode;
-
-  u8 *vram_pixel_counts_a;
-  u8 *vram_pixel_counts_b;
-  u16 *compare_vram;
 } psx_gpu_struct;
 
 typedef struct __attribute__((aligned(16)))
@@ -226,14 +233,14 @@ void render_triangle(psx_gpu_struct *psx_gpu, vertex_struct *vertexes,
 void render_sprite(psx_gpu_struct *psx_gpu, s32 x, s32 y, u32 u, u32 v,
  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 flush_render_block_buffer(psx_gpu_struct *psx_gpu);
 
-void initialize_psx_gpu(psx_gpu_struct *psx_gpu);
-void gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size);
+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);
 
 void triangle_benchmark(psx_gpu_struct *psx_gpu);