[Mesa-dev] [PATCH 03/10] i965/fs: Add vector float immediate infrastructure.
Kenneth Graunke
kenneth at whitecape.org
Fri Oct 24 11:13:09 PDT 2014
On Friday, October 24, 2014 08:47:03 PM Francisco Jerez wrote:
> Matt Turner <mattst88 at gmail.com> writes:
>
> > On Fri, Oct 24, 2014 at 1:34 AM, Francisco Jerez <currojerez at riseup.net>
wrote:
> >> Matt Turner <mattst88 at gmail.com> writes:
> >>
> >>> ---
> >>> src/mesa/drivers/dri/i965/brw_fs.cpp | 20
++++++++++++++++++++
> >>> src/mesa/drivers/dri/i965/brw_fs.h | 1 +
> >>> src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 3 +++
> >>> 3 files changed, 24 insertions(+)
> >>>
> >>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
b/src/mesa/drivers/dri/i965/brw_fs.cpp
> >>> index 983e8db..ffe0a5b 100644
> >>> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> >>> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> >>> @@ -44,6 +44,7 @@ extern "C" {
> >>> #include "brw_context.h"
> >>> #include "brw_eu.h"
> >>> #include "brw_wm.h"
> >>> +#include "brw_packed_float.h"
> >>> }
> >>> #include "brw_fs.h"
> >>> #include "brw_cfg.h"
> >>> @@ -581,6 +582,18 @@ fs_reg::fs_reg(uint32_t u)
> >>> this->width = 1;
> >>> }
> >>>
> >>> +/** Vector float immediate value constructor. */
> >>> +fs_reg::fs_reg(uint8_t vf[4])
> >>> +{
> >>> + init();
> >>> + this->file = IMM;
> >>> + this->type = BRW_REGISTER_TYPE_VF;
> >>> + this->fixed_hw_reg.dw1.ud = (vf[0] << 0) |
> >>> + (vf[1] << 8) |
> >>> + (vf[2] << 16) |
> >>> + (vf[3] << 24);
> >>> +}
> >>> +
> >>
> >> IMHO it would be a lot more convenient to have this function take four
> >> float arguments and carry out the conversion to 8-bit here. I suspect
> >> that in most cases the arguments of this constructor (and the same goes
> >> for src_reg) will be known at compile time so we could just add an
> >> assertion to check that the conversion was carried out exactly.
> >
> > That would work if we're constructing VF immediates from known good
> > values, but in cases like in an optimization, you're always going to
> > have to check whether the values are representable in VF. If they're
> > not, the pass will have to fail.
> >
>
> Yeah, but isn't this interface unnecessarily annoying to use in the
> cases that fit the "known good values" category? (all uses in your
> series and in my previous code that makes use of VF) -- It led you write
> code like this:
>
> | + uint8_t vf[4] = {0x0, 0x60, 0x70, 0x78};
> |[...]
> | + emit(MOV(shift, src_reg(vf)));
>
> ...which is pretty hard to decode. Don't you find this much easier to
> understand? (even if it means we may have to introduce a second
> constructor at some point in the future)
>
> | emit(MOV(shift, src_reg(0, 8, 16, 24)));
It might not be a bad idea to have both. I agree with Curro - being able to
say src_reg(0, 8, 16, 24) is nice and easy to read. But being able to pass in
pre-converted values is not a bad idea either, and makes Matt's case work.
--Ken
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141024/094c5ba5/attachment-0001.sig>
More information about the mesa-dev
mailing list