On 2026/03/02 5:48, Dmitry Osipenko wrote:
Get currently bound GL context when creating new GL context and restore
it after the creation for consistency with behavior expected by virglrenderer
that assumes context-creation doesn't switch context.

Signed-off-by: Dmitry Osipenko <[email protected]>
---
  ui/gtk-gl-area.c | 15 ++++++++++++---
  1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c
index c709b2ce0f63..55c2c55ee93b 100644
--- a/ui/gtk-gl-area.c
+++ b/ui/gtk-gl-area.c
@@ -250,17 +250,19 @@ QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
                                          QEMUGLParams *params)
  {
      VirtualConsole *vc = container_of(dgc, VirtualConsole, gfx.dgc);
+    GdkGLContext *ctx, *current_ctx;
      GdkWindow *window;
-    GdkGLContext *ctx;
      GError *err = NULL;
      int major, minor;
+ current_ctx = gdk_gl_context_get_current();
+
      window = gtk_widget_get_window(vc->gfx.drawing_area);
      ctx = gdk_window_create_gl_context(window, &err);
      if (err) {
          g_printerr("Create gdk gl context failed: %s\n", err->message);
          g_error_free(err);
-        return NULL;
+        goto out;

I don't think this change is needed. We do not change the bound context yet.

      }
      gdk_gl_context_set_required_version(ctx,
                                          params->major_ver,
@@ -270,7 +272,7 @@ QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
          g_printerr("Realize gdk gl context failed: %s\n", err->message);
          g_error_free(err);
          g_clear_object(&ctx);
-        return NULL;
+        goto out;
      }
gdk_gl_context_make_current(ctx);
@@ -283,6 +285,13 @@ QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
          g_clear_object(&ctx);
      }
+out:
+    if (current_ctx) {
+        gdk_gl_context_make_current(current_ctx);
+    } else {
+        gdk_gl_context_clear_current();
+    }
+

This function already calls gdk_gl_context_clear_current() and gtk_gl_area_make_current(). They should be replaced.

Regards,
Akihiko Odaki

      trace_gd_gl_area_create_context(ctx, params->major_ver, 
params->minor_ver);
      return ctx;
  }


Reply via email to