[Mesa-dev] [PATCH 03/10] i965/fs: Add vector float immediate infrastructure.

Matt Turner mattst88 at gmail.com
Fri Oct 24 11:17:27 PDT 2014


On Fri, Oct 24, 2014 at 11:12 AM, Matt Turner <mattst88 at gmail.com> wrote:
> On Fri, Oct 24, 2014 at 10:47 AM, Francisco Jerez <currojerez at riseup.net> 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)));

Another question, if I do this would you have me make
brw_float_to_vf() a static inline function so that the arguments can
be converted at compile time?


More information about the mesa-dev mailing list