i965/fs: Fix and document component().

This fixes a number of bugs of component() by reimplementing it in
terms of horiz_offset(): Handling of base registers starting at a
non-zero subreg_offset, handling of strided registers and overflow of
subreg_offset into reg_offset.

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Francisco Jerez 2016-05-11 12:54:26 -07:00 committed by Samuel Iglesias Gonsálvez
parent e209134f71
commit 71fd4942d1

View file

@ -128,11 +128,14 @@ horiz_offset(fs_reg reg, unsigned delta)
return reg; return reg;
} }
/**
* Get the scalar channel of \p reg given by \p idx and replicate it to all
* channels of the result.
*/
static inline fs_reg static inline fs_reg
component(fs_reg reg, unsigned idx) component(fs_reg reg, unsigned idx)
{ {
assert(reg.subreg_offset == 0); reg = horiz_offset(reg, idx);
reg.subreg_offset = idx * type_sz(reg.type);
reg.stride = 0; reg.stride = 0;
return reg; return reg;
} }