notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dfxvideo: decouple from main emu
[pcsx_rearmed.git]
/
frontend
/
plugin_lib.c
diff --git
a/frontend/plugin_lib.c
b/frontend/plugin_lib.c
index
46c9cbd
..
58c67d2
100644
(file)
--- 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 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)
{
static int get_cpu_ticks(void)
{
@@
-121,8
+118,18
@@
void *pl_fbdev_flip(void)
int pl_fbdev_open(void)
{
int pl_fbdev_open(void)
{
+ struct timeval now;
+
pl_fbdev_buf = vout_fbdev_flip(layer_fb);
omap_enable_layer(1);
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;
}
return 0;
}
@@
-160,8
+167,9
@@
static void update_input(void)
in_keystate = actions[IN_BINDTYPE_PLAYER12];
#ifdef X11
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
}
#endif
}
@@
-184,7
+192,7
@@
void pl_frame_limit(void)
static struct timeval tv_old, tv_expect;
static int vsync_cnt_prev;
struct timeval now;
static struct timeval tv_old, tv_expect;
static int vsync_cnt_prev;
struct timeval now;
- int diff;
+ int diff
, usadj
;
vsync_cnt++;
vsync_cnt++;
@@
-227,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;
//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) {
}
if (!(g_opts & OPT_NO_FRAMELIM) && diff > pl_frame_interval) {
@@
-235,16
+248,11
@@
void pl_frame_limit(void)
usleep(diff - pl_frame_interval / 2);
}
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);
}
pcnt_start(PCNT_ALL);
@@
-294,13
+302,12
@@
static void pl_get_layer_pos(int *x, int *y, int *w, int *h)
*h = g_layer_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,
pl_get_layer_pos,
pl_fbdev_open,
pl_fbdev_set_mode,
pl_fbdev_flip,
pl_fbdev_close,
- &plugin_skip_advice,
};
/* watchdog */
};
/* watchdog */