summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/context.c1
-rw-r--r--src/mesa/shader/shader_api.c16
-rw-r--r--src/mesa/shader/shader_api.h3
3 files changed, 20 insertions, 0 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 0cff90c77a..72c85de7ba 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1439,6 +1439,7 @@ _mesa_free_context_data( GLcontext *ctx )
_mesa_free_viewport_data( ctx );
_mesa_free_colortables_data( ctx );
_mesa_free_program_data(ctx);
+ _mesa_free_shader_state(ctx);
_mesa_free_query_data(ctx);
#if FEATURE_ARB_vertex_buffer_object
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c
index 88aa8c50f5..002b42721d 100644
--- a/src/mesa/shader/shader_api.c
+++ b/src/mesa/shader/shader_api.c
@@ -212,6 +212,22 @@ _mesa_init_shader_state(GLcontext * ctx)
/**
+ * Free the per-context shader-related state.
+ */
+void
+_mesa_free_shader_state(GLcontext *ctx)
+{
+ if (ctx->Shader.CurrentProgram) {
+ ctx->Shader.CurrentProgram->RefCount--;
+ if (ctx->Shader.CurrentProgram->RefCount <= 0) {
+ _mesa_free_shader_program(ctx, ctx->Shader.CurrentProgram);
+ ctx->Shader.CurrentProgram = NULL;
+ }
+ }
+}
+
+
+/**
* Copy string from <src> to <dst>, up to maxLength characters, returning
* length of <dst> in <length>.
* \param src the strings source
diff --git a/src/mesa/shader/shader_api.h b/src/mesa/shader/shader_api.h
index 315f60a35f..16ed1a0c10 100644
--- a/src/mesa/shader/shader_api.h
+++ b/src/mesa/shader/shader_api.h
@@ -38,6 +38,9 @@
extern void
_mesa_init_shader_state(GLcontext * ctx);
+extern void
+_mesa_free_shader_state(GLcontext *ctx);
+
extern struct gl_shader_program *
_mesa_new_shader_program(GLcontext *ctx, GLuint name);