summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tretter <m.tretter@pengutronix.de>2020-10-21 11:42:54 +0200
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-10-22 21:41:40 +0000
commit4972041e1c7fe6fe4c7f6fba96896b9891a46b1c (patch)
treed0a48ca8ab8d0c8e4e5d9cf8d6da91cd2fd4903c
parent18960a397f4e1b397e4ba66f6ea00180deb7ad4a (diff)
downloadgstreamer-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.c12
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;