mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 13:41:48 +00:00
gldisplay: tentative proper context collision detection
Fixes tee name=t ! queue ! gliamgesink t. ! queue ! glimagesink
This commit is contained in:
parent
55dbb25dcc
commit
1c51ba395a
1 changed files with 39 additions and 10 deletions
|
@ -390,6 +390,37 @@ gst_gl_display_get_gl_context_for_thread (GstGLDisplay * display,
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_check_collision (GstGLContext * context, GstGLContext * collision)
|
||||||
|
{
|
||||||
|
GThread *thread, *collision_thread;
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
|
||||||
|
if (!context || !collision)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
thread = gst_gl_context_get_thread (context);
|
||||||
|
collision_thread = gst_gl_context_get_thread (collision);
|
||||||
|
|
||||||
|
if (!thread || !collision_thread) {
|
||||||
|
ret = FALSE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collision == context) {
|
||||||
|
ret = TRUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (thread)
|
||||||
|
g_thread_unref (thread);
|
||||||
|
if (collision_thread)
|
||||||
|
g_thread_unref (collision_thread);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_gl_display_add_context:
|
* gst_gl_display_add_context:
|
||||||
* @display: a #GstGLDisplay
|
* @display: a #GstGLDisplay
|
||||||
|
@ -403,6 +434,7 @@ gst_gl_display_get_gl_context_for_thread (GstGLDisplay * display,
|
||||||
gboolean
|
gboolean
|
||||||
gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context)
|
gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context)
|
||||||
{
|
{
|
||||||
|
GstGLContext *collision = NULL;
|
||||||
GstGLDisplay *context_display;
|
GstGLDisplay *context_display;
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
GThread *thread;
|
GThread *thread;
|
||||||
|
@ -419,16 +451,10 @@ gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context)
|
||||||
|
|
||||||
thread = gst_gl_context_get_thread (context);
|
thread = gst_gl_context_get_thread (context);
|
||||||
if (thread) {
|
if (thread) {
|
||||||
GstGLContext *collision =
|
collision = _get_gl_context_for_thread_unlocked (display, thread);
|
||||||
_get_gl_context_for_thread_unlocked (display, thread);
|
if (_check_collision (context, collision)) {
|
||||||
g_thread_unref (thread);
|
ret = FALSE;
|
||||||
if (collision) {
|
goto out;
|
||||||
if (collision != context) {
|
|
||||||
gst_object_unref (collision);
|
|
||||||
ret = FALSE;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
gst_object_unref (collision);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,6 +464,9 @@ gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context)
|
||||||
display->priv->contexts = g_list_prepend (display->priv->contexts, ref);
|
display->priv->contexts = g_list_prepend (display->priv->contexts, ref);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (collision)
|
||||||
|
gst_object_unref (collision);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (display, "%ssuccessfully inserted context %" GST_PTR_FORMAT,
|
GST_DEBUG_OBJECT (display, "%ssuccessfully inserted context %" GST_PTR_FORMAT,
|
||||||
ret ? "" : "un", context);
|
ret ? "" : "un", context);
|
||||||
GST_OBJECT_UNLOCK (display);
|
GST_OBJECT_UNLOCK (display);
|
||||||
|
|
Loading…
Reference in a new issue