From: notaz Date: Wed, 5 Oct 2011 20:32:35 +0000 (+0300) Subject: recompilation-caused frameskip workaround X-Git-Tag: r10~13 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=commitdiff_plain;h=2f546f9ace7c7e4b0957aff512dc0616b01b3976 recompilation-caused frameskip workaround --- diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index c719f48e..084ff1e2 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -264,7 +264,7 @@ void pl_update_gun(int *xn, int *xres, int *y, int *in) void pl_frame_limit(void) { static struct timeval tv_old, tv_expect; - static int vsync_cnt_prev; + static int vsync_cnt_prev, drc_active_vsyncs; struct timeval now; int diff, usadj; @@ -333,6 +333,17 @@ void pl_frame_limit(void) 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; } pcnt_start(PCNT_ALL); diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index 02433f10..56c6b77a 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -300,6 +300,7 @@ unsigned short hword; unsigned char byte; int pending_exception, stop; unsigned int next_interupt; +int new_dynarec_did_compile; void *psxH_ptr; void new_dynarec_init() {} void new_dyna_start() {} diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c index 01287582..a2635648 100644 --- a/libpcsxcore/new_dynarec/new_dynarec.c +++ b/libpcsxcore/new_dynarec/new_dynarec.c @@ -136,6 +136,7 @@ struct ll_entry static const u_int using_tlb=0; #endif static u_int sp_in_mirror; + int new_dynarec_did_compile; u_int stop_after_jal; extern u_char restore_candidate[512]; extern int cycle_count; @@ -8011,6 +8012,7 @@ int new_recompile_block(int addr) //rlist(); start = (u_int)addr&~3; //assert(((u_int)addr&1)==0); + new_dynarec_did_compile=1; #ifdef PCSX if(!sp_in_mirror&&(signed int)(psxRegs.GPR.n.sp&0xffe00000)>0x80200000&& 0x10000<=psxRegs.GPR.n.sp&&(psxRegs.GPR.n.sp&~0xe0e00000)