From a6c0052f39eaf7e14ed2e351ba57b31052794640 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 3 Feb 2026 13:25:54 -0500 Subject: [PATCH] srgb: Readd WGL/GLX extension checks when asking for sRGB-capable framebuffers. Reference Issue #14898. --- src/video/windows/SDL_windowsopengl.c | 20 ++++++++++++++------ src/video/windows/SDL_windowsopengl.h | 1 + src/video/x11/SDL_x11opengl.c | 9 ++++++++- src/video/x11/SDL_x11opengl.h | 1 + 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/video/windows/SDL_windowsopengl.c b/src/video/windows/SDL_windowsopengl.c index dd8eb9e011..4423a0a036 100644 --- a/src/video/windows/SDL_windowsopengl.c +++ b/src/video/windows/SDL_windowsopengl.c @@ -512,6 +512,13 @@ void WIN_GL_InitExtensions(SDL_VideoDevice *_this) _this->gl_data->HAS_WGL_ARB_create_context_no_error = true; } + // Check for WGL_ARB_framebuffer_sRGB + if (HasExtension("WGL_ARB_framebuffer_sRGB", extensions)) { + _this->gl_data->HAS_WGL_ARB_framebuffer_sRGB = true; + } else if (HasExtension("WGL_EXT_framebuffer_sRGB", extensions)) { // same thing. + _this->gl_data->HAS_WGL_ARB_framebuffer_sRGB = true; + } + /* Check for WGL_ARB_pixel_format_float */ _this->gl_data->HAS_WGL_ARB_pixel_format_float = HasExtension("WGL_ARB_pixel_format_float", extensions); @@ -532,9 +539,6 @@ static int WIN_GL_ChoosePixelFormatARB(SDL_VideoDevice *_this, int *iAttribs, fl int pixel_format = 0; unsigned int matching; - int qAttrib = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB; - int srgb = 0; - hwnd = CreateWindow(SDL_Appname, SDL_Appname, (WS_POPUP | WS_DISABLED), 0, 0, 10, 10, NULL, NULL, SDL_Instance, NULL); @@ -556,7 +560,11 @@ static int WIN_GL_ChoosePixelFormatARB(SDL_VideoDevice *_this, int *iAttribs, fl &matching); // Check whether we actually got an SRGB capable buffer - _this->gl_data->wglGetPixelFormatAttribivARB(hdc, pixel_format, 0, 1, &qAttrib, &srgb); + int srgb = 0; + if (_this->gl_data->HAS_WGL_ARB_framebuffer_sRGB) { + int qAttrib = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB; + _this->gl_data->wglGetPixelFormatAttribivARB(hdc, pixel_format, 0, 1, &qAttrib, &srgb); + } _this->gl_config.framebuffer_srgb_capable = srgb; } @@ -651,9 +659,9 @@ static bool WIN_GL_SetupWindowInternal(SDL_VideoDevice *_this, SDL_Window *windo *iAttr++ = WGL_TYPE_RGBA_FLOAT_ARB; } - if (_this->gl_config.framebuffer_srgb_capable) { + if (_this->gl_data->HAS_WGL_ARB_framebuffer_sRGB && _this->gl_config.framebuffer_srgb_capable) { *iAttr++ = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB; - *iAttr++ = _this->gl_config.framebuffer_srgb_capable; + *iAttr++ = GL_TRUE; } /* We always choose either FULL or NO accel on Windows, because of flaky diff --git a/src/video/windows/SDL_windowsopengl.h b/src/video/windows/SDL_windowsopengl.h index 1711514ce2..a6ea015441 100644 --- a/src/video/windows/SDL_windowsopengl.h +++ b/src/video/windows/SDL_windowsopengl.h @@ -66,6 +66,7 @@ struct SDL_GLDriverData bool HAS_WGL_ARB_create_context_no_error; bool HAS_WGL_ARB_pixel_format_float; bool HAS_WGL_EXT_create_context_es2_profile; + bool HAS_WGL_ARB_framebuffer_sRGB; /* Max version of OpenGL ES context that can be created if the implementation supports WGL_EXT_create_context_es2_profile. diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index 7d843ab676..906a3eeae2 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -466,6 +466,13 @@ static void X11_GL_InitExtensions(SDL_VideoDevice *_this) _this->gl_data->HAS_GLX_ARB_create_context_no_error = true; } + // Check for GLX_ARB_framebuffer_sRGB + if (HasExtension("GLX_ARB_framebuffer_sRGB", extensions)) { + _this->gl_data->HAS_GLX_ARB_framebuffer_sRGB = true; + } else if (HasExtension("GLX_EXT_framebuffer_sRGB", extensions)) { // same thing. + _this->gl_data->HAS_GLX_ARB_framebuffer_sRGB = true; + } + if (context) { _this->gl_data->glXMakeCurrent(display, None, NULL); _this->gl_data->glXDestroyContext(display, context); @@ -576,7 +583,7 @@ static int X11_GL_GetAttributes(SDL_VideoDevice *_this, Display *display, int sc attribs[i++] = GLX_RGBA_FLOAT_TYPE_ARB; } - if (_this->gl_config.framebuffer_srgb_capable) { + if (_this->gl_data->HAS_GLX_ARB_framebuffer_sRGB && _this->gl_config.framebuffer_srgb_capable) { attribs[i++] = GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB; attribs[i++] = True; // always needed, for_FBConfig or not! } diff --git a/src/video/x11/SDL_x11opengl.h b/src/video/x11/SDL_x11opengl.h index 1694a32bd3..5a405683d0 100644 --- a/src/video/x11/SDL_x11opengl.h +++ b/src/video/x11/SDL_x11opengl.h @@ -47,6 +47,7 @@ struct SDL_GLDriverData bool HAS_GLX_ARB_context_flush_control; bool HAS_GLX_ARB_create_context_robustness; bool HAS_GLX_ARB_create_context_no_error; + bool HAS_GLX_ARB_framebuffer_sRGB; /* Max version of OpenGL ES context that can be created if the implementation supports GLX_EXT_create_context_es2_profile.