diff --git a/src/compiler/nir/nir_format_convert.h b/src/compiler/nir/nir_format_convert.h index 265a86d6f6b..11765ae07d1 100644 --- a/src/compiler/nir/nir_format_convert.h +++ b/src/compiler/nir/nir_format_convert.h @@ -36,6 +36,15 @@ nir_shift_imm(nir_builder *b, nir_ssa_def *value, int left_shift) return value; } +static inline nir_ssa_def * +nir_shift(nir_builder *b, nir_ssa_def *value, nir_ssa_def *left_shift) +{ + return nir_bcsel(b, + nir_ige(b, left_shift, nir_imm_int(b, 0)), + nir_ishl(b, value, left_shift), + nir_ushr(b, value, nir_ineg(b, left_shift))); +} + static inline nir_ssa_def * nir_mask_shift(struct nir_builder *b, nir_ssa_def *src, uint32_t mask, int left_shift) @@ -144,6 +153,19 @@ nir_format_pack_uint_unmasked(nir_builder *b, nir_ssa_def *color, return packed; } +static inline nir_ssa_def * +nir_format_pack_uint_unmasked_ssa(nir_builder *b, nir_ssa_def *color, + nir_ssa_def *bits) +{ + nir_ssa_def *packed = nir_imm_int(b, 0); + nir_ssa_def *offset = nir_imm_int(b, 0); + for (unsigned i = 0; i < bits->num_components; i++) { + packed = nir_ior(b, packed, nir_ishl(b, nir_channel(b, color, i), offset)); + offset = nir_iadd(b, offset, nir_channel(b, bits, i)); + } + return packed; +} + static inline nir_ssa_def * nir_format_pack_uint(nir_builder *b, nir_ssa_def *color, const unsigned *bits, unsigned num_components)