+ // tv_expect uses usec*1024 units instead of usecs for better accuracy
+ tv_expect.tv_usec += frame_interval1024;
+ if (tv_expect.tv_usec >= (1000000 << 10)) {
+ tv_expect.tv_usec -= (1000000 << 10);
+ tv_expect.tv_sec++;
+ }
+ diff = (tv_expect.tv_sec - now.tv_sec) * 1000000 + (tv_expect.tv_usec >> 10) - now.tv_usec;
+
+ if (diff > MAX_LAG_FRAMES * frame_interval || diff < -MAX_LAG_FRAMES * frame_interval) {
+ //printf("pl_frame_limit reset, diff=%d, iv %d\n", diff, frame_interval);
+ tv_expect = now;
+ diff = 0;
+ // try to align with vsync
+ usadj = vsync_usec_time;
+ while (usadj < tv_expect.tv_usec - frame_interval)
+ usadj += frame_interval;
+ tv_expect.tv_usec = usadj << 10;
+ }
+
+ if (!(g_opts & OPT_NO_FRAMELIM) && diff > frame_interval) {
+ // yay for working usleep on pandora!
+ //printf("usleep %d\n", diff - frame_interval / 2);
+ usleep(diff - frame_interval);
+ }
+
+ if (pl_rearmed_cbs.frameskip) {
+ if (diff < -frame_interval)
+ pl_rearmed_cbs.fskip_advice = 1;
+ else if (diff >= 0)
+ pl_rearmed_cbs.fskip_advice = 0;
+
+ // recompilation is not that fast and may cause frame skip on
+ // loading screens and such, resulting in flicker or glitches
+ if (new_dynarec_did_compile) {
+ if (drc_active_vsyncs < 32)
+ pl_rearmed_cbs.fskip_advice = 0;
+ drc_active_vsyncs++;
+ }
+ else
+ drc_active_vsyncs = 0;
+ new_dynarec_did_compile = 0;
+ }