diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c index 0645fc41335..679265cb472 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c @@ -34,6 +34,7 @@ #include "etnaviv_nir.h" #include "etnaviv_uniforms.h" #include "etnaviv_util.h" +#include "nir.h" #include #include "util/u_memory.h" @@ -414,8 +415,8 @@ get_src(struct etna_compile *c, nir_src *src) static bool vec_dest_has_swizzle(nir_alu_instr *vec, nir_ssa_def *ssa) { - for (unsigned i = 0; i < 4; i++) { - if (!(vec->dest.write_mask & (1 << i)) || vec->src[i].src.ssa != ssa) + for (unsigned i = 0; i < nir_dest_num_components(vec->dest.dest); i++) { + if (vec->src[i].src.ssa != ssa) continue; if (vec->src[i].swizzle[0] != i) @@ -717,10 +718,7 @@ insert_vec_mov(nir_alu_instr *vec, unsigned start_idx, nir_shader *shader) unsigned num_components = 1; - for (unsigned i = start_idx + 1; i < 4; i++) { - if (!(vec->dest.write_mask & (1 << i))) - continue; - + for (unsigned i = start_idx + 1; i < nir_dest_num_components(vec->dest.dest); i++) { if (nir_srcs_equal(vec->src[i].src, vec->src[start_idx].src) && is_src_mod_neg(&vec->instr, i) == is_src_mod_neg(&vec->instr, start_idx) && is_src_mod_abs(&vec->instr, i) == is_src_mod_neg(&vec->instr, start_idx)) { @@ -897,10 +895,7 @@ lower_alu(struct etna_compile *c, nir_alu_instr *alu) } unsigned finished_write_mask = 0; - for (unsigned i = 0; i < 4; i++) { - if (!(alu->dest.write_mask & (1 << i))) - continue; - + for (unsigned i = 0; i < nir_dest_num_components(alu->dest.dest); i++) { nir_ssa_def *ssa = alu->src[i].src.ssa; /* check that vecN instruction is only user of this */ diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h index e5f9ed534cf..90925d3b73e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h @@ -181,10 +181,7 @@ update_swiz_mask(nir_alu_instr *alu, nir_dest *dest, unsigned *swiz, unsigned *m bool is_vec = dest != NULL; unsigned swizzle = 0, write_mask = 0; - for (unsigned i = 0; i < 4; i++) { - /* channel not written */ - if (!(alu->dest.write_mask & (1 << i))) - continue; + for (unsigned i = 0; i < nir_dest_num_components(alu->dest.dest); i++) { /* src is different (only check for vecN) */ if (is_vec && alu->src[i].src.ssa != &dest->ssa) continue;