gpu_neon: some hack to enhanced mode
[pcsx_rearmed.git] / plugins / gpu_neon / psx_gpu / psx_gpu.h
index 1eaa99a..4eb622d 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,
@@ -67,7 +77,7 @@ typedef struct
   u16 y;
 } edge_data_struct;
 
-// 64 bytes total
+// 64 (72) bytes total
 typedef struct
 {
   // 16 bytes
@@ -91,7 +101,7 @@ typedef struct
     vec_8x16u pixels;
   };
 
-  // 8 bytes
+  // 8 (16) bytes
   u32 draw_mask_bits;
   u16 *fb_ptr;
 
@@ -99,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
@@ -183,18 +187,22 @@ typedef struct
   u32 *reciprocal_table_ptr;
 
   // enhancement stuff
-  u16 *enhancement_buf_ptr;
-  u16 *enhancement_current_buf_ptr;
-  u32 enhancement_x_threshold;
+  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;
-  u8 enhancement_buf_by_x16[64];
+  u8  enhancement_buf_by_x16[64];    // 0-3 specifying which buf
+  u16 enhancement_buf_start[4];      // x pos where buf[n] begins
+
+  u16 enhancement_scanout_x[4];
+  u16 enhancement_scanout_select;
 
   // Align up to 64 byte boundary to keep the upcoming buffers cache line
   // aligned, also make reachable with single immediate addition
-  u8 reserved_a[160];
+  u8 reserved_a[142];
 
   // 8KB
   block_struct blocks[MAX_BLOCKS_PER_ROW];
@@ -222,6 +230,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,
@@ -240,6 +250,7 @@ void render_line(psx_gpu_struct *gpu, vertex_struct *vertexes, u32 flags,
 
 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);
@@ -247,5 +258,9 @@ u32 gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size, 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