diff --git a/src/drawing/IDrawingEngine.h b/src/drawing/IDrawingEngine.h index 537939ae91..90bee4d6a1 100644 --- a/src/drawing/IDrawingEngine.h +++ b/src/drawing/IDrawingEngine.h @@ -41,6 +41,8 @@ interface IDrawingEngine virtual void Resize(uint32 width, uint32 height) abstract; virtual void SetPalette(SDL_Color * colours) abstract; + virtual void SetUncappedFrameRate(bool uncapped) abstract; + virtual void Invalidate(sint32 left, sint32 top, sint32 right, sint32 bottom) abstract; virtual void Draw() abstract; virtual void CopyRect(sint32 x, sint32 y, sint32 width, sint32 height, sint32 dx, sint32 dy) abstract; diff --git a/src/drawing/NewDrawing.cpp b/src/drawing/NewDrawing.cpp index bbfaec4c7c..e8c7c3b7c9 100644 --- a/src/drawing/NewDrawing.cpp +++ b/src/drawing/NewDrawing.cpp @@ -83,6 +83,7 @@ extern "C" try { _drawingEngine->Initialise(gWindow); + _drawingEngine->SetUncappedFrameRate(gConfigGeneral.uncap_fps == 1); } catch (Exception ex) { @@ -164,6 +165,14 @@ extern "C" } } + void drawing_engine_set_fps_uncapped(bool uncapped) + { + if (_drawingEngine != nullptr) + { + _drawingEngine->SetUncappedFrameRate(uncapped); + } + } + void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom) { if (_drawingEngine != nullptr) diff --git a/src/drawing/NewDrawing.h b/src/drawing/NewDrawing.h index a017306082..f484f61b63 100644 --- a/src/drawing/NewDrawing.h +++ b/src/drawing/NewDrawing.h @@ -33,6 +33,7 @@ void drawing_engine_dispose(); rct_drawpixelinfo * drawing_engine_get_dpi(); bool drawing_engine_has_dirty_optimisations(); void drawing_engine_invalidate_image(uint32 image); +void drawing_engine_set_fps_uncapped(bool uncapped); #ifdef __cplusplus } diff --git a/src/drawing/engines/SoftwareDrawingEngine.cpp b/src/drawing/engines/SoftwareDrawingEngine.cpp index b9bfbe3f60..5066d7a2e6 100644 --- a/src/drawing/engines/SoftwareDrawingEngine.cpp +++ b/src/drawing/engines/SoftwareDrawingEngine.cpp @@ -327,6 +327,11 @@ public: } } + void SetUncappedFrameRate(bool uncapped) + { + // Not applicable for this engine + } + void Invalidate(sint32 left, sint32 top, sint32 right, sint32 bottom) override { left = Math::Max(left, 0); diff --git a/src/drawing/engines/opengl/OpenGLDrawingEngine.cpp b/src/drawing/engines/opengl/OpenGLDrawingEngine.cpp index af4f71a8d3..286c8d921f 100644 --- a/src/drawing/engines/opengl/OpenGLDrawingEngine.cpp +++ b/src/drawing/engines/opengl/OpenGLDrawingEngine.cpp @@ -47,6 +47,7 @@ IDrawingEngine * DrawingEngineFactory::CreateOpenGL() #include "../../IDrawingContext.h" #include "../../IDrawingEngine.h" #include "../../Rain.h" +#include "../../../config.h" extern "C" { @@ -317,6 +318,10 @@ public: _drawingContext->ResetPalette(); } + void SetUncappedFrameRate(bool uncapped) { + SDL_GL_SetSwapInterval(uncapped ? 0 : 1); + } + void Invalidate(sint32 left, sint32 top, sint32 right, sint32 bottom) override { } diff --git a/src/windows/options.c b/src/windows/options.c index 58cd9933cc..daaa9d1c00 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -587,6 +587,7 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) switch (widgetIndex) { case WIDX_UNCAP_FPS_CHECKBOX: gConfigGeneral.uncap_fps ^= 1; + drawing_engine_set_fps_uncapped(gConfigGeneral.uncap_fps); config_save_default(); window_invalidate(w); break;