From: Jason Ekstrand Date: Mon, 13 Aug 2018 17:04:25 +0000 (-0500) Subject: nir/format_convert: Add vec mask and sign-extend helpers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7c5df52bdc5e673ed818c1a90ba7a28031f6b159;p=mesa.git nir/format_convert: Add vec mask and sign-extend helpers Reviewed-by: Kenneth Graunke --- diff --git a/src/compiler/nir/nir_format_convert.h b/src/compiler/nir/nir_format_convert.h index b1345f7263b..305273cdfdd 100644 --- a/src/compiler/nir/nir_format_convert.h +++ b/src/compiler/nir/nir_format_convert.h @@ -50,6 +50,32 @@ nir_mask_shift_or(struct nir_builder *b, nir_ssa_def *dst, nir_ssa_def *src, return nir_ior(b, nir_mask_shift(b, src, src_mask, src_left_shift), dst); } +static inline nir_ssa_def * +nir_format_mask_uvec(nir_builder *b, nir_ssa_def *src, + const unsigned *bits) +{ + nir_const_value mask; + for (unsigned i = 0; i < src->num_components; i++) { + assert(bits[i] < 32); + mask.u32[i] = (1u << bits[i]) - 1; + } + return nir_iand(b, src, nir_build_imm(b, src->num_components, 32, mask)); +} + +static inline nir_ssa_def * +nir_format_sign_extend_ivec(nir_builder *b, nir_ssa_def *src, + const unsigned *bits) +{ + assert(src->num_components <= 4); + nir_ssa_def *comps[4]; + for (unsigned i = 0; i < src->num_components; i++) { + nir_ssa_def *shift = nir_imm_int(b, src->bit_size - bits[i]); + comps[i] = nir_ishr(b, nir_ishl(b, nir_channel(b, src, i), shift), shift); + } + return nir_vec(b, comps, src->num_components); +} + + static inline nir_ssa_def * nir_format_unpack_int(nir_builder *b, nir_ssa_def *packed, const unsigned *bits, unsigned num_components, @@ -117,14 +143,7 @@ static inline nir_ssa_def * nir_format_pack_uint(nir_builder *b, nir_ssa_def *color, const unsigned *bits, unsigned num_components) { - nir_const_value mask; - for (unsigned i = 0; i < num_components; i++) { - assert(bits[i] < 32); - mask.u32[i] = (1u << bits[i]) - 1; - } - nir_ssa_def *mask_imm = nir_build_imm(b, num_components, 32, mask); - - return nir_format_pack_uint_unmasked(b, nir_iand(b, color, mask_imm), + return nir_format_pack_uint_unmasked(b, nir_format_mask_uvec(b, color, bits), bits, num_components); }