diff options
author | Matthew Waters <ystreet00@gmail.com> | 2013-06-28 00:34:48 +1000 |
---|---|---|
committer | Matthew Waters <ystreet00@gmail.com> | 2014-03-15 18:36:56 +0100 |
commit | 11b810fcf5668fa474365c5a123989e72ca924e1 (patch) | |
tree | 4ff36fedb3cd87081509390ecbb48597bde089e1 /gst-libs/gst/gl/gstglshader.c | |
parent | a5b877fb13f87fad1a4f17f67326481afee50697 (diff) | |
download | gstreamer-plugins-bad-11b810fcf5668fa474365c5a123989e72ca924e1.tar.gz |
[718/906] shader: make it possible to unref in the non-GL thread
Diffstat (limited to 'gst-libs/gst/gl/gstglshader.c')
-rw-r--r-- | gst-libs/gst/gl/gstglshader.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c index 6579a5b49..b94890bac 100644 --- a/gst-libs/gst/gl/gstglshader.c +++ b/gst-libs/gst/gl/gstglshader.c @@ -93,18 +93,25 @@ GST_DEBUG_CATEGORY_STATIC (gst_gl_shader_debug); G_DEFINE_TYPE_WITH_CODE (GstGLShader, gst_gl_shader, G_TYPE_OBJECT, DEBUG_INIT); static void -gst_gl_shader_dispose (GObject * object) +_cleanup_shader (GstGLDisplay * display, GstGLShader * shader) { - GstGLShader *shader; + GstGLShaderPrivate *priv = shader->priv; - shader = GST_GL_SHADER (object); + /* release shader objects */ + gst_gl_shader_release (shader); - if (shader->display) { - gst_object_unref (shader->display); - shader->display = NULL; + /* delete program */ + if (priv->program_handle) { + GST_TRACE ("finalizing program shader %u", priv->program_handle); + + priv->vtable.DeleteProgram (priv->program_handle); + /* err = glGetError (); */ + /* GST_WARNING ("error: 0x%x", err); */ + /* glGetObjectParameteriv(priv->program_handle, GL_OBJECT_DELETE_STATUS_, &status); */ + /* GST_INFO ("program deletion status:%s", status == GL_TRUE ? "true" : "false" ); */ } - G_OBJECT_CLASS (gst_gl_shader_parent_class)->dispose (object); + GST_DEBUG ("shader deleted %u", priv->program_handle); } static void @@ -121,26 +128,18 @@ gst_gl_shader_finalize (GObject * object) g_free (priv->vertex_src); g_free (priv->fragment_src); - /* release shader objects */ - gst_gl_shader_release (shader); - - /* delete program */ - if (priv->program_handle) { - GST_TRACE ("finalizing program shader %u", priv->program_handle); - - priv->vtable.DeleteProgram (priv->program_handle); - /* err = glGetError (); */ - /* GST_WARNING ("error: 0x%x", err); */ - /* glGetObjectParameteriv(priv->program_handle, GL_OBJECT_DELETE_STATUS_, &status); */ - /* GST_INFO ("program deletion status:%s", status == GL_TRUE ? "true" : "false" ); */ - } - - GST_DEBUG ("shader deleted %u", priv->program_handle); + gst_gl_display_thread_add (shader->display, + (GstGLDisplayThreadFunc) _cleanup_shader, shader); priv->fragment_handle = 0; priv->vertex_handle = 0; priv->program_handle = 0; + if (shader->display) { + gst_object_unref (shader->display); + shader->display = NULL; + } + G_OBJECT_CLASS (gst_gl_shader_parent_class)->finalize (object); } @@ -196,7 +195,6 @@ gst_gl_shader_class_init (GstGLShaderClass * klass) g_type_class_add_private (klass, sizeof (GstGLShaderPrivate)); obj_class->finalize = gst_gl_shader_finalize; - obj_class->dispose = gst_gl_shader_dispose; obj_class->set_property = gst_gl_shader_set_property; obj_class->get_property = gst_gl_shader_get_property; |