freedreno/ir3: add no-copy-propagate fallback step
authorRob Clark <robclark@freedesktop.org>
Sat, 6 Sep 2014 16:45:17 +0000 (12:45 -0400)
committerRob Clark <robclark@freedesktop.org>
Tue, 9 Sep 2014 23:42:18 +0000 (19:42 -0400)
Most of the things the new compiler still has trouble with basically
amount to cp stage removing too many copies.  But without the cp stage,
the shaders the new compiler produces are still better (perf and
correctness) than the old compiler.  So a simple thing to do until I
have more time to work on it is first trying falling back to new
compiler without cp, before finally falling back to old compiler.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/ir3/ir3_compiler.c
src/gallium/drivers/freedreno/ir3/ir3_compiler.h
src/gallium/drivers/freedreno/ir3/ir3_shader.c

index aa3773e9e987a628040ff765edf85b54e0e3e706..affb775f75ba57667c2d555b9fb634b8173276b4 100644 (file)
@@ -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);
index 9b11b3d8abfc8813fd07d19368b4348ff578ce60..58532979af38af08b8902a8bf57315230c4d6768 100644 (file)
@@ -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);
index 4c06770d6274cc827b2e7a78d1f2226b33c4171b..a170469b573c67c2ab2d32079754248c5ad266ac 100644 (file)
@@ -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 */