glwindow: track context activation properly
authorMatthew Waters <matthew@centricular.com>
Tue, 21 Apr 2015 02:25:11 +0000 (12:25 +1000)
committerMatthew Waters <matthew@centricular.com>
Tue, 21 Apr 2015 02:55:24 +0000 (12:55 +1000)
We only need to deactivate/reactivate the context iff it was already
active.

gst-libs/gst/gl/gstglwindow.c

index f3b6ba2..42de9ab 100644 (file)
@@ -300,12 +300,28 @@ _set_window_handle_cb (GstSetWindowHandleCb * data)
 {
   GstGLContext *context = gst_gl_window_get_context (data->window);
   GstGLWindowClass *window_class = GST_GL_WINDOW_GET_CLASS (data->window);
+  GThread *thread = NULL;
+
+  /* deactivate if necessary */
+  if (context) {
+    thread = gst_gl_context_get_thread (context);
+    if (thread) {
+      /* This is only thread safe iff the context thread == g_thread_self() */
+      g_assert (thread == g_thread_self ());
+      gst_gl_context_activate (context, FALSE);
+    }
+  }
 
-  gst_gl_context_activate (context, FALSE);
   window_class->set_window_handle (data->window, data->handle);
-  gst_gl_context_activate (context, TRUE);
 
-  gst_object_unref (context);
+  /* reactivate */
+  if (context && thread)
+    gst_gl_context_activate (context, TRUE);
+
+  if (context)
+    gst_object_unref (context);
+  if (thread)
+    g_thread_unref (thread);
 }
 
 static void