Skip to content

Commit

Permalink
gpulib: trust game's centering based on a database
Browse files Browse the repository at this point in the history
  • Loading branch information
notaz committed Oct 24, 2023
1 parent 8f8ade9 commit b3ff74b
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 5 deletions.
3 changes: 3 additions & 0 deletions frontend/plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions frontend/plugin_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
11 changes: 10 additions & 1 deletion libpcsxcore/database.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) }

Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion libpcsxcore/psxcommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion libpcsxcore/psxhw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
6 changes: 5 additions & 1 deletion plugins/gpulib/gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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:
Expand Down Expand Up @@ -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) {
Expand Down
3 changes: 2 additions & 1 deletion plugins/gpulib/gpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit b3ff74b

Please sign in to comment.