From: Toni Wilen Date: Wed, 11 Jan 2023 18:13:17 +0000 (+0200) Subject: Do not render or record first frame. Frame is rendered when vsync starts, not when... X-Git-Tag: 41010~15 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=f5bc9ab5346b20b654b4c091c938090083ff4478;p=francis%2Fwinuae.git Do not render or record first frame. Frame is rendered when vsync starts, not when vblank starts. --- diff --git a/custom.cpp b/custom.cpp index 571f3bbd..8496531c 100644 --- a/custom.cpp +++ b/custom.cpp @@ -152,6 +152,7 @@ static int nosignal_cnt, nosignal_status; static bool nosignal_trigger; int display_reset; static evt_t line_start_cycles; +static bool initial_frame; #define LOF_TOGGLES_NEEDED 3 //#define NLACE_CNT_NEEDED 50 @@ -11174,7 +11175,8 @@ static void vsync_handler_render(void) if (!vsync_rendered) { frame_time_t start, end; start = read_processor_time(); - vsync_handle_redraw(lof_store, lof_changed, bplcon0, bplcon3, isvsync_chipset() >= 0); + vsync_handle_redraw(lof_store, lof_changed, bplcon0, bplcon3, isvsync_chipset() >= 0, initial_frame); + initial_frame = false; vsync_rendered = true; end = read_processor_time(); frameskiptime += end - start; @@ -13315,6 +13317,7 @@ void custom_reset(bool hardreset, bool keyboardreset) { if (hardreset) { board_prefs_changed(-1, -1); + initial_frame = true; } target_reset(); diff --git a/drawing.cpp b/drawing.cpp index 8e338a21..522a7d8f 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -4930,7 +4930,7 @@ bool vsync_handle_check (void) return changed != 0; } -void vsync_handle_redraw(int long_field, int lof_changed, uae_u16 bplcon0p, uae_u16 bplcon3p, bool drawlines) +void vsync_handle_redraw(int long_field, int lof_changed, uae_u16 bplcon0p, uae_u16 bplcon3p, bool drawlines, bool initial) { int monid = 0; struct amigadisplay *ad = &adisplays[monid]; @@ -4938,13 +4938,16 @@ void vsync_handle_redraw(int long_field, int lof_changed, uae_u16 bplcon0p, uae_ if (lof_changed || interlace_seen <= 0 || (currprefs.gfx_iscanlines && interlace_seen > 0) || last_redraw_point >= 2 || long_field || doublescan < 0) { last_redraw_point = 0; - if (ad->framecnt == 0) { - finish_drawing_frame(drawlines); + if (!initial) { + if (ad->framecnt == 0) { + finish_drawing_frame(drawlines); #ifdef AVIOUTPUT - if (!ad->picasso_on) { - frame_drawn(monid); - } + if (!ad->picasso_on) { + frame_drawn(monid); + } #endif + } + count_frame(monid); } #if 0 if (interlace_seen > 0) { @@ -4972,7 +4975,6 @@ void vsync_handle_redraw(int long_field, int lof_changed, uae_u16 bplcon0p, uae_ return; } - count_frame(monid); if (ad->framecnt == 0) { init_drawing_frame(); diff --git a/include/drawing.h b/include/drawing.h index 4cbc83ca..04895b99 100644 --- a/include/drawing.h +++ b/include/drawing.h @@ -357,7 +357,7 @@ enum nln_how { }; extern void hsync_record_line_state (int lineno, enum nln_how, int changed); -extern void vsync_handle_redraw (int long_field, int lof_changed, uae_u16, uae_u16, bool drawlines); +extern void vsync_handle_redraw (int long_field, int lof_changed, uae_u16, uae_u16, bool drawlines, bool initial); extern bool vsync_handle_check (void); extern void draw_lines(int end, int section); extern void init_hardware_for_drawing_frame (void); diff --git a/newcpu.cpp b/newcpu.cpp index 6868ba8c..b4251711 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -6440,15 +6440,19 @@ void m68k_go (int may_quit) quit_program = 0; #ifdef SAVESTATE - if (savestate_state == STATE_DORESTORE) + if (savestate_state == STATE_DORESTORE) { savestate_state = STATE_RESTORE; - if (savestate_state == STATE_RESTORE) + } + if (savestate_state == STATE_RESTORE) { restore_state (savestate_fname); - else if (savestate_state == STATE_REWIND) + cpu_hardreset = 1; + } else if (savestate_state == STATE_REWIND) { savestate_rewind (); + } #endif - if (cpu_hardreset) + if (cpu_hardreset) { m68k_reset_restore(); + } prefs_changed_cpu(); build_cpufunctbl(); set_x_funcs();