diff --git a/src/modules/window/Window.h b/src/modules/window/Window.h index 54e5b9244..d988a2ff0 100644 --- a/src/modules/window/Window.h +++ b/src/modules/window/Window.h @@ -203,7 +203,7 @@ struct WindowSettings { bool fullscreen = false; Window::FullscreenType fstype = Window::FULLSCREEN_DESKTOP; - bool vsync = true; + int vsync = 1; int msaa = 0; bool resizable = false; int minwidth = 1; diff --git a/src/modules/window/sdl/Window.cpp b/src/modules/window/sdl/Window.cpp index dca71fd18..ae2fe3fc4 100644 --- a/src/modules/window/sdl/Window.cpp +++ b/src/modules/window/sdl/Window.cpp @@ -483,7 +483,12 @@ bool Window::setWindow(int width, int height, WindowSettings *settings) SDL_RaiseWindow(window); - SDL_GL_SetSwapInterval(f.vsync ? 1 : 0); + SDL_GL_SetSwapInterval(f.vsync); + + // Check if adaptive vsync was requested but not supported, and fall back + // to regular vsync if so. + if (f.vsync == -1 && SDL_GL_GetSwapInterval() != -1) + SDL_GL_SetSwapInterval(1); updateSettings(f); @@ -568,7 +573,7 @@ void Window::updateSettings(const WindowSettings &newsettings) SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &samples); settings.msaa = (buffers > 0 ? samples : 0); - settings.vsync = SDL_GL_GetSwapInterval() != 0; + settings.vsync = SDL_GL_GetSwapInterval(); SDL_DisplayMode dmode = {}; SDL_GetCurrentDisplayMode(settings.display, &dmode); diff --git a/src/modules/window/wrap_Window.cpp b/src/modules/window/wrap_Window.cpp index 1d28ab0a2..ff0534120 100644 --- a/src/modules/window/wrap_Window.cpp +++ b/src/modules/window/wrap_Window.cpp @@ -82,7 +82,6 @@ static int readWindowSettings(lua_State *L, int idx, WindowSettings &settings) lua_pop(L, 1); settings.fullscreen = luax_boolflag(L, idx, settingName(Window::SETTING_FULLSCREEN), settings.fullscreen); - settings.vsync = luax_boolflag(L, idx, settingName(Window::SETTING_VSYNC), settings.vsync); settings.msaa = luax_intflag(L, idx, settingName(Window::SETTING_MSAA), settings.msaa); settings.resizable = luax_boolflag(L, idx, settingName(Window::SETTING_RESIZABLE), settings.resizable); settings.minwidth = luax_intflag(L, idx, settingName(Window::SETTING_MIN_WIDTH), settings.minwidth); @@ -92,6 +91,13 @@ static int readWindowSettings(lua_State *L, int idx, WindowSettings &settings) settings.display = luax_intflag(L, idx, settingName(Window::SETTING_DISPLAY), settings.display+1) - 1; settings.highdpi = luax_boolflag(L, idx, settingName(Window::SETTING_HIGHDPI), settings.highdpi); + lua_getfield(L, idx, settingName(Window::SETTING_VSYNC)); + if (lua_isnumber(L, -1)) + settings.vsync = (int) lua_tointeger(L, -1); + else if (lua_isboolean(L, -1)) + settings.vsync = lua_toboolean(L, -1); + lua_pop(L, 1); + lua_getfield(L, idx, settingName(Window::SETTING_X)); lua_getfield(L, idx, settingName(Window::SETTING_Y)); settings.useposition = !(lua_isnoneornil(L, -2) && lua_isnoneornil(L, -1)); @@ -122,7 +128,7 @@ int w_setMode(lua_State *L) // Defaults settings.fstype = Window::FULLSCREEN_DESKTOP; settings.fullscreen = false; - settings.vsync = true; + settings.vsync = 1; settings.msaa = 0; settings.resizable = false; settings.minwidth = 1; @@ -186,7 +192,7 @@ int w_getMode(lua_State *L) luax_pushboolean(L, settings.fullscreen); lua_setfield(L, -2, settingName(Window::SETTING_FULLSCREEN)); - luax_pushboolean(L, settings.vsync); + lua_pushinteger(L, settings.vsync); lua_setfield(L, -2, settingName(Window::SETTING_VSYNC)); lua_pushinteger(L, settings.msaa);