From b8ee44ca6a0559a509f8d58b466d995c2669cb71 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 11 Jul 2025 12:29:12 -0400 Subject: [PATCH] windows: Use wglSwapLayerBuffers if available. It apparently works better (or can work better?) on multimonitor setups than SwapBuffers. This should be available back to Windows 95, but just in case, it falls back to standard SwapBuffers if not available. Fixes #13269. (cherry picked from commit f286558baef3aa9e54a491d744935c8603a90194) --- src/video/windows/SDL_windowsopengl.c | 13 +++++++++++-- src/video/windows/SDL_windowsopengl.h | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/video/windows/SDL_windowsopengl.c b/src/video/windows/SDL_windowsopengl.c index c458796044..4588e2531c 100644 --- a/src/video/windows/SDL_windowsopengl.c +++ b/src/video/windows/SDL_windowsopengl.c @@ -141,6 +141,9 @@ bool WIN_GL_LoadLibrary(SDL_VideoDevice *_this, const char *path) SDL_LoadFunction(handle, "wglMakeCurrent"); _this->gl_data->wglShareLists = (BOOL (WINAPI *)(HGLRC, HGLRC)) SDL_LoadFunction(handle, "wglShareLists"); + _this->gl_data->wglSwapLayerBuffers = (BOOL (WINAPI *)(HDC, UINT)) + SDL_LoadFunction(handle, "wglSwapLayerBuffers"); + /* *INDENT-ON* */ // clang-format on #if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES) @@ -886,8 +889,14 @@ bool WIN_GL_SwapWindow(SDL_VideoDevice *_this, SDL_Window *window) { HDC hdc = window->internal->hdc; - if (!SwapBuffers(hdc)) { - return WIN_SetError("SwapBuffers()"); + if (_this->gl_data->wglSwapLayerBuffers) { + if (!_this->gl_data->wglSwapLayerBuffers(hdc, WGL_SWAP_MAIN_PLANE)) { + return WIN_SetError("wglSwapLayerBuffers()"); + } + } else { + if (!SwapBuffers(hdc)) { + return WIN_SetError("SwapBuffers()"); + } } return true; } diff --git a/src/video/windows/SDL_windowsopengl.h b/src/video/windows/SDL_windowsopengl.h index 23e2f3a58f..7d6abece1f 100644 --- a/src/video/windows/SDL_windowsopengl.h +++ b/src/video/windows/SDL_windowsopengl.h @@ -85,6 +85,8 @@ struct SDL_GLDriverData BOOL (WINAPI *wglGetPixelFormatAttribivARB)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); BOOL (WINAPI *wglSwapIntervalEXT)(int interval); int (WINAPI *wglGetSwapIntervalEXT)(void); + BOOL (WINAPI *wglSwapLayerBuffers)(HDC hdc, UINT flags); + #if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES) BOOL (WINAPI *wglSwapBuffers)(HDC hdc); int (WINAPI *wglDescribePixelFormat)(HDC hdc,