diff --git a/CMakeLists.txt b/CMakeLists.txt index b23a1835a..92fb211da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1741,6 +1741,7 @@ if(MSVC) set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} ws2_32.lib winmm.lib + dwmapi.lib ) set(LOVE_RC diff --git a/src/modules/window/sdl/Window.cpp b/src/modules/window/sdl/Window.cpp index 81fccc233..be242eadf 100644 --- a/src/modules/window/sdl/Window.cpp +++ b/src/modules/window/sdl/Window.cpp @@ -44,6 +44,8 @@ #if defined(LOVE_WINDOWS) #include +#include +#include #elif defined(LOVE_MACOSX) #include "common/macosx.h" #endif @@ -1010,6 +1012,22 @@ bool Window::isMinimized() const void Window::swapBuffers() { SDL_GL_SwapWindow(window); + +#ifdef LOVE_WINDOWS + // https://github.com/love2d/love/issues/1628 + // DwmFlush helps avoid apparent stuttering in windowed mode on Windows. Be careful to only call it when + // the compositor may be active and non-adaptive vsync is enabled (it syncs to nearest refresh which stops the + // "adaptive" part of adaptive vsync). + // Calling it directly after vsync seems to have less chance of dropping a frame than directly before. + if (context != nullptr && (!settings.fullscreen || settings.fstype == FULLSCREEN_DESKTOP) && getVSync() > 0) + { + // Desktop composition is always enabled in Windows 8+. But DwmIsCompositionEnabled won't always return true... + // (see DwmIsCompositionEnabled docs). + BOOL compositionEnabled = IsWindows8OrGreater(); + if (compositionEnabled || (SUCCEEDED(DwmIsCompositionEnabled(&compositionEnabled)) && compositionEnabled)) + DwmFlush(); + } +#endif } bool Window::hasFocus() const