void *pl_fbdev_buf;
int pl_frame_interval;
-int in_type, in_keystate, in_a1[2], in_a2[2];
+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;
+static int vsync_usec_time;
// P.E.Op.S.
extern int UseFrameSkip;
extern float fps_skip;
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;
}
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, };
static struct timeval tv_old, tv_expect;
static int vsync_cnt_prev;
struct timeval now;
- int diff;
+ int diff, usadj;
vsync_cnt++;
//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) {
usleep(diff - pl_frame_interval / 2);
}
- plugin_skip_advice = 0;
- if (UseFrameSkip && diff < -pl_frame_interval) {
- // P.E.Op.S. makes skip decision based on this
- fps_skip = 1.0f;
- plugin_skip_advice = 1;
+ 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;
+ }
}
pcnt_start(PCNT_ALL);