Browse Source

Fix Vsync Via Compositor causing halved refresh rate when vsync is forced by the graphics driver

Add check to prevent compositor sync if the graphics driver is forcing vsync.

Fixes #35038.

(Addendum: this PR does not negatively impact users unaffected by #35038.)
hoontee 5 years ago
parent
commit
c08d8feead

+ 2 - 1
platform/windows/context_gl_windows.cpp

@@ -89,7 +89,7 @@ void ContextGL_Windows::swap_buffers() {
 	if (use_vsync) {
 	if (use_vsync) {
 		bool vsync_via_compositor_now = should_vsync_via_compositor();
 		bool vsync_via_compositor_now = should_vsync_via_compositor();
 
 
-		if (vsync_via_compositor_now) {
+		if (vsync_via_compositor_now && wglGetSwapIntervalEXT() == 0) {
 			DwmFlush();
 			DwmFlush();
 		}
 		}
 
 
@@ -205,6 +205,7 @@ Error ContextGL_Windows::initialize() {
 	}
 	}
 
 
 	wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
 	wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
+	wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)wglGetProcAddress("wglGetSwapIntervalEXT");
 	//glWrapperInit(wrapper_get_proc_address);
 	//glWrapperInit(wrapper_get_proc_address);
 
 
 	return OK;
 	return OK;

+ 2 - 0
platform/windows/context_gl_windows.h

@@ -41,6 +41,7 @@
 #include <windows.h>
 #include <windows.h>
 
 
 typedef bool(APIENTRY *PFNWGLSWAPINTERVALEXTPROC)(int interval);
 typedef bool(APIENTRY *PFNWGLSWAPINTERVALEXTPROC)(int interval);
+typedef int(APIENTRY *PFNWGLGETSWAPINTERVALEXTPROC)(void);
 
 
 class ContextGL_Windows {
 class ContextGL_Windows {
 
 
@@ -53,6 +54,7 @@ class ContextGL_Windows {
 	bool vsync_via_compositor;
 	bool vsync_via_compositor;
 
 
 	PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
 	PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
+	PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;
 
 
 	static bool should_vsync_via_compositor();
 	static bool should_vsync_via_compositor();