/** * gst_gl_display_get_gl_context_for_thread: * @display: a #GstGLDisplay * @thread: a #GThread * * Returns: (transfer full): the #GstGLContext current on @thread or %NULL * * Must be called with the object lock held. * * Since: 1.6 */ GstGLContext * gst_gl_display_get_gl_context_for_thread (GstGLDisplay * display, GThread * thread) { GstGLContext *context; g_return_val_if_fail (GST_IS_GL_DISPLAY (display), NULL); context = _get_gl_context_for_thread_unlocked (display, thread); GST_DEBUG_OBJECT (display, "returning context %" GST_PTR_FORMAT " for thread " "%p", context, thread); return context; }
/** * gst_gl_display_add_context: * @display: a #GstGLDisplay * @context: (transfer none): a #GstGLContext * * Returns: whether @context was successfully added. %FALSE may be returned * if there already exists another context for @context's active thread. * * Must be called with the object lock held. * * Since: 1.6 */ gboolean gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context) { GstGLContext *collision = NULL; GstGLDisplay *context_display; gboolean ret = TRUE; GThread *thread; GWeakRef *ref; g_return_val_if_fail (GST_IS_GL_DISPLAY (display), FALSE); g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE); context_display = gst_gl_context_get_display (context); g_assert (context_display == display); gst_object_unref (context_display); thread = gst_gl_context_get_thread (context); if (thread) { collision = _get_gl_context_for_thread_unlocked (display, thread); g_thread_unref (thread); /* adding the same context is a no-op */ if (context == collision) { ret = TRUE; goto out; } if (_check_collision (context, collision)) { ret = FALSE; goto out; } } ref = g_new0 (GWeakRef, 1); g_weak_ref_init (ref, context); display->priv->contexts = g_list_prepend (display->priv->contexts, ref); out: if (collision) gst_object_unref (collision); GST_DEBUG_OBJECT (display, "%ssuccessfully inserted context %" GST_PTR_FORMAT, ret ? "" : "un", context); return ret; }