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; } 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(); + } + trace_gd_gl_area_create_context(ctx, params->major_ver, params->minor_ver); return ctx; } -- 2.52.0
