return nir_swizzle(b, def, swizzle, 1, false);
}
+static inline nir_ssa_def *
+nir_channels(nir_builder *b, nir_ssa_def *def, unsigned mask)
+{
+ unsigned num_channels = 0, swizzle[4] = { 0, 0, 0, 0 };
+
+ for (unsigned i = 0; i < 4; i++) {
+ if ((mask & (1 << i)) == 0)
+ continue;
+ swizzle[num_channels++] = i;
+ }
+
+ return nir_swizzle(b, def, swizzle, num_channels, false);
+}
+
/**
* Turns a nir_src into a nir_ssa_def * so it can be passed to
* nir_build_alu()-based builder calls.
discard->src[0] = nir_src_for_ssa(oob);
nir_builder_instr_insert(&b, &discard->instr);
- unsigned swiz[4] = { 0, 1, 0, 0 };
- nir_ssa_def *tex_off =
- nir_swizzle(&b, nir_load_var(&b, tex_off_in), swiz, 2, false);
+ nir_ssa_def *tex_off = nir_channels(&b, nir_load_var(&b, tex_off_in), 0x3);
nir_ssa_def *tex_pos = nir_iadd(&b, nir_vec2(&b, x_W, y_W), tex_off);
nir_ssa_def *tex_pitch = nir_channel(&b, nir_load_var(&b, tex_off_in), 2);