The texture instructions expect the source register to have the correct number of components. Since we only have vec4 hardware registers, rewrite the number of components to 4 and insert a mov instruction to a new vec4 SSA right before the texture load instruction.
TODO: To support destination registers with the correct num_components we have to add additional virtual scalar, vec2, and vec3 register classes that only allow to use the X, XY, and XYZ components. Signed-off-by: Philipp Zabel <[email protected]> Signed-off-by: Michael Tretter <[email protected]> --- src/gallium/drivers/etnaviv/etnaviv_nir.c | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/gallium/drivers/etnaviv/etnaviv_nir.c b/src/gallium/drivers/etnaviv/etnaviv_nir.c index 7889adf473ab..af1684ed9091 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_nir.c @@ -373,6 +373,32 @@ etna_lower_store_intrinsics(nir_shader *shader) } } +/* The hardware only has vec4 registers, so rewrite all texture load + * instructions to require vec4 sources. + */ +static void +etna_fixup_tex(nir_shader *shader) +{ + nir_foreach_function(function, shader) { + nir_metadata_require(function->impl, nir_metadata_live_ssa_defs); + nir_foreach_block(block, function->impl) { + nir_foreach_instr(instr, block) { + if (instr->type != nir_instr_type_tex) + continue; + + nir_tex_instr *tex = nir_instr_as_tex(instr); + + if (tex->src[0].src_type == nir_tex_src_coord) { + tex->coord_components = 4; + insert_mov(&tex->instr, &tex->src[0].src, shader); + } + } + } + nir_metadata_preserve(function->impl, + nir_metadata_block_index | nir_metadata_dominance); + } +} + /* Return the destination SSA if it should be replaced with a global register, * or NULL. */ @@ -957,6 +983,7 @@ etna_optimize_nir(struct etna_shader *shader, NIR_PASS_V(s, etna_lower_store_intrinsics); NIR_PASS_V(s, nir_convert_from_ssa, true); + NIR_PASS_V(s, etna_fixup_tex); NIR_PASS_V(s, etna_assign_registers); NIR_PASS_V(s, etna_remove_io_intrinsics); -- 2.17.1 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
