From: Julien Isorce Date: Tue, 19 Aug 2008 09:07:18 +0000 (+0200) Subject: [197/906] Shaders which are in the shaderstable are now released X-Git-Tag: 1.19.3~507^2~12335 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=631a06c6ab2e733bbdbc0280bd3ba13e61ec5e64;p=platform%2Fupstream%2Fgstreamer.git [197/906] Shaders which are in the shaderstable are now released --- diff --git a/gst/gl/gstgleffects.c b/gst/gl/gstgleffects.c index 14688f1..398c8ea 100644 --- a/gst/gl/gstgleffects.c +++ b/gst/gl/gstgleffects.c @@ -44,6 +44,8 @@ static void gst_gl_effects_get_property (GObject * object, guint prop_id, static void gst_gl_effects_init_resources (GstGLFilter* filter); static void gst_gl_effects_reset_resources (GstGLFilter* filter); +static void gst_gl_effects_ghash_func_clean (gpointer key, gpointer value, gpointer data); + static gboolean gst_gl_effects_filter (GstGLFilter * filter, GstGLBuffer * inbuf, GstGLBuffer * outbuf); @@ -284,12 +286,31 @@ gst_gl_effects_init (GstGLEffects * effects, GstGLEffectsClass * klass) } static void +gst_gl_effects_ghash_func_clean (gpointer key, gpointer value, gpointer data) +{ + GstGLShader* shader = (GstGLShader*) value; + GstGLFilter* filter = (GstGLFilter*) data; + + //blocking call, wait the opengl thread has destroyed the shader + gst_gl_display_del_shader (filter->display, shader); + + value = NULL; +} + +static void gst_gl_effects_reset_resources (GstGLFilter* filter) { GstGLEffects* effects = GST_GL_EFFECTS(filter); // g_message ("reset resources"); + //release shaders in the gl thread + g_hash_table_foreach (effects->shaderstable, gst_gl_effects_ghash_func_clean, + filter); + + //clean the htable without calling values destructors + //because shaders have been released in the glthread + //through the foreach func g_hash_table_unref (effects->shaderstable); effects->shaderstable = NULL; } @@ -298,7 +319,7 @@ static void gst_gl_effects_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstGLEffects *effects = GST_GL_EFFECTS (object); + GstGLEffects *effects = GST_GL_EFFECTS (object); switch (prop_id) { case PROP_EFFECT: @@ -339,10 +360,8 @@ gst_gl_effects_init_resources (GstGLFilter* filter) gint i; // g_message ("init resources"); // g_message ("init hashtable"); - effects->shaderstable = g_hash_table_new_full (g_str_hash, - g_str_equal, - NULL, - g_object_unref); + effects->shaderstable = g_hash_table_new (g_str_hash, + g_str_equal); // g_message ("zero textures and curves"); for (i=0; imidtexture[i] = 0;