diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2018-05-31 23:29:17 +0200 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2018-06-05 16:26:24 +0200 |
commit | 425762af1e339ce82ac8c17b065087264cc4d534 (patch) | |
tree | 5aa926f0c5d5db2554561c0f51643215fd6359d5 | |
parent | d42e120354e334028906c8c900ef9df202fa67cb (diff) | |
download | mesa-etnaviv-nir.tar.gz mesa-etnaviv-nir.tar.xz |
etnaviv: nir: globalize local registersetnaviv-nir
We represent allocated temporaries as NIR global registers. Turn local
registers left over by the nir_convert_from_ssa pass into global
registers with the correct temporary number.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_nir.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_nir.c b/src/gallium/drivers/etnaviv/etnaviv_nir.c index 36ec21fbd6..b50c9f16a4 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_nir.c @@ -920,6 +920,26 @@ etna_assign_registers(nir_shader *shader) ralloc_free(regs); } +/* Replace local registers created by the nir_convert_from_ssa pass to global + * registers, order them after the global registers created by register + * assignment. + */ +static void +etna_globalize_local_registers(nir_shader *shader) +{ + nir_foreach_function(function, shader) { + nir_foreach_register_safe(reg, &function->impl->registers) { + nir_register *global_reg = nir_global_reg_create(shader); + global_reg->num_components = reg->num_components; + nir_foreach_use_safe(src, reg) + nir_instr_rewrite_src(src->parent_instr, src, nir_src_for_reg(global_reg)); + nir_foreach_def_safe(dest, reg) + nir_instr_rewrite_dest(dest->reg.parent_instr, dest, nir_dest_for_reg(global_reg)); + nir_reg_remove(reg); + } + } +} + /* Uniforms cannot directly be used as output. Add a move to register for * uniforms that are used as output. */ static void @@ -1062,6 +1082,7 @@ etna_optimize_nir(struct etna_shader *shader, NIR_PASS_V(s, etna_fix_alu_uniform_src); NIR_PASS_V(s, etna_add_mov_for_uniform_output); NIR_PASS_V(s, etna_assign_registers); + NIR_PASS_V(s, etna_globalize_local_registers); NIR_PASS_V(s, etna_remove_io_intrinsics); NIR_PASS_V(s, nir_opt_dce); |