Iago Toral <ito...@igalia.com> writes: > 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?
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
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev