diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 8 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_shader.c | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_tcl.c | 1 | 
4 files changed, 14 insertions, 2 deletions
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index d1cf75032c..a9dd041e08 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -158,6 +158,10 @@ struct r3xx_fragment_shader {      /* Pixel stack size */      int stack_size; + +    /* Are there immediates in this shader? +     * If not, we can heavily optimize recompilation. */ +    boolean uses_imms;  };  struct r300_fragment_shader { @@ -248,6 +252,10 @@ struct r300_vertex_shader {      /* Has this shader been translated yet? */      boolean translated; +    /* Are there immediates in this shader? +     * If not, we can heavily optimize recompilation. */ +    boolean uses_imms; +      /* Number of used instructions */      int instruction_count; diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 4e65fbbabe..0461ffd681 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -151,10 +151,12 @@ static void      /* If the number of constants have changed, invalidate the shader. */      if (r300->shader_constants[shader].user_count != i) { -        if (shader == PIPE_SHADER_FRAGMENT && r300->fs) { +        if (shader == PIPE_SHADER_FRAGMENT && r300->fs && +                r300->fs->uses_imms) {              r300->fs->translated = FALSE;              r300_translate_fragment_shader(r300, r300->fs); -        } else if (shader == PIPE_SHADER_VERTEX && r300->vs) { +        } else if (shader == PIPE_SHADER_VERTEX && r300->vs && +                r300->vs->uses_imms) {              r300->vs->translated = FALSE;              r300_translate_vertex_shader(r300, r300->vs);          } diff --git a/src/gallium/drivers/r300/r300_state_shader.c b/src/gallium/drivers/r300/r300_state_shader.c index a56b507eef..f27d7233d8 100644 --- a/src/gallium/drivers/r300/r300_state_shader.c +++ b/src/gallium/drivers/r300/r300_state_shader.c @@ -652,6 +652,7 @@ void r300_translate_fragment_shader(struct r300_context* r300,              assembler->tex_count + assembler->color_count);      consts->count = consts->user_count + assembler->imm_count; +    fs->uses_imms = assembler->imm_count;      debug_printf("r300: fs: %d total constants, "              "%d from user and %d from immediates\n", consts->count,              consts->user_count, assembler->imm_count); diff --git a/src/gallium/drivers/r300/r300_state_tcl.c b/src/gallium/drivers/r300/r300_state_tcl.c index fdbcbf3db8..32e61bc1d7 100644 --- a/src/gallium/drivers/r300/r300_state_tcl.c +++ b/src/gallium/drivers/r300/r300_state_tcl.c @@ -386,6 +386,7 @@ void r300_translate_vertex_shader(struct r300_context* r300,              assembler->tex_count + assembler->color_count);      consts->count = consts->user_count + assembler->imm_count; +    vs->uses_imms = assembler->imm_count;      debug_printf("r300: vs: %d total constants, "              "%d from user and %d from immediates\n", consts->count,              consts->user_count, assembler->imm_count);  | 
