From 35f7dd822abbca8227f213a2edf07dce51a888b0 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Sat, 10 Feb 2024 14:26:53 +0700 Subject: [PATCH] don't reset uncapped until new frame (#1455) * skip DRS * set `targetrefresh` after FPS limiter --- src/i_video.c | 13 ++++++++++++- src/i_video.h | 2 +- src/m_menu.c | 6 +++--- src/m_misc.c | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/i_video.c b/src/i_video.c index c9097b31..e75dc64a 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -58,6 +58,7 @@ boolean vga_porch_flash; // emulate VGA "porch" behaviour boolean smooth_scaling; boolean resetneeded; +boolean setrefreshneeded; boolean toggle_fullscreen; boolean toggle_exclusive_fullscreen; @@ -657,6 +658,7 @@ static void I_DrawDiskIcon(), I_RestoreDiskBackground(); static unsigned int disk_to_draw, disk_to_restore; static void CreateUpscaledTexture(boolean force); +static void I_ResetTargetRefresh(void); void I_FinishUpdate(void) { @@ -746,6 +748,12 @@ void I_FinishUpdate(void) { frametime_start = I_GetTimeUS(); } + + if (setrefreshneeded) + { + setrefreshneeded = false; + I_ResetTargetRefresh(); + } } // @@ -1270,8 +1278,10 @@ static void ResetLogicalSize(void) } } -void I_ResetTargetRefresh(void) +static void I_ResetTargetRefresh(void) { + uncapped = default_uncapped; + if (uncapped) { // SDL may report native refresh rate as zero. @@ -1283,6 +1293,7 @@ void I_ResetTargetRefresh(void) } UpdateLimiter(); + drs_skip_frame = true; } // diff --git a/src/i_video.h b/src/i_video.h index 1f489622..d2a482e2 100644 --- a/src/i_video.h +++ b/src/i_video.h @@ -62,7 +62,6 @@ void I_FinishUpdate(void); void I_ReadScreen(byte* dst); void I_ResetScreen(void); // killough 10/98 -void I_ResetTargetRefresh(void); void I_ToggleVsync(void); // [JN] Calls native SDL vsync toggle void I_DynamicResolution(void); @@ -92,6 +91,7 @@ extern int video_display; // display index extern boolean screenvisible; extern boolean window_focused; extern boolean resetneeded; +extern boolean setrefreshneeded; extern boolean smooth_scaling; extern boolean toggle_fullscreen; extern boolean toggle_exclusive_fullscreen; diff --git a/src/m_menu.c b/src/m_menu.c index 5fc1f83f..ed3cec39 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3940,8 +3940,8 @@ static void M_SetMidiPlayer(void) static void M_ToggleUncapped(void) { - DISABLE_ITEM(!uncapped, gen_settings1[gen1_fpslimit]); - I_ResetTargetRefresh(); + DISABLE_ITEM(!default_uncapped, gen_settings1[gen1_fpslimit]); + setrefreshneeded = true; } static void M_ToggleFullScreen(void) @@ -3958,7 +3958,7 @@ static void M_CoerceFPSLimit(void) { if (fpslimit < TICRATE) fpslimit = 0; - I_ResetTargetRefresh(); + setrefreshneeded = true; } static void M_UpdateFOV(void) diff --git a/src/m_misc.c b/src/m_misc.c index 158a38b3..62a451bf 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -192,7 +192,7 @@ default_t defaults[] = { // [FG] uncapped rendering frame rate { "uncapped", - (config_t *) &default_uncapped, (config_t *) &uncapped, + (config_t *) &default_uncapped, NULL, {1}, {0, 1}, number, ss_gen, wad_no, "1 to enable uncapped rendering frame rate" },