[Mesa-dev] [PATCH v2 12/18] nir/lower_64bit_packing: extend the pass to handle packing from / to 16-bit.

Jason Ekstrand jason at jlekstrand.net
Mon Apr 30 21:50:02 UTC 2018


On Mon, Apr 30, 2018 at 7:18 AM, Iago Toral Quiroga <itoral at igalia.com>
wrote:

> With 16-bit support we can now do 32-bit packing, a follow-up patch will
> rename the pass to something more generic.
> ---
>  src/compiler/nir/nir_lower_64bit_packing.c | 64
> +++++++++++++++++++++++++++---
>  1 file changed, 59 insertions(+), 5 deletions(-)
>
> diff --git a/src/compiler/nir/nir_lower_64bit_packing.c
> b/src/compiler/nir/nir_lower_64bit_packing.c
> index abae173ce3..dd435490e3 100644
> --- a/src/compiler/nir/nir_lower_64bit_packing.c
> +++ b/src/compiler/nir/nir_lower_64bit_packing.c
> @@ -35,19 +35,57 @@
>   */
>
>  static nir_ssa_def *
> -lower_pack_64(nir_builder *b, nir_ssa_def *src)
> +lower_pack_64_from_32(nir_builder *b, nir_ssa_def *src)
>  {
>     return nir_pack_64_2x32_split(b, nir_channel(b, src, 0),
>                                      nir_channel(b, src, 1));
>  }
>
>  static nir_ssa_def *
> -lower_unpack_64(nir_builder *b, nir_ssa_def *src)
> +lower_unpack_64_to_32(nir_builder *b, nir_ssa_def *src)
>  {
>     return nir_vec2(b, nir_unpack_64_2x32_split_x(b, src),
>                        nir_unpack_64_2x32_split_y(b, src));
>  }
>
> +static nir_ssa_def *
> +lower_pack_32_from_16(nir_builder *b, nir_ssa_def *src)
> +{
> +   return nir_pack_32_2x16_split(b, nir_channel(b, src, 0),
> +                                    nir_channel(b, src, 1));
> +}
> +
> +static nir_ssa_def *
> +lower_unpack_32_to_16(nir_builder *b, nir_ssa_def *src)
> +{
> +   return nir_vec2(b, nir_unpack_32_2x16_split_x(b, src),
> +                      nir_unpack_32_2x16_split_y(b, src));
> +}
>

I guess this isn't really lower_64bit_packing anymore. :-)  We may want to
consider re-naming this pass at some point.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>


> +
> +static nir_ssa_def *
> +lower_pack_64_from_16(nir_builder *b, nir_ssa_def *src)
> +{
> +   nir_ssa_def *xy = nir_pack_32_2x16_split(b, nir_channel(b, src, 0),
> +                                               nir_channel(b, src, 1));
> +
> +   nir_ssa_def *zw = nir_pack_32_2x16_split(b, nir_channel(b, src, 2),
> +                                               nir_channel(b, src, 3));
> +
> +   return nir_pack_64_2x32_split(b, xy, zw);
> +}
> +
> +static nir_ssa_def *
> +lower_unpack_64_to_16(nir_builder *b, nir_ssa_def *src)
> +{
> +   nir_ssa_def *xy = nir_unpack_64_2x32_split_x(b, src);
> +   nir_ssa_def *zw = nir_unpack_64_2x32_split_y(b, src);
> +
> +   return nir_vec4(b, nir_unpack_32_2x16_split_x(b, xy),
> +                      nir_unpack_32_2x16_split_y(b, xy),
> +                      nir_unpack_32_2x16_split_x(b, zw),
> +                      nir_unpack_32_2x16_split_y(b, zw));
> +}
> +
>  static bool
>  lower_64bit_pack_impl(nir_function_impl *impl)
>  {
> @@ -63,7 +101,11 @@ lower_64bit_pack_impl(nir_function_impl *impl)
>           nir_alu_instr *alu_instr = (nir_alu_instr *) instr;
>
>           if (alu_instr->op != nir_op_pack_64_2x32 &&
> -             alu_instr->op != nir_op_unpack_64_2x32)
> +             alu_instr->op != nir_op_unpack_64_2x32 &&
> +             alu_instr->op != nir_op_pack_64_4x16 &&
> +             alu_instr->op != nir_op_unpack_64_4x16 &&
> +             alu_instr->op != nir_op_pack_32_2x16 &&
> +             alu_instr->op != nir_op_unpack_32_2x16)
>              continue;
>
>           b.cursor = nir_before_instr(&alu_instr->instr);
> @@ -73,10 +115,22 @@ lower_64bit_pack_impl(nir_function_impl *impl)
>
>           switch (alu_instr->op) {
>           case nir_op_pack_64_2x32:
> -            dest = lower_pack_64(&b, src);
> +            dest = lower_pack_64_from_32(&b, src);
>              break;
>           case nir_op_unpack_64_2x32:
> -            dest = lower_unpack_64(&b, src);
> +            dest = lower_unpack_64_to_32(&b, src);
> +            break;
> +         case nir_op_pack_64_4x16:
> +            dest = lower_pack_64_from_16(&b, src);
> +            break;
> +         case nir_op_unpack_64_4x16:
> +            dest = lower_unpack_64_to_16(&b, src);
> +            break;
> +         case nir_op_pack_32_2x16:
> +            dest = lower_pack_32_from_16(&b, src);
> +            break;
> +         case nir_op_unpack_32_2x16:
> +            dest = lower_unpack_32_to_16(&b, src);
>              break;
>           default:
>              unreachable("Impossible opcode");
> --
> 2.14.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180430/2d344caf/attachment.html>


More information about the mesa-dev mailing list