Commit c3bc4101 authored by Kenneth Graunke's avatar Kenneth Graunke
Browse files

mesa: Prevent repeated glDeleteShader() from blowing away our refcounts.

Calling glDeleteShader() should mark shaders as pending for deletion,
but shouldn't decrement the refcount every time.  Otherwise, repeated
glDeleteShader() is not safe.

This is particularly bad since glDeleteProgram() frees shaders: if you
first call glDeleteShader() on the shaders attached to the program (thus
decrementing the refcount), then called glDeleteProgram(), it would try
to free them again (decrementing the refcount another time), causing
a refcount > 0 assertion to fail.

Similar to commit d950a778


NOTE: This is a candidate for the 8.0 branch.
Signed-off-by: default avatarKenneth Graunke <>
Reviewed-by: default avatarBrian Paul <>
parent cfdf60f2
......@@ -346,10 +346,12 @@ delete_shader(struct gl_context *ctx, GLuint shader)
if (!sh)
sh->DeletePending = GL_TRUE;
if (!sh->DeletePending) {
sh->DeletePending = GL_TRUE;
/* effectively, decr sh's refcount */
_mesa_reference_shader(ctx, &sh, NULL);
/* effectively, decr sh's refcount */
_mesa_reference_shader(ctx, &sh, NULL);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment