From b67a4ba4ad7ed70bbd9ff91cbf7a57e9bb7b77c8 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sat, 1 May 2021 11:45:28 -0400 Subject: [PATCH] nir/format_convert: add ssa version of uint packing Reviewed-by: Jason Ekstrand Part-of: --- src/compiler/nir/nir_format_convert.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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)