On Wed, 2015-08-05 at 10:29 +0200, Iago Toral Quiroga wrote: > From: Francisco Jerez <curroje...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev