[Mesa-dev] [PATCH v4 (part2) 02/59] i965/vec4: Import helpers to convert vectors into arrays and back.

Francisco Jerez currojerez at riseup.net
Fri Aug 7 03:55:09 PDT 2015


Iago Toral <itoral at igalia.com> writes:

> On Wed, 2015-08-05 at 10:29 +0200, Iago Toral Quiroga wrote:
>> From: Francisco Jerez <currojerez at riseup.net>
>> 
>> These functions handle the conversion of a vec4 into the form expected
>> by the dataport unit in message and message return payloads.  The
>> conversion is not always trivial because some messages don't support
>> SIMD4x2 for some generations, in which case a strided copy may be
>> necessary.
>> 
>> v2: Split from the FS implementation.
>> v3: Rewrite to avoid evil array_reg, emit_collect and emit_zip.
>> ---
>>  src/mesa/drivers/dri/i965/Makefile.sources         |  2 +
>>  .../drivers/dri/i965/brw_vec4_surface_builder.cpp  | 98 ++++++++++++++++++++++
>>  .../drivers/dri/i965/brw_vec4_surface_builder.h    | 30 +++++++
>>  3 files changed, 130 insertions(+)
>>  create mode 100644 src/mesa/drivers/dri/i965/brw_vec4_surface_builder.cpp
>>  create mode 100644 src/mesa/drivers/dri/i965/brw_vec4_surface_builder.h
>> 
>> diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
>> index 88e64fb..049e293 100644
>> --- a/src/mesa/drivers/dri/i965/Makefile.sources
>> +++ b/src/mesa/drivers/dri/i965/Makefile.sources
>> @@ -129,6 +129,8 @@ i965_FILES = \
>>  	brw_vec4_nir.cpp \
>>  	brw_vec4_gs_nir.cpp \
>>  	brw_vec4_reg_allocate.cpp \
>> +	brw_vec4_surface_builder.cpp \
>> +	brw_vec4_surface_builder.h \
>>  	brw_vec4_visitor.cpp \
>>  	brw_vec4_vp.cpp \
>>  	brw_vec4_vs_visitor.cpp \
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_surface_builder.cpp b/src/mesa/drivers/dri/i965/brw_vec4_surface_builder.cpp
>> new file mode 100644
>> index 0000000..5ba1c6d
>> --- /dev/null
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4_surface_builder.cpp
>> @@ -0,0 +1,98 @@
>> +/*
>> + * Copyright © 2013-2015 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +#include "brw_vec4_surface_builder.h"
>> +
>> +using namespace brw;
>> +
>> +namespace {
>> +   namespace array_utils {
>> +      /**
>> +       * Copy one every \p src_stride logical components of the argument into
>> +       * one every \p dst_stride logical components of the result.
>> +       */
>> +      src_reg
>> +      emit_stride(const vec4_builder &bld, const src_reg &src, unsigned size,
>> +                  unsigned dst_stride, unsigned src_stride)
>> +      {
>> +         if (src_stride == 1 && dst_stride == 1) {
>> +            return src;
>> +         } else {
>> +            const dst_reg dst = bld.vgrf(src.type,
>> +                                         DIV_ROUND_UP(size * dst_stride, 4));
>> +
>> +            for (unsigned i = 0; i < size; ++i)
>> +               bld.MOV(writemask(offset(dst, i * dst_stride / 4),
>> +                                 1 << (i * dst_stride % 4)),
>> +                       swizzle(offset(src, i * src_stride / 4),
>> +                               brw_swizzle_for_mask(1 << (i * src_stride % 4))));
>> +
>> +            return src_reg(dst);
>> +         }
>> +      }
>> +
>> +      /**
>> +       * Convert a VEC4 into an array of registers with the layout expected by
>> +       * the recipient shared unit.  If \p has_simd4x2 is true the argument is
>> +       * left unmodified in SIMD4x2 form, otherwise it will be rearranged into
>> +       * a SIMD8 vector.
>> +       */
>> +      src_reg
>> +      emit_insert(const vec4_builder &bld, const src_reg &src,
>> +                  unsigned n, bool has_simd4x2)
>> +      {
>> +         if (src.file == BAD_FILE || n == 0) {
>> +            return src_reg();
>> +
>> +         } else {
>> +            /* Pad unused components with zeroes. */
>> +            const unsigned mask = (1 << n) - 1;
>> +            const dst_reg tmp = bld.vgrf(src.type);
>> +
>> +            bld.MOV(writemask(tmp, mask), src);
>> +            if (n < 4)
>> +               bld.MOV(writemask(tmp, ~mask), 0);
>> +
>> +            return emit_stride(bld, src, n, has_simd4x2 ? 1 : 4, 1);
>
> Curro: do we really need the padding here?

It's required at least on HSW for some surface ops, but I guess it
shouldn't hurt to do it elsewhere too. 

> In any case, I guess you meant to pass tmp and not src to emit_stride
> here, right?
>
Oops, yeah, sorry for that.

> Iago
>
>> +         }
>> +      }
>> +
>> +      /**
>> +       * Convert an array of registers back into a VEC4 according to the
>> +       * layout expected from some shared unit.  If \p has_simd4x2 is true the
>> +       * argument is left unmodified in SIMD4x2 form, otherwise it will be
>> +       * rearranged from SIMD8 form.
>> +       */
>> +      src_reg
>> +      emit_extract(const vec4_builder &bld, const src_reg src,
>> +                   unsigned n, bool has_simd4x2)
>> +      {
>> +         if (src.file == BAD_FILE || n == 0) {
>> +            return src_reg();
>> +
>> +         } else {
>> +            return emit_stride(bld, src, n, 1, has_simd4x2 ? 1 : 4);
>> +         }
>> +      }
>> +   }
>> +}
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_surface_builder.h b/src/mesa/drivers/dri/i965/brw_vec4_surface_builder.h
>> new file mode 100644
>> index 0000000..8a1a22e
>> --- /dev/null
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4_surface_builder.h
>> @@ -0,0 +1,30 @@
>> +/* -*- c++ -*- */
>> +/*
>> + * Copyright © 2013-2015 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +#ifndef BRW_VEC4_SURFACE_BUILDER_H
>> +#define BRW_VEC4_SURFACE_BUILDER_H
>> +
>> +#include "brw_vec4_builder.h"
>> +
>> +#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150807/59ba6eea/attachment-0001.sig>


More information about the mesa-dev mailing list