diff options
-rw-r--r-- | src/mesa/shader/shader_api.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 002b42721df..1831d0fb2e7 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -67,6 +67,10 @@ _mesa_new_shader_program(GLcontext *ctx, GLuint name) } +/** + * Free the data that hangs off a shader program object, but not the object + * itself. + */ void _mesa_free_shader_program_data(GLcontext *ctx, struct gl_shader_program *shProg) @@ -104,11 +108,17 @@ _mesa_free_shader_program_data(GLcontext *ctx, } - +/** + * Free/delete a shader program object. + */ void _mesa_free_shader_program(GLcontext *ctx, struct gl_shader_program *shProg) { _mesa_free_shader_program_data(ctx, shProg); + if (shProg->Shaders) { + _mesa_free(shProg->Shaders); + shProg->Shaders = NULL; + } _mesa_free(shProg); } @@ -431,6 +441,10 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader) /* found it */ shProg->Shaders[i]->RefCount--; + if (shProg->Shaders[i]->RefCount == 0) { + /* delete now */ + _mesa_free_shader(ctx, shProg->Shaders[i]); + } /* alloc new, smaller array */ newList = (struct gl_shader **) @@ -446,8 +460,6 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader) newList[j++] = shProg->Shaders[i]; _mesa_free(shProg->Shaders); - /* XXX refcounting! */ - shProg->Shaders = newList; return; } |