gallium: fix a few more shader-related mem leaks
This commit is contained in:
@@ -77,34 +77,6 @@ struct translated_vertex_program
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free data hanging off the st vert prog.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
st_remove_vertex_program(struct st_context *st, struct st_vertex_program *stvp)
|
|
||||||
{
|
|
||||||
/* no-op, for now? */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free data hanging off the st frag prog.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
st_remove_fragment_program(struct st_context *st,
|
|
||||||
struct st_fragment_program *stfp)
|
|
||||||
{
|
|
||||||
struct translated_vertex_program *xvp, *next;
|
|
||||||
|
|
||||||
for (xvp = stfp->vertex_programs; xvp; xvp = next) {
|
|
||||||
next = xvp->next;
|
|
||||||
/* XXX free xvp->vs */
|
|
||||||
free(xvp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a vertex program output attribute, return the corresponding
|
* Given a vertex program output attribute, return the corresponding
|
||||||
* fragment program input attribute.
|
* fragment program input attribute.
|
||||||
@@ -265,6 +237,21 @@ find_translated_vp(struct st_context *st,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
st_free_translated_vertex_programs(struct st_context *st,
|
||||||
|
struct translated_vertex_program *xvp)
|
||||||
|
{
|
||||||
|
struct translated_vertex_program *next;
|
||||||
|
|
||||||
|
while (xvp) {
|
||||||
|
next = xvp->next;
|
||||||
|
free(xvp);
|
||||||
|
xvp = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_linkage( struct st_context *st )
|
update_linkage( struct st_context *st )
|
||||||
{
|
{
|
||||||
|
@@ -31,10 +31,8 @@
|
|||||||
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
st_remove_vertex_program(struct st_context *, struct st_vertex_program *);
|
st_free_translated_vertex_programs(struct st_context *st,
|
||||||
|
struct translated_vertex_program *xvp);
|
||||||
extern void
|
|
||||||
st_remove_fragment_program(struct st_context *, struct st_fragment_program *);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* ST_ATOM_SHADER_H */
|
#endif /* ST_ATOM_SHADER_H */
|
||||||
|
@@ -132,25 +132,33 @@ static void st_delete_program( GLcontext *ctx,
|
|||||||
case GL_VERTEX_PROGRAM_ARB:
|
case GL_VERTEX_PROGRAM_ARB:
|
||||||
{
|
{
|
||||||
struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
|
struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
|
||||||
st_remove_vertex_program(st, stvp);
|
|
||||||
if (stvp->driver_shader) {
|
if (stvp->driver_shader) {
|
||||||
pipe->delete_vs_state(pipe, stvp->driver_shader);
|
pipe->delete_vs_state(pipe, stvp->driver_shader);
|
||||||
stvp->driver_shader = NULL;
|
stvp->driver_shader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (stvp->state.tokens) {
|
||||||
|
FREE((void *) stvp->state.tokens);
|
||||||
|
stvp->state.tokens = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_FRAGMENT_PROGRAM_ARB:
|
case GL_FRAGMENT_PROGRAM_ARB:
|
||||||
{
|
{
|
||||||
struct st_fragment_program *stfp
|
struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
|
||||||
= (struct st_fragment_program *) prog;
|
|
||||||
st_remove_fragment_program(st, stfp);
|
|
||||||
if (stfp->driver_shader) {
|
if (stfp->driver_shader) {
|
||||||
pipe->delete_fs_state(pipe, stfp->driver_shader);
|
pipe->delete_fs_state(pipe, stfp->driver_shader);
|
||||||
stfp->driver_shader = NULL;
|
stfp->driver_shader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(!stfp->vertex_programs);
|
if (stfp->state.tokens) {
|
||||||
|
FREE((void *) stfp->state.tokens);
|
||||||
|
stfp->state.tokens = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
st_free_translated_vertex_programs(st, stfp->vertex_programs);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -186,13 +194,13 @@ static void st_program_string_notify( GLcontext *ctx,
|
|||||||
stfp->driver_shader = NULL;
|
stfp->driver_shader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
stfp->param_state = stfp->Base.Base.Parameters->StateFlags;
|
|
||||||
|
|
||||||
if (stfp->state.tokens) {
|
if (stfp->state.tokens) {
|
||||||
FREE((void *) stfp->state.tokens);
|
FREE((void *) stfp->state.tokens);
|
||||||
stfp->state.tokens = NULL;
|
stfp->state.tokens = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stfp->param_state = stfp->Base.Base.Parameters->StateFlags;
|
||||||
|
|
||||||
if (st->fp == stfp)
|
if (st->fp == stfp)
|
||||||
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
|
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
|
||||||
}
|
}
|
||||||
@@ -211,13 +219,13 @@ static void st_program_string_notify( GLcontext *ctx,
|
|||||||
stvp->draw_shader = NULL;
|
stvp->draw_shader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
stvp->param_state = stvp->Base.Base.Parameters->StateFlags;
|
|
||||||
|
|
||||||
if (stvp->state.tokens) {
|
if (stvp->state.tokens) {
|
||||||
FREE((void *) stvp->state.tokens);
|
FREE((void *) stvp->state.tokens);
|
||||||
stvp->state.tokens = NULL;
|
stvp->state.tokens = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stvp->param_state = stvp->Base.Base.Parameters->StateFlags;
|
||||||
|
|
||||||
if (st->vp == stvp)
|
if (st->vp == stvp)
|
||||||
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
|
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
|
||||||
}
|
}
|
||||||
|
@@ -260,6 +260,16 @@ st_translate_vertex_program(struct st_context *st,
|
|||||||
outputMapping = defaultOutputMapping;
|
outputMapping = defaultOutputMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* free old shader state, if any */
|
||||||
|
if (stvp->state.tokens) {
|
||||||
|
FREE((void *) stvp->state.tokens);
|
||||||
|
stvp->state.tokens = NULL;
|
||||||
|
}
|
||||||
|
if (stvp->driver_shader) {
|
||||||
|
pipe->delete_vs_state(pipe, stvp->driver_shader);
|
||||||
|
stvp->driver_shader = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX: fix static allocation of tokens:
|
/* XXX: fix static allocation of tokens:
|
||||||
*/
|
*/
|
||||||
num_tokens = tgsi_translate_mesa_program( TGSI_PROCESSOR_VERTEX,
|
num_tokens = tgsi_translate_mesa_program( TGSI_PROCESSOR_VERTEX,
|
||||||
|
Reference in New Issue
Block a user