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 f286558bae)
This commit is contained in:
Ryan C. Gordon
2025-07-11 12:29:12 -04:00
parent 4a4abe4240
commit b8ee44ca6a
2 changed files with 13 additions and 2 deletions

View File

@@ -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;
}

View File

@@ -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,