diff options
author | Michael Tretter <m.tretter@pengutronix.de> | 2020-10-21 11:42:54 +0200 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2020-10-22 21:41:40 +0000 |
commit | 4972041e1c7fe6fe4c7f6fba96896b9891a46b1c (patch) | |
tree | d0a48ca8ab8d0c8e4e5d9cf8d6da91cd2fd4903c | |
parent | 18960a397f4e1b397e4ba66f6ea00180deb7ad4a (diff) | |
download | gstreamer-plugins-base-4972041e1c7fe6fe4c7f6fba96896b9891a46b1c.tar.gz |
glslstage: delete shader on finalize of stage
GLSLstage creates the glShader using glCreateShader, but never calls
glDeleteShader if the glShader is not used anymore. This forces the GL
library to keep the compiled shader around, because it might be used in
the future. Therefore, the glShader is leaked whenever a GLSLStage is
destroyed.
Fix the leak by deleting the glShader when finishing the GLSLStage.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/891>
-rw-r--r-- | gst-libs/gst/gl/gstglslstage.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gst-libs/gst/gl/gstglslstage.c b/gst-libs/gst/gl/gstglslstage.c index 71e0b3f1c..c67bd917a 100644 --- a/gst-libs/gst/gl/gstglslstage.c +++ b/gst-libs/gst/gl/gstglslstage.c @@ -75,11 +75,23 @@ G_DEFINE_TYPE_WITH_CODE (GstGLSLStage, gst_glsl_stage, GST_TYPE_OBJECT, "GLSL Stage");); static void +_delete_shader (GstGLContext * context, GstGLSLStage * stage) +{ + GstGLSLStagePrivate *priv = stage->priv; + + if (priv->handle) + priv->vtable.DeleteShader (priv->handle); +} + +static void gst_glsl_stage_finalize (GObject * object) { GstGLSLStage *stage = GST_GLSL_STAGE (object); gint i; + gst_gl_context_thread_add (stage->context, + (GstGLContextThreadFunc) _delete_shader, stage); + if (stage->context) { gst_object_unref (stage->context); stage->context = NULL; |