Browse Source

windows: prefer regular vsync instead of dwm flush syncs.

The latter can cause stuttering issues on some setups.
Sasha Szpakowski 1 year ago
parent
commit
1d9d3346c5
2 changed files with 11 additions and 1 deletions
  1. 7 1
      src/modules/window/sdl/Window.cpp
  2. 4 0
      src/modules/window/sdl/Window.h

+ 7 - 1
src/modules/window/sdl/Window.cpp

@@ -106,6 +106,12 @@ Window::Window()
 
 	// Make sure the screensaver doesn't activate by default.
 	setDisplaySleepEnabled(false);
+
+#ifdef LOVE_WINDOWS
+	// Turned off by default, because it (ironically) causes stuttering issues
+	// on some setups. More investigation is needed before enabling it.
+	canUseDwmFlush = SDL_GetHintBoolean("LOVE_GRAPHICS_VSYNC_DWM", SDL_FALSE) != SDL_FALSE;
+#endif
 }
 
 Window::~Window()
@@ -1458,7 +1464,7 @@ void Window::swapBuffers()
 		// - DWM refreshes don't always match the refresh rate of the monitor the window is in (or the requested swap
 		//   interval), so we only use it when they do match.
 		// - The user may force GL vsync, and DwmFlush shouldn't be used together with GL vsync.
-		if (!settings.fullscreen && swapInterval == 1)
+		if (canUseDwmFlush && !settings.fullscreen && swapInterval == 1)
 		{
 			// Desktop composition is always enabled in Windows 8+. But DwmIsCompositionEnabled won't always return true...
 			// (see DwmIsCompositionEnabled docs).

+ 4 - 0
src/modules/window/sdl/Window.h

@@ -162,6 +162,10 @@ private:
 	WindowSettings settings;
 	StrongRef<love::image::ImageData> icon;
 
+#ifdef LOVE_WINDOWS
+	bool canUseDwmFlush = false;
+#endif
+
 	bool open;
 
 	bool mouseGrabbed;