qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] SDL: OpenGL 3 window context


From: Antonio Caggiano
Subject: [PATCH] SDL: OpenGL 3 window context
Date: Thu, 1 Jun 2023 16:00:19 +0200

SDL renderer creates an OpenGL 2.1 context while QEMU expects minimum
OpenGL version 3.3 or ES 3.0. To fix this we create an OpenGL context
directly, ignoring the SDL renderer when OpenGL is enabled.

Signed-off-by: Antonio Caggiano <quic_acaggian@quicinc.com>
---
 ui/sdl2.c | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/ui/sdl2.c b/ui/sdl2.c
index 9d703200bf..42512588b5 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -104,7 +104,24 @@ void sdl2_window_create(struct sdl2_console *scon)
                                          surface_width(scon->surface),
                                          surface_height(scon->surface),
                                          flags);
+
     if (scon->opengl) {
+        /* Set the minimum version required by the texture blit shaders */
+        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
+
+        if (scon->opts->gl == DISPLAYGL_MODE_ES) {
+            SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
+                                SDL_GL_CONTEXT_PROFILE_ES);
+            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
+        }
+
+        scon->winctx = SDL_GL_CreateContext(scon->real_window);
+    } else {
+        /*
+         * The SDL renderer is only used by sdl2 2D callbacks, when OpenGL is
+         * disabled at configuration time
+         */
         const char *driver = "opengl";
 
         if (scon->opts->gl == DISPLAYGL_MODE_ES) {
@@ -113,11 +130,8 @@ void sdl2_window_create(struct sdl2_console *scon)
 
         SDL_SetHint(SDL_HINT_RENDER_DRIVER, driver);
         SDL_SetHint(SDL_HINT_RENDER_BATCHING, "1");
-    }
-    scon->real_renderer = SDL_CreateRenderer(scon->real_window, -1, 0);
 
-    if (scon->opengl) {
-        scon->winctx = SDL_GL_CreateContext(scon->real_window);
+        scon->real_renderer = SDL_CreateRenderer(scon->real_window, -1, 0);
     }
     sdl_update_caption(scon);
 }
@@ -128,10 +142,14 @@ void sdl2_window_destroy(struct sdl2_console *scon)
         return;
     }
 
-    SDL_GL_DeleteContext(scon->winctx);
-    scon->winctx = NULL;
-    SDL_DestroyRenderer(scon->real_renderer);
-    scon->real_renderer = NULL;
+    if (scon->winctx) {
+        SDL_GL_DeleteContext(scon->winctx);
+        scon->winctx = NULL;
+    }
+    if (scon->real_renderer) {
+        SDL_DestroyRenderer(scon->real_renderer);
+        scon->real_renderer = NULL;
+    }
     SDL_DestroyWindow(scon->real_window);
     scon->real_window = NULL;
 }
-- 
2.40.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]