Samuel Iglesias Gonsálvez <sigles...@igalia.com> writes: > From: Connor Abbott <connor.w.abb...@intel.com> > > Similar to retype() and offset(). > --- > src/mesa/drivers/dri/i965/brw_ir_fs.h | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h > b/src/mesa/drivers/dri/i965/brw_ir_fs.h > index e4f20f4..abda2c3 100644 > --- a/src/mesa/drivers/dri/i965/brw_ir_fs.h > +++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h > @@ -78,6 +78,14 @@ retype(fs_reg reg, enum brw_reg_type type) > } > > static inline fs_reg > +stride(fs_reg reg, unsigned stride) > +{ > + if (reg.stride != 0) > + reg.stride = stride; > + return reg; > +} > +
This only works if reg.stride == 0 or 1, we need to honour the stride of the original register (e.g. by doing reg.stride *= stride) or you'll end up taking components not part of the region given as argument. It gets messy with ARF and HW registers because they represent the stride differently... I suggest that instead of fixing this you take the following patch from my SIMD32 branch that introduces a somewhat easier to use helper: Instead of doing 'stride(horiz_offset(retype(reg, t), i), type_sz(reg.type) / type_sz(t))' to take the i-th subcomponent of type t of the original register you would just do 'subscript(reg, t, i)'. I think I've looked through all the uses of stride() in your branch and they are all sort of an open-coded version of subscript(). This will also address the issue Ken pointed out in patch 29 related to the use of horiz_offset() on uniforms (or anything with stride other than one, really) -- See the attached patch (yes, correct ARF/HW reg handling will be required for SIMD32...). > +static inline fs_reg > byte_offset(fs_reg reg, unsigned delta) > { > switch (reg.file) { > -- > 2.5.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
From d949c68042ca59429067b87d2e1e1f95c558d10c Mon Sep 17 00:00:00 2001 From: Francisco Jerez <curroje...@riseup.net> Date: Mon, 2 May 2016 16:10:28 -0700 Subject: [PATCH] i965/fs: Introduce helper to extract a field from each channel of a register. --- src/mesa/drivers/dri/i965/brw_ir_fs.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h b/src/mesa/drivers/dri/i965/brw_ir_fs.h index e4f20f4..1649da3 100644 --- a/src/mesa/drivers/dri/i965/brw_ir_fs.h +++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h @@ -165,6 +165,34 @@ half(fs_reg reg, unsigned idx) return reg; } +/** + * Reinterpret each channel of register \p reg as a vector of values of the + * given smaller type and take the i-th subcomponent from each. + */ +static inline fs_reg +subscript(fs_reg reg, brw_reg_type type, unsigned i) +{ + assert((i + 1) * type_sz(type) <= type_sz(reg.type)); + + if (reg.file == ARF || reg.file == FIXED_GRF) { + /* The stride is encoded inconsistently for fixed GRF and ARF registers + * as the log2 of the actual vertical and horizontal strides. + */ + const int delta = _mesa_logbase2(type_sz(reg.type)) - + _mesa_logbase2(type_sz(type)); + reg.hstride += (reg.hstride ? delta : 0); + reg.vstride += (reg.vstride ? delta : 0); + + } else if (reg.file == IMM) { + assert(reg.type == type); + + } else { + reg.stride *= type_sz(reg.type) / type_sz(type); + } + + return byte_offset(retype(reg, type), i * type_sz(type)); +} + static const fs_reg reg_undef; class fs_inst : public backend_instruction { -- 2.7.3
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev