summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_cb_program.c
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2008-03-22 10:29:30 -0600
committerBrian <brian.paul@tungstengraphics.com>2008-03-22 10:29:30 -0600
commita35c1ca3ad4361fee30d21ef13d8d37ae91aee66 (patch)
tree43b21696c8f9c811d148e3a4c0b12f75201b2673 /src/mesa/state_tracker/st_cb_program.c
parentf8acc3965e3fa9ec40ca63f3ddd0cb33966e8c95 (diff)
gallium: fix a few more shader-related mem leaks
Diffstat (limited to 'src/mesa/state_tracker/st_cb_program.c')
-rw-r--r--src/mesa/state_tracker/st_cb_program.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index 7cf352d710..a739fcd336 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -132,25 +132,33 @@ static void st_delete_program( GLcontext *ctx,
case GL_VERTEX_PROGRAM_ARB:
{
struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
- st_remove_vertex_program(st, stvp);
+
if (stvp->driver_shader) {
pipe->delete_vs_state(pipe, stvp->driver_shader);
stvp->driver_shader = NULL;
}
+
+ if (stvp->state.tokens) {
+ FREE((void *) stvp->state.tokens);
+ stvp->state.tokens = NULL;
+ }
}
break;
case GL_FRAGMENT_PROGRAM_ARB:
{
- struct st_fragment_program *stfp
- = (struct st_fragment_program *) prog;
- st_remove_fragment_program(st, stfp);
+ struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
+
if (stfp->driver_shader) {
pipe->delete_fs_state(pipe, stfp->driver_shader);
stfp->driver_shader = NULL;
}
+
+ if (stfp->state.tokens) {
+ FREE((void *) stfp->state.tokens);
+ stfp->state.tokens = NULL;
+ }
- assert(!stfp->vertex_programs);
-
+ st_free_translated_vertex_programs(st, stfp->vertex_programs);
}
break;
default:
@@ -186,13 +194,13 @@ static void st_program_string_notify( GLcontext *ctx,
stfp->driver_shader = NULL;
}
- stfp->param_state = stfp->Base.Base.Parameters->StateFlags;
-
if (stfp->state.tokens) {
FREE((void *) stfp->state.tokens);
stfp->state.tokens = NULL;
}
+ stfp->param_state = stfp->Base.Base.Parameters->StateFlags;
+
if (st->fp == stfp)
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
}
@@ -211,13 +219,13 @@ static void st_program_string_notify( GLcontext *ctx,
stvp->draw_shader = NULL;
}
- stvp->param_state = stvp->Base.Base.Parameters->StateFlags;
-
if (stvp->state.tokens) {
FREE((void *) stvp->state.tokens);
stvp->state.tokens = NULL;
}
+ stvp->param_state = stvp->Base.Base.Parameters->StateFlags;
+
if (st->vp == stvp)
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
}