From 1256d5528d30ddecbdcea5544cbcd5a51d246cf8 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 7 Jul 2013 10:58:21 +0200 Subject: [PATCH] Use EXT_swap_control_tear when available to ensure that VSync never slows things down (tears instead if it can't keep up, better than stuttering) --- GPU/GLES/DisplayListInterpreter.cpp | 14 ++++++++++++-- Windows/OpenGLBase.cpp | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index d6e23f5418..066aa5c64b 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -171,7 +171,12 @@ static const u8 flushBeforeCommandList[] = { GLES_GPU::GLES_GPU() : resized_(false) { lastVsync_ = g_Config.iVSyncInterval; - glstate.SetVSyncInterval(g_Config.iVSyncInterval); + if (gl_extensions.EXT_swap_control_tear) { + // See http://developer.download.nvidia.com/opengl/specs/WGL_EXT_swap_control_tear.txt + glstate.SetVSyncInterval(-g_Config.iVSyncInterval); + } else { + glstate.SetVSyncInterval(g_Config.iVSyncInterval); + } shaderManager_ = new ShaderManager(); transformDraw_.SetShaderManager(shaderManager_); @@ -255,7 +260,12 @@ void GLES_GPU::BeginFrame() { if ((PSP_CoreParameter().unthrottle) || (PSP_CoreParameter().fpsLimit == 2) || (PSP_CoreParameter().fpsLimit == 1)) desiredVSyncInterval = 0; if (desiredVSyncInterval != lastVsync_) { - glstate.SetVSyncInterval(desiredVSyncInterval); + if (gl_extensions.EXT_swap_control_tear) { + // See http://developer.download.nvidia.com/opengl/specs/WGL_EXT_swap_control_tear.txt + glstate.SetVSyncInterval(-desiredVSyncInterval); + } else { + glstate.SetVSyncInterval(desiredVSyncInterval); + } lastVsync_ = desiredVSyncInterval; } diff --git a/Windows/OpenGLBase.cpp b/Windows/OpenGLBase.cpp index 80964fa85e..a0e7bf567c 100644 --- a/Windows/OpenGLBase.cpp +++ b/Windows/OpenGLBase.cpp @@ -196,6 +196,7 @@ bool GL_Init(HWND window, std::string *error_message) { glGetIntegerv(GL_MINOR_VERSION, &OpenGLVersion[1]); glstate.Initialize(); + CheckGLExtensions(); GL_SetVSyncInterval(0); if (enableGLDebug && glewIsSupported("GL_ARB_debug_output")) { glDebugMessageCallbackARB((GLDEBUGPROCARB)&DebugCallbackARB, 0); // print debug output to stderr