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);
// misc
int gpu_caps;
int screen_centering_type;
+ int screen_centering_type_default;
int screen_centering_x;
int screen_centering_y;
};
"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) }
{
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
struct {
boolean cdr_read_timing;
boolean gpu_slow_list_walking;
- boolean gpu_busy_hack;
+ boolean gpu_busy;
+ boolean gpu_centering;
} hacks;
} PcsxConfig;
cdrReset();
psxRcntInit();
HW_GPU_STATUS = SWAP32(0x10802000);
- psxHwReadGpuSRptr = Config.hacks.gpu_busy_hack
+ psxHwReadGpuSRptr = Config.hacks.gpu_busy
? psxHwReadGpuSRbusyHack : psxHwReadGpuSR;
}
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 {
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:
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) {
} 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;