diff --git a/frontend/plugin.c b/frontend/plugin.c index 3683b5002..88d756ebd 100644 --- a/frontend/plugin.c +++ b/frontend/plugin.c @@ -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); diff --git a/frontend/plugin_lib.h b/frontend/plugin_lib.h index 76220978d..2ac49f2ce 100644 --- a/frontend/plugin_lib.h +++ b/frontend/plugin_lib.h @@ -112,6 +112,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; }; diff --git a/libpcsxcore/database.c b/libpcsxcore/database.c index a68fe4f38..2acd67541 100644 --- a/libpcsxcore/database.c +++ b/libpcsxcore/database.c @@ -39,6 +39,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) } @@ -53,7 +61,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 diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h index f978a5836..09fb39a4e 100644 --- a/libpcsxcore/psxcommon.h +++ b/libpcsxcore/psxcommon.h @@ -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; diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c index 832e6d7d3..b8ca1996a 100644 --- a/libpcsxcore/psxhw.c +++ b/libpcsxcore/psxhw.c @@ -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; } diff --git a/plugins/gpulib/gpu.c b/plugins/gpulib/gpu.c index f07677451..2ac36c1b0 100644 --- a/plugins/gpulib/gpu.c +++ b/plugins/gpulib/gpu.c @@ -74,7 +74,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 { @@ -83,7 +86,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: @@ -919,6 +922,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) { diff --git a/plugins/gpulib/gpu.h b/plugins/gpulib/gpu.h index bf3d28a92..ab1d23a7a 100644 --- a/plugins/gpulib/gpu.h +++ b/plugins/gpulib/gpu.h @@ -89,7 +89,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;