diff --git a/src/backends/sdl/refresh.c b/src/backends/sdl/refresh.c index bfd5e399..2afe6244 100644 --- a/src/backends/sdl/refresh.c +++ b/src/backends/sdl/refresh.c @@ -43,6 +43,8 @@ #ifdef SDL2 #include +#include + #else // SDL1.2 #include #endif //SDL2 @@ -66,6 +68,7 @@ SDL_Surface* window = NULL; #endif qboolean have_stencil = false; +qboolean vsync_active; #ifdef X11GAMMA XRRCrtcGamma** gammaRamps = NULL; @@ -602,6 +605,7 @@ GLimp_InitGraphics(qboolean fullscreen) /* Set vsync */ SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, gl_swapinterval->value ? 1 : 0); + vsync_active = gl_swapinterval->value ? true : false; #endif while (1) @@ -661,6 +665,7 @@ GLimp_InitGraphics(qboolean fullscreen) /* Set vsync - TODO: -1 could be set for "late swap tearing" */ SDL_GL_SetSwapInterval(gl_swapinterval->value ? 1 : 0); + vsync_active = gl_swapinterval->value ? true : false; #endif /* Initialize the stencil buffer */ @@ -750,6 +755,32 @@ void GLimp_GrabInput(qboolean grab) #endif } +/* + * Returns the VSync state. + */ +qboolean GLimp_VsyncEnabled(void) +{ + return vsync_active; +} + +/* + * Returns the current display refresh rate. + */ +int GLimp_GetRefreshRate(void) +{ + int i; + int refresh = 0; + SDL_DisplayMode mode; + + for (i = 0; i < SDL_GetNumVideoDisplays(); ++i) + { + SDL_GetCurrentDisplayMode(i, &mode); + refresh = refresh < mode.refresh_rate ? mode.refresh_rate : refresh; + } + + return refresh; +} + /* * Shuts the SDL render backend down */ diff --git a/src/client/cl_main.c b/src/client/cl_main.c index 4ac0b941..7465614d 100644 --- a/src/client/cl_main.c +++ b/src/client/cl_main.c @@ -707,9 +707,15 @@ CL_UpdateWindowedMouse(void) } } +qboolean GLimp_VsyncEnabled(void); +int GLimp_GetRefreshRate(void); + void CL_Frame(int msec) { + int nfps; + int rfps; + static int lasttimecalled; static int packetdelta = 1000; @@ -725,6 +731,24 @@ CL_Frame(int msec) return; } + // Target render frame rate + if (GLimp_VsyncEnabled()) + { + rfps = GLimp_GetRefreshRate(); + + if (rfps > gl_maxfps->value) + { + rfps = (int)gl_maxfps->value; + } + } + else + { + rfps = (int)gl_maxfps->value; + } + + // The network framerate must not be higher then the render framerate + nfps = (cl_maxfps->value > rfps) ? rfps : cl_maxfps->value; + // Adjust deltas packetdelta += msec; renderdelta += msec; @@ -764,7 +788,7 @@ CL_Frame(int msec) if (cl_async->value) { // Network frames - if (packetdelta < (1000.0f / cl_maxfps->value)) + if (packetdelta < (1000.0f / nfps)) { packetframe = false; } @@ -774,7 +798,7 @@ CL_Frame(int msec) } // Render frames - if (renderdelta < (1000.0f / gl_maxfps->value)) + if (renderdelta < (1000.0f / rfps)) { renderframe = false; } @@ -788,7 +812,7 @@ CL_Frame(int msec) else { // Cap frames at gl_maxfps - if (renderdelta < (1000.0f / gl_maxfps->value)) + if (renderdelta < (1000.0f / rfps)) { renderframe = false; packetframe = false;