diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_compiler.c | 6 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_compiler.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_shader.c | 24 |
3 files changed, 21 insertions, 11 deletions
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c index aa3773e9e98..affb775f75b 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c @@ -2552,7 +2552,8 @@ compile_dump(struct ir3_compile_context *ctx) int ir3_compile_shader(struct ir3_shader_variant *so, - const struct tgsi_token *tokens, struct ir3_shader_key key) + const struct tgsi_token *tokens, struct ir3_shader_key key, + bool cp) { struct ir3_compile_context ctx; struct ir3_block *block; @@ -2631,7 +2632,8 @@ ir3_compile_shader(struct ir3_shader_variant *so, ir3_dump_instr_list(block->head); } - ir3_block_cp(block); + if (cp) + ir3_block_cp(block); if (fd_mesa_debug & FD_DBG_OPTDUMP) compile_dump(&ctx); diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.h b/src/gallium/drivers/freedreno/ir3/ir3_compiler.h index 9b11b3d8abf..58532979af3 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.h +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.h @@ -34,7 +34,7 @@ int ir3_compile_shader(struct ir3_shader_variant *so, const struct tgsi_token *tokens, - struct ir3_shader_key key); + struct ir3_shader_key key, bool cp); int ir3_compile_shader_old(struct ir3_shader_variant *so, const struct tgsi_token *tokens, struct ir3_shader_key key); diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c b/src/gallium/drivers/freedreno/ir3/ir3_shader.c index 4c06770d627..a170469b573 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c @@ -101,6 +101,17 @@ fixup_vp_regfootprint(struct ir3_shader_variant *v) } } +/* reset before attempting to compile again.. */ +static void reset_variant(struct ir3_shader_variant *v, const char *msg) +{ + debug_error(msg); + v->inputs_count = 0; + v->outputs_count = 0; + v->total_in = 0; + v->has_samp = false; + v->immediates_count = 0; +} + static struct ir3_shader_variant * create_variant(struct ir3_shader *shader, struct ir3_shader_key key) { @@ -122,15 +133,12 @@ create_variant(struct ir3_shader *shader, struct ir3_shader_key key) } if (!(fd_mesa_debug & FD_DBG_NOOPT)) { - ret = ir3_compile_shader(v, tokens, key); + ret = ir3_compile_shader(v, tokens, key, true); if (ret) { - debug_error("new compiler failed, trying fallback!"); - - v->inputs_count = 0; - v->outputs_count = 0; - v->total_in = 0; - v->has_samp = false; - v->immediates_count = 0; + reset_variant(v, "new compiler failed, trying without copy propagation!"); + ret = ir3_compile_shader(v, tokens, key, false); + if (ret) + reset_variant(v, "new compiler failed, trying fallback!"); } } else { ret = -1; /* force fallback to old compiler */ |