Skip to content

Commit

Permalink
glslstage: delete shader on finalize of stage
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
tretter authored and GStreamer Merge Bot committed Oct 22, 2020
1 parent 18960a3 commit 4972041
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions gst-libs/gst/gl/gstglslstage.c
Expand Up @@ -74,12 +74,24 @@ G_DEFINE_TYPE_WITH_CODE (GstGLSLStage, gst_glsl_stage, GST_TYPE_OBJECT,
GST_DEBUG_CATEGORY_INIT (gst_glsl_stage_debug, "glslstage", 0,
"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;
Expand Down

0 comments on commit 4972041

Please sign in to comment.