[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