summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/softpipe/sp_fs_exec.c7
-rw-r--r--src/gallium/drivers/softpipe/sp_state.h3
-rw-r--r--src/gallium/drivers/softpipe/sp_state_shader.c10
3 files changed, 9 insertions, 11 deletions
diff --git a/src/gallium/drivers/softpipe/sp_fs_exec.c b/src/gallium/drivers/softpipe/sp_fs_exec.c
index f5344924a1d..3793d9b3613 100644
--- a/src/gallium/drivers/softpipe/sp_fs_exec.c
+++ b/src/gallium/drivers/softpipe/sp_fs_exec.c
@@ -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);
}
diff --git a/src/gallium/drivers/softpipe/sp_state.h b/src/gallium/drivers/softpipe/sp_state.h
index eb85b0689ea..fa8654fe976 100644
--- a/src/gallium/drivers/softpipe/sp_state.h
+++ b/src/gallium/drivers/softpipe/sp_state.h
@@ -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;
};
diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c b/src/gallium/drivers/softpipe/sp_state_shader.c
index 1e64431344b..40d32a4dfb0 100644
--- a/src/gallium/drivers/softpipe/sp_state_shader.c
+++ b/src/gallium/drivers/softpipe/sp_state_shader.c
@@ -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);