gpu_neon: rework buffering to reduce flickering
[pcsx_rearmed.git] / plugins / gpu_unai / gpulib_if.cpp
index d665895..02f6b92 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "../gpulib/gpu.h"
+#include "arm_features.h"
 
 #define u8 uint8_t
 #define s8 int8_t
@@ -111,12 +112,10 @@ static u32   GPU_GP1;
 //  GPU Raster Macros
 #define        GPU_RGB16(rgb)        ((((rgb)&0xF80000)>>9)|(((rgb)&0xF800)>>6)|(((rgb)&0xF8)>>3))
 
-#define GPU_EXPANDSIGN_POLY(x)  (((s32)(x)<<20)>>20)
-//#define GPU_EXPANDSIGN_POLY(x)  (((s32)(x)<<21)>>21)
-#define GPU_EXPANDSIGN_SPRT(x)  (((s32)(x)<<21)>>21)
+#define GPU_EXPANDSIGN(x)  (((s32)(x)<<21)>>21)
 
-//#define      GPU_TESTRANGE(x)      { if((u32)(x+1024) > 2047) return; }
-#define        GPU_TESTRANGE(x)      { if ((x<-1023) || (x>1023)) return; }
+#define CHKMAX_X 1024
+#define CHKMAX_Y 512
 
 #define        GPU_SWAP(a,b,t) {(t)=(a);(a)=(b);(b)=(t);}
 
@@ -156,6 +155,18 @@ int renderer_init(void)
        return 0;
 }
 
+void renderer_finish(void)
+{
+}
+
+void renderer_notify_res_change(void)
+{
+}
+
+void renderer_notify_scanout_change(int x, int y)
+{
+}
+
 extern const unsigned char cmd_lengths[256];
 
 int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
@@ -165,8 +176,8 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
   unsigned int *list_end = list + list_len;
 
   linesInterlace = force_interlace;
-#ifndef __ARM_ARCH_7A__ /* XXX */
-  linesInterlace |= gpu.status.interlace;
+#ifdef HAVE_PRE_ARMV7 /* XXX */
+  linesInterlace |= !!(gpu.status & PSX_GPU_STATUS_INTERLACE);
 #endif
 
   for (; list < list_end; list += 1 + len)
@@ -301,7 +312,11 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
           gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
 
           num_vertexes++;
-          if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+          if(list_position >= list_end) {
+            cmd = -1;
+            goto breakloop;
+          }
+          if((*list_position & 0xf000f000) == 0x50005000)
             break;
         }
 
@@ -332,7 +347,11 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
           gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
 
           num_vertexes++;
-          if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+          if(list_position >= list_end) {
+            cmd = -1;
+            goto breakloop;
+          }
+          if((*list_position & 0xf000f000) == 0x50005000)
             break;
         }
 
@@ -419,10 +438,10 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
           gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7)  | PixelMSB]);
         break;
 
+#ifdef TEST
       case 0x80:          //  vid -> vid
         gpuMoveImage();   //  prim handles updateLace && skip
         break;
-#ifdef TEST
       case 0xA0:          //  sys -> vid
       {
         u32 load_width = list[2] & 0xffff;
@@ -435,8 +454,10 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
       case 0xC0:
         break;
 #else
-      case 0xA0:          //  sys ->vid
-      case 0xC0:          //  vid -> sys
+      case 0x80 ... 0x9F:          //  vid -> vid
+      case 0xA0 ... 0xBF:          //  sys -> vid
+      case 0xC0 ... 0xDF:          //  vid -> sys
+        // Handled by gpulib
         goto breakloop;
 #endif
       case 0xE1: {
@@ -476,8 +497,8 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
       }
       case 0xE5: {
         const u32 temp = PacketBuffer.U4[0];
-        DrawingOffset[0] = ((long)temp<<(32-11))>>(32-11);
-        DrawingOffset[1] = ((long)temp<<(32-22))>>(32-11);
+        DrawingOffset[0] = ((s32)temp<<(32-11))>>(32-11);
+        DrawingOffset[1] = ((s32)temp<<(32-22))>>(32-11);
         gpu.ex_regs[5] = temp;
         break;
       }
@@ -505,7 +526,7 @@ void renderer_sync_ecmds(uint32_t *ecmds)
   do_cmd_list(&ecmds[1], 6, &dummy);
 }
 
-void renderer_update_caches(int x, int y, int w, int h)
+void renderer_update_caches(int x, int y, int w, int h, int state_changed)
 {
 }
 
@@ -527,6 +548,8 @@ void renderer_set_config(const struct rearmed_cbs *cbs)
   enableAbbeyHack = cbs->gpu_unai.abe_hack;
   light = !cbs->gpu_unai.no_light;
   blend = !cbs->gpu_unai.no_blend;
+
+  GPU_FrameBuffer = (u16 *)gpu.vram;
 }
 
 #endif