X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fplugin_lib.c;h=58c67d27a850790001fbdbe0a8a329b90d78d10f;hp=5cf1ff4dcba890d53c9b3e415f893352df932089;hb=056d67598872b0bac092878972633d6c10aa0ad6;hpb=3e215238e4b5f93b471679d12cd2144cb49b95b1 diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index 5cf1ff4d..58c67d27 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -34,10 +34,7 @@ int in_type, in_keystate, in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 }; 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; -// P.E.Op.S. -extern int UseFrameSkip; -extern float fps_skip; +static int vsync_usec_time; static int get_cpu_ticks(void) { @@ -121,8 +118,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; } @@ -131,6 +138,15 @@ void pl_fbdev_close(void) omap_enable_layer(0); } +void *pl_prepare_screenshot(int *w, int *h, int *bpp) +{ + *w = pl_fbdev_w; + *h = pl_fbdev_h; + *bpp = pl_fbdev_bpp; + + return pl_fbdev_buf; +} + static void update_input(void) { int actions[IN_BINDTYPE_COUNT] = { 0, }; @@ -151,8 +167,9 @@ static void update_input(void) in_keystate = actions[IN_BINDTYPE_PLAYER12]; #ifdef X11 - extern int x11_update_keys(void); - in_keystate |= x11_update_keys(); + extern int x11_update_keys(unsigned int *action); + in_keystate |= x11_update_keys(&emu_act); + emu_set_action(emu_act); #endif } @@ -175,7 +192,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++; @@ -218,6 +235,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) { @@ -226,16 +248,11 @@ void pl_frame_limit(void) usleep(diff - pl_frame_interval / 2); } - if (UseFrameSkip) { - if (diff < -pl_frame_interval) { - // P.E.Op.S. makes skip decision based on this - fps_skip = 1.0f; - plugin_skip_advice = 1; - } - else if (diff >= 0) { - fps_skip = 100.0f; - plugin_skip_advice = 0; - } + if (pl_rearmed_cbs.frameskip) { + if (diff < -pl_frame_interval) + pl_rearmed_cbs.fskip_advice = 1; + else if (diff >= 0) + pl_rearmed_cbs.fskip_advice = 0; } pcnt_start(PCNT_ALL); @@ -285,13 +302,12 @@ static void pl_get_layer_pos(int *x, int *y, int *w, int *h) *h = g_layer_h; } -const struct rearmed_cbs pl_rearmed_cbs = { +struct rearmed_cbs pl_rearmed_cbs = { pl_get_layer_pos, pl_fbdev_open, pl_fbdev_set_mode, pl_fbdev_flip, pl_fbdev_close, - &plugin_skip_advice, }; /* watchdog */