softpipe: fix up FS variant unbinding / deletion

The old call to tgsi_exec_machine_bind_shader() in
softpipe_delete_fs_state() was never called since the shader's original
tokens are never passed to the tgsi interpreter (only shader _variant_
tokens are).  Now, unbind the variant's tokens from the tgsi interpreter
when we free the variant.

This doesn't fix any known bugs but it's the right thing to do.

Note: This is a candidate for the stable branches.
This commit is contained in:
Brian Paul 2012-12-14 10:47:46 -07:00
parent 18ef8f83b2
commit fddcc67f5c
3 changed files with 9 additions and 11 deletions

View File

@ -177,8 +177,13 @@ exec_run( const struct sp_fragment_shader_variant *var,
static void
exec_delete( struct sp_fragment_shader_variant *var )
exec_delete(struct sp_fragment_shader_variant *var,
struct tgsi_exec_machine *machine)
{
if (machine->Tokens == var->tokens) {
tgsi_exec_machine_bind_shader(machine, NULL, 0, NULL);
}
FREE( (void *) var->tokens );
FREE(var);
}

View File

@ -88,7 +88,8 @@ struct sp_fragment_shader_variant
struct quad_header *quad);
/* Deletes this instance of the object */
void (*delete)(struct sp_fragment_shader_variant *shader);
void (*delete)(struct sp_fragment_shader_variant *shader,
struct tgsi_exec_machine *machine);
struct sp_fragment_shader_variant *next;
};

View File

@ -38,7 +38,6 @@
#include "draw/draw_vs.h"
#include "draw/draw_gs.h"
#include "tgsi/tgsi_dump.h"
#include "tgsi/tgsi_exec.h"
#include "tgsi/tgsi_scan.h"
#include "tgsi/tgsi_parse.h"
@ -182,13 +181,6 @@ softpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
assert(fs != softpipe->fs);
if (softpipe->fs_machine->Tokens == state->shader.tokens) {
/* unbind the shader from the tgsi executor if we're
* deleting it.
*/
tgsi_exec_machine_bind_shader(softpipe->fs_machine, NULL, 0, NULL);
}
/* delete variants */
for (var = state->variants; var; var = next_var) {
next_var = var->next;
@ -200,7 +192,7 @@ softpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
draw_delete_fragment_shader(softpipe->draw, var->draw_shader);
#endif
var->delete(var);
var->delete(var, softpipe->fs_machine);
}
draw_delete_fragment_shader(softpipe->draw, state->draw_shader);