gltexture: Determine format in current thread
authorBenjamin Otte <otte@redhat.com>
Tue, 12 Oct 2021 22:36:38 +0000 (00:36 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 13 Oct 2021 12:33:44 +0000 (14:33 +0200)
Close widget-factory and observe:

Thread 1:
 * acquire main loop
 * handle close button
 * close window
 * dispose video and media stream
 * stop GstPlayer
WAIT on pipeline stopping

Thread 2:
 * prepare next image in pipeline
 * hand image to GtkGstSink
 * create GdkTexture from image
 * gdk_gl_texture_new() determines format
WAIT on acquiring main loop

Sounds like a deadlock?

Indeed, so don't do that.

gdk/gdkgltexture.c

index d734dbc4b9dccac854e349c1fafee87ab8ac4137..b20534801a073b84891431841f9f6b3b39fab621 100644 (file)
@@ -298,12 +298,24 @@ gdk_gl_texture_release (GdkGLTexture *self)
 }
 
 static void
-gdk_gl_texture_do_determine_format (gpointer texture_,
-                                    gpointer unused)
+gdk_gl_texture_determine_format (GdkGLTexture *self)
 {
-  GdkTexture *texture = texture_;
+  GdkTexture *texture = GDK_TEXTURE (self);
+  GLint active_texture;
   GLint internal_format;
 
+  if (self->context != gdk_gl_context_get_current ())
+    {
+      /* Somebody else is GL-ing here, abort! */
+      texture->format = GDK_MEMORY_DEFAULT;
+      return;
+    }
+
+  /* We need to be careful about modifying the GL context, as this is not
+   * expected during construction */
+  glGetIntegerv (GL_TEXTURE_BINDING_2D, &active_texture);
+  glBindTexture (GL_TEXTURE_2D, self->id);
+
   glGetTexLevelParameteriv (GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &internal_format);
 
   switch (internal_format)
@@ -347,6 +359,8 @@ gdk_gl_texture_do_determine_format (gpointer texture_,
       texture->format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
       break;
   }
+
+  glBindTexture (GL_TEXTURE_2D, active_texture);
 }
 
 /**
@@ -392,7 +406,7 @@ gdk_gl_texture_new (GdkGLContext   *context,
   self->destroy = destroy;
   self->data = data;
 
-  gdk_gl_texture_run (self, gdk_gl_texture_do_determine_format, NULL);
+  gdk_gl_texture_determine_format (self);
 
   return GDK_TEXTURE (self);
 }