diff options
author | Brian Paul <brianp@vmware.com> | 2012-12-14 10:34:33 -0700 |
---|---|---|
committer | Andreas Boll <andreas.boll.dev@gmail.com> | 2013-02-13 18:46:38 +0100 |
commit | e8830f5a4009c3784836edb441319a62c7beef36 (patch) | |
tree | 0da1345fc1a7dbe96543ab7e4b75e406d5e874cb | |
parent | e6e58cfa9dd8cbd5d6977822355d150e76eb987a (diff) |
softpipe: fix unreliable FS variant binding bug
In exec_prepare() we were comparing pointers to see if the fragment
shader variant had changed before calling tgsi_exec_machine_bind_shader().
This didn't work reliably when there was a lot of shader token malloc/
freeing going on because the memory might get reused.
Instead, bind the shader variant during regular state validation.
Fixes http://bugs.freedesktop.org/show_bug.cgi?id=40404
(fixes a couple of piglit's glsl-max-varyings test)
Note: This is a candidate for the stable branches.
(cherry picked from commit 18ef8f83b2586de037df7e578d88cbfb6e764012)
-rw-r--r-- | src/gallium/drivers/softpipe/sp_fs_exec.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_quad_fs.c | 7 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_state_derived.c | 6 |
3 files changed, 10 insertions, 14 deletions
diff --git a/src/gallium/drivers/softpipe/sp_fs_exec.c b/src/gallium/drivers/softpipe/sp_fs_exec.c index 16efb51905..3793d9b361 100644 --- a/src/gallium/drivers/softpipe/sp_fs_exec.c +++ b/src/gallium/drivers/softpipe/sp_fs_exec.c @@ -66,14 +66,11 @@ exec_prepare( const struct sp_fragment_shader_variant *var, { /* * Bind tokens/shader to the interpreter's machine state. - * Avoid redundant binding. */ - if (machine->Tokens != var->tokens) { - tgsi_exec_machine_bind_shader( machine, - var->tokens, - PIPE_MAX_SAMPLERS, - samplers ); - } + tgsi_exec_machine_bind_shader(machine, + var->tokens, + PIPE_MAX_SAMPLERS, + samplers); } diff --git a/src/gallium/drivers/softpipe/sp_quad_fs.c b/src/gallium/drivers/softpipe/sp_quad_fs.c index 892d9c6c11..f32fe5f406 100644 --- a/src/gallium/drivers/softpipe/sp_quad_fs.c +++ b/src/gallium/drivers/softpipe/sp_quad_fs.c @@ -148,13 +148,6 @@ shade_quads(struct quad_stage *qs, static void shade_begin(struct quad_stage *qs) { - struct softpipe_context *softpipe = qs->softpipe; - - softpipe->fs_variant->prepare( softpipe->fs_variant, - softpipe->fs_machine, - (struct tgsi_sampler **) - softpipe->tgsi.samplers_list[PIPE_SHADER_FRAGMENT] ); - qs->next->begin(qs->next); } diff --git a/src/gallium/drivers/softpipe/sp_state_derived.c b/src/gallium/drivers/softpipe/sp_state_derived.c index cb954a17ef..e4a5a63209 100644 --- a/src/gallium/drivers/softpipe/sp_state_derived.c +++ b/src/gallium/drivers/softpipe/sp_state_derived.c @@ -242,6 +242,12 @@ update_fragment_shader(struct softpipe_context *softpipe, unsigned prim) if (softpipe->fs) { softpipe->fs_variant = softpipe_find_fs_variant(softpipe, softpipe->fs, &key); + + /* prepare the TGSI interpreter for FS execution */ + softpipe->fs_variant->prepare(softpipe->fs_variant, + softpipe->fs_machine, + (struct tgsi_sampler **) softpipe-> + tgsi.samplers_list[PIPE_SHADER_FRAGMENT]); } else { softpipe->fs_variant = NULL; |