gl: Synchronize when calling MakeCurrent
authorMatthias Clasen <mclasen@redhat.com>
Fri, 27 Jan 2023 12:07:36 +0000 (07:07 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 27 Jan 2023 12:09:34 +0000 (07:09 -0500)
When making out GL context current, wait
until the GPU is done with commands from
the previous context.

Fixes: #5517
gdk/gdkgl.c

index 9690077cc221a2c8edbeb2ecfcd4114751067fcd..61cf16417b47dc91bec81a3b09e726306e6f8e99 100644 (file)
@@ -352,6 +352,7 @@ gdk_cairo_draw_from_gl (cairo_t              *cr,
   int alpha_size = 0;
   cairo_region_t *clip_region;
   GdkGLContextPaintData *paint_data;
+  GLsync sync = NULL;
 
   impl_window = window->impl_window;
 
@@ -366,7 +367,18 @@ gdk_cairo_draw_from_gl (cairo_t              *cr,
 
   clip_region = gdk_cairo_region_from_clip (cr);
 
+  if (gdk_gl_context_get_current () != paint_context)
+    sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+
   gdk_gl_context_make_current (paint_context);
+
+  if (sync)
+    {
+      glWaitSync (sync, 0, GL_TIMEOUT_IGNORED);
+      glDeleteSync (sync);
+      sync = NULL;
+    }
+
   paint_data = gdk_gl_context_get_paint_data (paint_context);
 
   if (paint_data->tmp_framebuffer == 0)