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