diff options
author | Alyssa Rosenzweig <[email protected]> | 2019-08-27 12:20:06 -0700 |
---|---|---|
committer | Alyssa Rosenzweig <[email protected]> | 2019-08-30 15:50:24 -0700 |
commit | a8eafb0b74ace2564bb02c060529f2404bd67251 (patch) | |
tree | 605377d9151bb884888ecbd3f96914bbca939d6b /src/panfrost | |
parent | cfd5bd2c7d114dd29f5bebdd12362a416d4d3bde (diff) |
pan/midgard: Ensure fragment writeout is in the final block
This ensures the block only has exactly one branch, which makes
scheduling happy.
Signed-off-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src/panfrost')
-rw-r--r-- | src/panfrost/midgard/compiler.h | 5 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_compile.c | 10 |
2 files changed, 6 insertions, 9 deletions
diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index e6b90e4aa48..7747764791f 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -427,8 +427,9 @@ mir_exit_block(struct compiler_context *ctx) midgard_block *last = list_last_entry(&ctx->blocks, struct midgard_block, link); - /* The last block must be empty (the exit block) */ - assert(list_empty(&last->instructions)); + /* The last block must be empty logically but contains branch writeout + * for fragment shaders */ + assert(last->nr_successors == 0); return last; diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 04d149f2b60..eaa5816cc7e 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -2294,13 +2294,6 @@ emit_block(compiler_context *ctx, nir_block *block) midgard_opt_promote_fmov(ctx, ctx->current_block); embedded_to_inline_constant(ctx); - /* Append fragment shader epilogue (value writeout) */ - if (ctx->stage == MESA_SHADER_FRAGMENT) { - if (block == nir_impl_last_block(ctx->func->impl)) { - emit_fragment_epilogue(ctx); - } - } - /* Allow the next control flow to access us retroactively, for * branching etc */ ctx->current_block = this_block; @@ -2582,6 +2575,9 @@ midgard_compile_shader_nir(struct midgard_screen *screen, nir_shader *nir, midga struct midgard_block *end = emit_block(ctx, func->impl->end_block); + if (ctx->stage == MESA_SHADER_FRAGMENT) + emit_fragment_epilogue(ctx); + midgard_block_add_successor(semi_end, end); break; /* TODO: Multi-function shaders */ |