gpu_neon: fix sign extension
[pcsx_rearmed.git] / plugins / gpu_neon / psx_gpu / psx_gpu_parse.c
index 44fce93..53f33e4 100644 (file)
@@ -200,21 +200,14 @@ static void do_fill(psx_gpu_struct *psx_gpu, u32 x, u32 y,
   }
 }
 
-#define sign_extend_12bit(value)                                               \
-  (((s32)((value) << 20)) >> 20)                                               \
-
 #define sign_extend_11bit(value)                                               \
   (((s32)((value) << 21)) >> 21)                                               \
 
-#define sign_extend_10bit(value)                                               \
-  (((s32)((value) << 22)) >> 22)                                               \
-
-
 #define get_vertex_data_xy(vertex_number, offset16)                            \
   vertexes[vertex_number].x =                                                  \
-   sign_extend_12bit(list_s16[offset16]) + psx_gpu->offset_x;                  \
+   sign_extend_11bit(list_s16[offset16]) + psx_gpu->offset_x;                  \
   vertexes[vertex_number].y =                                                  \
-   sign_extend_12bit(list_s16[(offset16) + 1]) + psx_gpu->offset_y;            \
+   sign_extend_11bit(list_s16[(offset16) + 1]) + psx_gpu->offset_y;            \
 
 #define get_vertex_data_uv(vertex_number, offset16)                            \
   vertexes[vertex_number].u = list_s16[offset16] & 0xFF;                       \
@@ -1018,8 +1011,6 @@ void scale2x_tiles8(void *dst, const void *src, int w8, int h)
 }
 #endif
 
-static int disable_main_render;
-
 // simple check for a case where no clipping is used
 //  - now handled by adjusting the viewport
 static int check_enhanced_range(psx_gpu_struct *psx_gpu, int x, int y)
@@ -1065,6 +1056,7 @@ static void patch_v(vertex_struct *vertex_ptrs, int count, int old, int new)
       vertex_ptrs[i].v = new;
 }
 
+// this sometimes does more harm than good, like in PE2
 static void uv_hack(vertex_struct *vertex_ptrs, int vertex_count)
 {
   int i, u[4], v[4];
@@ -1103,7 +1095,7 @@ static void do_triangle_enhanced(psx_gpu_struct *psx_gpu,
   if (!prepare_triangle(psx_gpu, vertexes, vertex_ptrs))
     return;
 
-  if (!disable_main_render)
+  if (!psx_gpu->hack_disable_main)
     render_triangle_p(psx_gpu, vertex_ptrs, current_command);
 
   if (!check_enhanced_range(psx_gpu, vertex_ptrs[0]->x, vertex_ptrs[2]->x))
@@ -1322,7 +1314,8 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size,
         get_vertex_data_xy_uv(2, 10);  
         get_vertex_data_xy_uv(3, 14);
   
-        uv_hack(vertexes, 4);
+        if (psx_gpu->hack_texture_adj)
+          uv_hack(vertexes, 4);
         do_quad_enhanced(psx_gpu, vertexes, current_command);
         gput_sum(cpu_cycles_sum, cpu_cycles, gput_quad_base_t());
         break;
@@ -1375,7 +1368,8 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size,
         get_vertex_data_xy_uv_rgb(2, 12);
         get_vertex_data_xy_uv_rgb(3, 18);
 
-        uv_hack(vertexes, 4);
+        if (psx_gpu->hack_texture_adj)
+          uv_hack(vertexes, 4);
         do_quad_enhanced(psx_gpu, vertexes, current_command);
         gput_sum(cpu_cycles_sum, cpu_cycles, gput_quad_base_gt());
         break;
@@ -1745,10 +1739,8 @@ u32 gpu_parse_enhanced(psx_gpu_struct *psx_gpu, u32 *list, u32 size,
   
       case 0xE5:
       {
-        s32 offset_x = list[0] << 21;
-        s32 offset_y = list[0] << 10;
-        psx_gpu->offset_x = offset_x >> 21;
-        psx_gpu->offset_y = offset_y >> 21; 
+        psx_gpu->offset_x = sign_extend_11bit(list[0]);
+        psx_gpu->offset_y = sign_extend_11bit(list[0] >> 11);
   
         SET_Ex(5, list[0]);
         break;