From 517b52247e48c6647578981a17f979157c552016 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 28 Oct 2025 07:42:20 -0700
Subject: [PATCH] Create an OpenGL window if the default renderer is OpenGL
This fixes having to recreate the window when creating the renderer.
---
src/SDL12_compat.c | 16 ++++++++++++++++
src/SDL20_syms.h | 1 +
2 files changed, 17 insertions(+)
diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c
index e122fd9a0..8dedf514f 100644
--- a/src/SDL12_compat.c
+++ b/src/SDL12_compat.c
@@ -6342,6 +6342,18 @@ UnlockVideoRenderer(void)
static void UpdateInputGrab(void);
+static SDL_bool ShouldUseOpenGL(void)
+{
+ /* Create an OpenGL window if the default renderer is OpenGL */
+ SDL_RendererInfo info;
+ if (SDL20_GetRenderDriverInfo(0, &info) == 0) {
+ if (SDL20_strncmp(info.name, "opengl", 6) == 0) {
+ return SDL_TRUE;
+ }
+ }
+ return SDL_FALSE;
+}
+
static SDL12_Surface *
SetVideoModeImpl(int width, int height, int bpp, Uint32 flags12)
{
@@ -6559,6 +6571,10 @@ SetVideoModeImpl(int width, int height, int bpp, Uint32 flags12)
if (flags12 & SDL12_NOFRAME) { flags20 |= SDL_WINDOW_BORDERLESS; }
if (use_highdpi) { flags20 |= SDL_WINDOW_ALLOW_HIGHDPI; }
+ if (!(flags20 & SDL_WINDOW_OPENGL) && ShouldUseOpenGL()) {
+ flags20 |= SDL_WINDOW_OPENGL;
+ }
+
/* most platforms didn't check these environment variables, but the major
ones did (x11, windib, quartz), so we'll just offer it everywhere. */
GetEnvironmentWindowPosition(&x, &y);
diff --git a/src/SDL20_syms.h b/src/SDL20_syms.h
index f11de4589..ab7572d1b 100644
--- a/src/SDL20_syms.h
+++ b/src/SDL20_syms.h
@@ -319,6 +319,7 @@ SDL20_SYM(double,fabs,(double a),(a),return)
SDL20_SYM(double,ceil,(double a),(a),return)
SDL20_SYM(double,floor,(double a),(a),return)
+SDL20_SYM(int,GetRenderDriverInfo,(int a, SDL_RendererInfo *b),(a,b),return)
SDL20_SYM(SDL_Renderer *,CreateRenderer,(SDL_Window *a, int b, Uint32 c),(a,b,c),return)
SDL20_SYM(int,GetRendererInfo,(SDL_Renderer *a, SDL_RendererInfo *b),(a,b),return)
SDL20_SYM(void,RenderGetScale,(SDL_Renderer *a, float *b, float *c),(a,b,c),return)