glarea: Synchronize
authorMatthias Clasen <mclasen@redhat.com>
Sat, 28 Jan 2023 16:04:10 +0000 (11:04 -0500)
committerBenjamin Otte <otte@redhat.com>
Fri, 28 Apr 2023 04:23:40 +0000 (06:23 +0200)
Create a fence object and pass it along when
creating the GL texture, so that the GL renderer
can wait for the texture to be ready.

gtk/gtkglarea.c

index 33f7881281d10e74f5fa760b79bc6c9046b97ffc..f547a4995f7c115f332ec368e6d024ad96e9ca72 100644 (file)
@@ -32,6 +32,8 @@
 #include "gtksnapshot.h"
 #include "gtkrenderlayoutprivate.h"
 #include "gtkcssnodeprivate.h"
+#include "gdk/gdkgltextureprivate.h"
+#include "gdk/gdkglcontextprivate.h"
 
 #include <epoxy/gl.h>
 
@@ -697,6 +699,15 @@ static void
 release_texture (gpointer data)
 {
   Texture *texture = data;
+  gpointer sync;
+
+  sync = gdk_gl_texture_builder_get_sync (texture->builder);
+  if (sync)
+    {
+      glDeleteSync (sync);
+      gdk_gl_texture_builder_set_sync (texture->builder, NULL);
+    }
+
   texture->holder = NULL;
 }
 
@@ -742,6 +753,7 @@ gtk_gl_area_snapshot (GtkWidget   *widget,
   if (status == GL_FRAMEBUFFER_COMPLETE)
     {
       Texture *texture;
+      gpointer sync = NULL;
 
       if (priv->needs_render || priv->auto_render)
         {
@@ -760,6 +772,11 @@ gtk_gl_area_snapshot (GtkWidget   *widget,
       priv->texture = NULL;
       priv->textures = g_list_prepend (priv->textures, texture);
 
+      if (gdk_gl_context_has_sync (priv->context))
+        sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+
+      gdk_gl_texture_builder_set_sync (texture->builder, sync);
+
       texture->holder = gdk_gl_texture_builder_build (texture->builder,
                                                       release_texture,
                                                       texture);