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

Iago Toral itoral at igalia.com
Fri Aug 7 03:22:25 PDT 2015


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? In any case, I guess you
meant to pass tmp and not src to emit_stride here, right?

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




More information about the mesa-dev mailing list