gpulib: trust game's centering based on a database
authornotaz <notasas@gmail.com>
Tue, 24 Oct 2023 22:36:42 +0000 (01:36 +0300)
committernotaz <notasas@gmail.com>
Tue, 24 Oct 2023 23:03:43 +0000 (02:03 +0300)
libretro/pcsx_rearmed#160

frontend/plugin.c
frontend/plugin_lib.h
libpcsxcore/database.c
libpcsxcore/psxcommon.h
libpcsxcore/psxhw.c
plugins/gpulib/gpu.c
plugins/gpulib/gpu.h

index 3683b50..88d756e 100644 (file)
@@ -264,6 +264,9 @@ void plugin_call_rearmed_cbs(void)
        extern void *hGPUDriver;
        void (*rearmed_set_cbs)(const struct rearmed_cbs *cbs);
 
+       pl_rearmed_cbs.screen_centering_type_default =
+               Config.hacks.gpu_centering ? C_INGAME : C_AUTO;
+
        rearmed_set_cbs = SysLoadSym(hGPUDriver, "GPUrearmedCallbacks");
        if (rearmed_set_cbs != NULL)
                rearmed_set_cbs(&pl_rearmed_cbs);
index bafcb6c..67313bd 100644 (file)
@@ -115,6 +115,7 @@ struct rearmed_cbs {
        // misc
        int gpu_caps;
        int screen_centering_type;
+       int screen_centering_type_default;
        int screen_centering_x;
        int screen_centering_y;
 };
index 4c98670..5cdd78b 100644 (file)
@@ -45,6 +45,14 @@ static const char * const gpu_busy_hack_db[] =
        "SLPS01919", "SLPS01920",
 };
 
+static const char * const gpu_centering_hack_db[] =
+{
+       /* Gradius Gaiden */
+       "SLPM86042", "SLPM86103", "SLPM87323",
+       /* Sexy Parodius */
+       "SLPM86009",
+};
+
 #define HACK_ENTRY(var, list) \
        { #var, &Config.hacks.var, list, ARRAY_SIZE(list) }
 
@@ -59,7 +67,8 @@ hack_db[] =
 {
        HACK_ENTRY(cdr_read_timing, cdr_read_hack_db),
        HACK_ENTRY(gpu_slow_list_walking, gpu_slow_llist_db),
-       HACK_ENTRY(gpu_busy_hack, gpu_busy_hack_db),
+       HACK_ENTRY(gpu_busy, gpu_busy_hack_db),
+       HACK_ENTRY(gpu_centering, gpu_centering_hack_db),
 };
 
 static const struct
index f978a58..09fb39a 100644 (file)
@@ -150,7 +150,8 @@ typedef struct {
        struct {
                boolean cdr_read_timing;
                boolean gpu_slow_list_walking;
-               boolean gpu_busy_hack;
+               boolean gpu_busy;
+               boolean gpu_centering;
        } hacks;
 } PcsxConfig;
 
index 832e6d7..b8ca199 100644 (file)
@@ -42,7 +42,7 @@ void psxHwReset() {
        cdrReset();
        psxRcntInit();
        HW_GPU_STATUS = SWAP32(0x10802000);
-       psxHwReadGpuSRptr = Config.hacks.gpu_busy_hack
+       psxHwReadGpuSRptr = Config.hacks.gpu_busy
                ? psxHwReadGpuSRbusyHack : psxHwReadGpuSR;
 }
 
index 22571fa..6595806 100644 (file)
@@ -78,7 +78,10 @@ static noinline void update_width(void)
   int hres = hres_all[(gpu.status >> 16) & 7];
   int pal = gpu.status & PSX_GPU_STATUS_PAL;
   int sw = gpu.screen.x2 - gpu.screen.x1;
+  int type = gpu.state.screen_centering_type;
   int x = 0, x_auto;
+  if (type == C_AUTO)
+    type = gpu.state.screen_centering_type_default;
   if (sw <= 0)
     /* nothing displayed? */;
   else {
@@ -87,7 +90,7 @@ static noinline void update_width(void)
     x = (x + 1) & ~1;   // blitter limitation
     sw /= hdiv;
     sw = (sw + 2) & ~3; // according to nocash
-    switch (gpu.state.screen_centering_type) {
+    switch (type) {
     case C_INGAME:
       break;
     case C_MANUAL:
@@ -968,6 +971,7 @@ void GPUrearmedCallbacks(const struct rearmed_cbs *cbs)
   gpu.state.frame_count = cbs->gpu_frame_count;
   gpu.state.allow_interlace = cbs->gpu_neon.allow_interlace;
   gpu.state.enhancement_enable = cbs->gpu_neon.enhancement_enable;
+  gpu.state.screen_centering_type_default = cbs->screen_centering_type_default;
   if (gpu.state.screen_centering_type != cbs->screen_centering_type
       || gpu.state.screen_centering_x != cbs->screen_centering_x
       || gpu.state.screen_centering_y != cbs->screen_centering_y) {
index 82fbe94..553afbd 100644 (file)
@@ -91,7 +91,8 @@ struct psx_gpu {
     } last_list;
     uint32_t last_vram_read_frame;
     uint32_t w_out_old, h_out_old, status_vo_old;
-    int screen_centering_type; // 0 - auto, 1 - game conrolled, 2 - manual
+    short screen_centering_type;
+    short screen_centering_type_default;
     int screen_centering_x;
     int screen_centering_y;
   } state;