DRS updates

* Introduce drs_skip_frame flag, skip DRS after resolution switch, wipe, save
  game, window event.

* Move V_InitFlexTranTable to R_Init (don't want to skip DRS for it).

* Disable DRS when menu is active.

* Tweak DRS parameters.
This commit is contained in:
Roman Fomin 2024-01-16 19:34:41 +07:00
parent 3afbc9141d
commit e6c8b4d56e
6 changed files with 26 additions and 22 deletions

View File

@ -575,14 +575,6 @@ static void AM_clearLastMark(void)
void AM_enableSmoothLines(void)
{
static boolean precalc_once = true;
if (precalc_once && map_smooth_lines)
{
V_InitFlexTranTable();
precalc_once = false;
}
AM_drawFline = map_smooth_lines ? AM_drawFline_Smooth : AM_drawFline_Vanilla;
}

View File

@ -388,7 +388,7 @@ void D_Display (void)
}
while (!done);
I_ResetTargetRefresh(); // reset after wipe
drs_skip_frame = true; // skip DRS after wipe
}
//

View File

@ -59,6 +59,7 @@
#include "m_snapshot.h"
#include "m_swap.h" // [FG] LONG
#include "i_input.h"
#include "i_video.h"
#include "m_array.h"
#define SAVEGAMESIZE 0x20000
@ -2155,6 +2156,8 @@ static void G_DoSaveGame(void)
if (name) free(name);
M_SetQuickSaveSlot(savegameslot);
drs_skip_frame = true;
}
static void G_DoLoadGame(void)

View File

@ -108,6 +108,8 @@ boolean screenvisible = true;
boolean window_focused = true;
boolean drs_skip_frame;
void *I_GetSDLWindow(void)
{
return screen;
@ -249,6 +251,8 @@ static void HandleWindowEvent(SDL_WindowEvent *event)
default:
break;
}
drs_skip_frame = true;
}
// [FG] fullscreen toggle from Chocolate Doom 3.0
@ -471,7 +475,7 @@ static void UpdateRender(void)
}
}
static uint64_t frametime_withoutpresent;
static uint64_t frametime_start, frametime_withoutpresent;
static int targetrefresh;
static void ResetResolution(int height);
@ -482,13 +486,18 @@ void I_DynamicResolution(void)
static int frame_counter;
static double averagepercent;
if (resolution_mode != RES_DRS || frametime_withoutpresent == 0 ||
// Skip if frame time is too long (e.g. window event).
frametime_withoutpresent > 100000)
if (resolution_mode != RES_DRS || frametime_withoutpresent == 0 || menuactive)
{
return;
}
if (drs_skip_frame)
{
frametime_start = frametime_withoutpresent = 0;
drs_skip_frame = false;
return;
}
// 1.25 milliseconds for SDL render present
double target = (1.0 / targetrefresh) - 0.00125;
double actual = frametime_withoutpresent / 1000000.0;
@ -498,9 +507,8 @@ void I_DynamicResolution(void)
#define DRS_MIN_HEIGHT 400
#define DRS_DELTA 0.1
#define DRS_GREATER (1 + DRS_DELTA)
#define DRS_LESS (1 - DRS_DELTA)
// 50px step to make scaling artefacts less noticeable.
#define DRS_STEP (SCREENHEIGHT / 4)
#define DRS_LESS (1 - DRS_DELTA / 10.0)
#define DRS_STEP (SCREENHEIGHT / 2)
int newheight = 0;
int oldheight = video.height;
@ -513,7 +521,7 @@ void I_DynamicResolution(void)
if (actualpercent > DRS_GREATER)
{
double reduction = (actualpercent - DRS_GREATER ) * 0.2;
double reduction = (actualpercent - DRS_GREATER ) * 0.4;
newheight = (int)MAX(DRS_MIN_HEIGHT, oldheight - oldheight * reduction);
}
else if (averagepercent < DRS_LESS && frame_counter > targetrefresh)
@ -553,8 +561,6 @@ static void CreateUpscaledTexture(boolean force);
void I_FinishUpdate(void)
{
static uint64_t frametime_start;
if (noblit)
{
return;
@ -1090,6 +1096,8 @@ static void ResetResolution(int height)
I_InitDiskFlash();
I_Printf(VB_DEBUG, "ResetResolution: %dx%d", video.width, video.height);
drs_skip_frame = true;
}
static void CreateUpscaledTexture(boolean force)
@ -1206,8 +1214,6 @@ static void ResetLogicalSize(void)
void I_ResetTargetRefresh(void)
{
frametime_withoutpresent = 0; // skip DRS one frame
if (uncapped)
{
targetrefresh = (fpslimit >= TICRATE) ? fpslimit : native_refresh_rate;

View File

@ -69,6 +69,8 @@ void I_ToggleVsync(void); // [JN] Calls native SDL vsync toggle
void I_DynamicResolution(void);
extern boolean drs_skip_frame;
extern char *sdl_renderdriver;
extern boolean use_vsync; // killough 2/8/98: controls whether vsync is called

View File

@ -29,7 +29,7 @@
#include "r_voxel.h"
#include "i_video.h"
#include "v_video.h"
#include "am_map.h"
#include "v_flextran.h"
#include "st_stuff.h"
// killough: viewangleoffset is a legacy from the pre-v1.2 days, when Doom
@ -557,6 +557,7 @@ void R_Init (void)
R_InitLightTables();
R_InitSkyMap();
R_InitTranslationTables();
V_InitFlexTranTable();
// [FG] spectre drawing mode
R_SetFuzzColumnMode();