From dde7fa3b178886f57a257e7d892b5b0ad2e87e82 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 ec2e9b651647a..6479450717184 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 6cb22050c815c..2d2d725cb1a0a 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 424aa5f1de5e6..a007815316b51 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;
}