From dde7fa3b178886f57a257e7d892b5b0ad2e87e82 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 10 Nov 2025 16:30:17 -0800 Subject: [PATCH] Validate the output colorspace before setting up a renderer --- src/render/opengl/SDL_render_gl.c | 28 +++++++++++++++---------- src/render/opengles2/SDL_render_gles2.c | 16 +++++++------- src/render/software/SDL_render_sw.c | 12 +++++------ 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index ec2e9b6516..6479450717 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -1759,7 +1759,7 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr { GL_RenderData *data = NULL; GLint value; - SDL_WindowFlags window_flags; + SDL_WindowFlags window_flags = 0; int profile_mask = 0, major = 0, minor = 0; int real_major = 0, real_minor = 0; bool changed_window = false; @@ -1767,9 +1767,22 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr bool non_power_of_two_supported = false; bool bgra_supported = false; - SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask); - SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major); - SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor); + SDL_SetupRendererColorspace(renderer, create_props); + + if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { + SDL_SetError("Unsupported output colorspace"); + goto error; + } + + if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask)) { + goto error; + } + if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major)) { + goto error; + } + if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor)) { + goto error; + } #ifndef SDL_VIDEO_VITA_PVR_OGL SDL_SyncWindow(window); @@ -1788,13 +1801,6 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr } #endif - SDL_SetupRendererColorspace(renderer, create_props); - - if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); - goto error; - } - data = (GL_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { goto error; diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index 6cb22050c8..2d2d725cb1 100644 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -2304,12 +2304,19 @@ static bool GLES2_SetVSync(SDL_Renderer *renderer, const int vsync) static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { GLES2_RenderData *data = NULL; - SDL_WindowFlags window_flags = 0; // -Wconditional-uninitialized + SDL_WindowFlags window_flags = 0; GLint window_framebuffer; GLint value; int profile_mask = 0, major = 0, minor = 0; bool changed_window = false; + SDL_SetupRendererColorspace(renderer, create_props); + + if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { + SDL_SetError("Unsupported output colorspace"); + goto error; + } + if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask)) { goto error; } @@ -2337,13 +2344,6 @@ static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL } } - SDL_SetupRendererColorspace(renderer, create_props); - - if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); - goto error; - } - data = (GLES2_RenderData *)SDL_calloc(1, sizeof(GLES2_RenderData)); if (!data) { goto error; diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c index 424aa5f1de..a007815316 100644 --- a/src/render/software/SDL_render_sw.c +++ b/src/render/software/SDL_render_sw.c @@ -1161,6 +1161,12 @@ bool SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, S return SDL_SetError("Unsupported surface format"); } + SDL_SetupRendererColorspace(renderer, create_props); + + if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { + return SDL_SetError("Unsupported output colorspace"); + } + renderer->software = true; data = (SW_RenderData *)SDL_calloc(1, sizeof(*data)); @@ -1202,12 +1208,6 @@ bool SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, S SW_SelectBestFormats(renderer, surface->format); - SDL_SetupRendererColorspace(renderer, create_props); - - if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - return SDL_SetError("Unsupported output colorspace"); - } - return true; }