The Vivante instruction set does not allow empty shaders. If the shader is empty, add a nop to allow execution.
Signed-off-by: Philipp Zabel <p.za...@pengutronix.de> Signed-off-by: Michael Tretter <m.tret...@pengutronix.de> --- src/gallium/drivers/etnaviv/etnaviv_nir.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/gallium/drivers/etnaviv/etnaviv_nir.c b/src/gallium/drivers/etnaviv/etnaviv_nir.c index 752e87248e31..1a71459c3a20 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_nir.c @@ -888,6 +888,21 @@ etna_remove_io_intrinsics(nir_shader *shader) } } +static void +etna_add_nop_if_empty(nir_shader *shader) +{ + /* TODO: add nop label if needed as jump target at the end of a function */ + nir_foreach_function(function, shader) { + if (nir_index_instrs(function->impl) == 0) { + nir_intrinsic_instr *nop; + + nop = nir_intrinsic_instr_create(shader, nir_intrinsic_nop); + nir_instr_insert_after_block(nir_start_block(function->impl), + &nop->instr); + } + } +} + struct nir_shader * etna_optimize_nir(struct etna_shader *shader, struct nir_shader *s, @@ -912,6 +927,7 @@ etna_optimize_nir(struct etna_shader *shader, NIR_PASS_V(s, etna_remove_io_intrinsics); NIR_PASS_V(s, nir_opt_dce); + NIR_PASS_V(s, etna_add_nop_if_empty); /* Do this after register assignment to avoid creating temporary registers * that cause suboptimal register assignment. -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev