From cefe86b749ed699cd8af96e4875bb4e90e967569 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 21 Mar 2011 22:52:38 +0200 Subject: try to align timing with LCD refresh --- frontend/menu.c | 19 +++++++++++++++++-- frontend/plugin_lib.c | 18 +++++++++++++++++- libpcsxcore/psxcommon.c | 2 +- libpcsxcore/psxcounters.c | 2 +- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/frontend/menu.c b/frontend/menu.c index 546125f..da1caea 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -567,6 +567,20 @@ static void apply_filter(int which) old = which; } +static void apply_lcdrate(int pal) +{ + static int old = -1; + char buf[128]; + + if (pal == old) + return; + + snprintf(buf, sizeof(buf), "%s/op_lcdrate.sh %d", + pnd_script_base, pal ? 50 : 60); + system(buf); + old = pal; +} + static menu_entry e_menu_gfx_options[]; static void pnd_menu_init(void) @@ -1739,8 +1753,6 @@ void menu_prepare_emu(void) case SCALE_CUSTOM: break; } - apply_filter(filter); - apply_cpu_clock(); psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec; if (psxCpu != prev_cpu) @@ -1753,6 +1765,9 @@ void menu_prepare_emu(void) CDR_stop(); menu_sync_config(); + apply_lcdrate(Config.PsxType); + apply_filter(filter); + apply_cpu_clock(); if (GPU_open != NULL) { int ret = GPU_open(&gpuDisp, "PCSX", NULL); diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index 46c9cbd..c2fa100 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -35,6 +35,7 @@ static int pl_fbdev_w, pl_fbdev_h, pl_fbdev_bpp; static int flip_cnt, vsync_cnt, flips_per_sec, tick_per_sec; static float vsps_cur; static int plugin_skip_advice; +static int vsync_usec_time; // P.E.Op.S. extern int UseFrameSkip; extern float fps_skip; @@ -121,8 +122,18 @@ void *pl_fbdev_flip(void) int pl_fbdev_open(void) { + struct timeval now; + pl_fbdev_buf = vout_fbdev_flip(layer_fb); omap_enable_layer(1); + + // try to align redraws to vsync + vout_fbdev_wait_vsync(layer_fb); + gettimeofday(&now, 0); + vsync_usec_time = now.tv_usec; + while (vsync_usec_time >= pl_frame_interval) + vsync_usec_time -= pl_frame_interval; + return 0; } @@ -184,7 +195,7 @@ void pl_frame_limit(void) static struct timeval tv_old, tv_expect; static int vsync_cnt_prev; struct timeval now; - int diff; + int diff, usadj; vsync_cnt++; @@ -227,6 +238,11 @@ void pl_frame_limit(void) //printf("pl_frame_limit reset, diff=%d, iv %d\n", diff, pl_frame_interval); tv_expect = now; diff = 0; + // try to align with vsync + usadj = vsync_usec_time; + while (usadj < tv_expect.tv_usec - pl_frame_interval) + usadj += pl_frame_interval; + tv_expect.tv_usec = usadj; } if (!(g_opts & OPT_NO_FRAMELIM) && diff > pl_frame_interval) { diff --git a/libpcsxcore/psxcommon.c b/libpcsxcore/psxcommon.c index 5e9dcaf..ea655df 100644 --- a/libpcsxcore/psxcommon.c +++ b/libpcsxcore/psxcommon.c @@ -56,8 +56,8 @@ void EmuUpdate() { if (!Config.HLE || !hleSoftCall) SysUpdate(); - pl_frame_limit(); ApplyCheats(); + pl_frame_limit(); } void __Log(char *fmt, ...) { diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c index c9f2931..044d0d3 100644 --- a/libpcsxcore/psxcounters.c +++ b/libpcsxcore/psxcounters.c @@ -300,8 +300,8 @@ void psxRcntUpdate() GPU_vBlank( 0 ); setIrq( 0x01 ); - GPU_updateLace(); EmuUpdate(); + GPU_updateLace(); } } -- cgit v1.2.3