summaryrefslogtreecommitdiff
path: root/gst-libs/gst/gl/gstglshader.c
diff options
context:
space:
mode:
authorMatthew Waters <ystreet00@gmail.com>2013-06-28 00:34:48 +1000
committerMatthew Waters <ystreet00@gmail.com>2014-03-15 18:36:56 +0100
commit11b810fcf5668fa474365c5a123989e72ca924e1 (patch)
tree4ff36fedb3cd87081509390ecbb48597bde089e1 /gst-libs/gst/gl/gstglshader.c
parenta5b877fb13f87fad1a4f17f67326481afee50697 (diff)
downloadgstreamer-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.c44
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;