From f286558baef3aa9e54a491d744935c8603a90194 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. --- 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 c45879604..4588e2531 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 23e2f3a58..7d6abece1 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,