[Mesa-dev] [PATCH 4/9] i965: Factor out oword block read and write message control calculation.

Francisco Jerez currojerez at riseup.net
Mon Dec 12 01:44:03 UTC 2016


Kenneth Graunke <kenneth at whitecape.org> writes:

> On Friday, December 9, 2016 11:03:27 AM PST Francisco Jerez wrote:
>> We'll need roughly the same logic in other places and it would be
>> annoying to duplicate it.  Instead factor it out into a function-like
>> macro that takes the number of dwords per block (which will prove more
>> convenient than taking the same value in owords or some other unit).
>> ---
>>  src/mesa/drivers/dri/i965/brw_defines.h |  6 ++++++
>>  src/mesa/drivers/dri/i965/brw_eu_emit.c | 14 ++------------
>>  2 files changed, 8 insertions(+), 12 deletions(-)
>> 
>> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
>> index cae8e9a..1c638a0 100644
>> --- a/src/mesa/drivers/dri/i965/brw_defines.h
>> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
>> @@ -1669,6 +1669,12 @@ enum brw_message_target {
>>  #define BRW_DATAPORT_OWORD_BLOCK_2_OWORDS     2
>>  #define BRW_DATAPORT_OWORD_BLOCK_4_OWORDS     3
>>  #define BRW_DATAPORT_OWORD_BLOCK_8_OWORDS     4
>> +#define BRW_DATAPORT_OWORD_BLOCK_DWORDS(n)              \
>> +   ((n) == 4 ? BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW :    \
>> +    (n) == 8 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS :      \
>> +    (n) == 16 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS :     \
>> +    (n) == 32 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS :     \
>> +    (abort(), ~0))
>
> How about:
>
> #define BRW_DATAPORT_OWORD_BLOCK_DWORDS(n) \
>    (assert(n == 4 || n == 8 || n == 16 || n == 32), ffs(n) - 3)
>

I don't think that would work for n > 4 due to the rather unfortunate
hardware encoding, e.g. BRW_DATAPORT_OWORD_BLOCK_2_OWORDS is supposed to
be encoded as 2 but your macro would give 1 as result. :|

>>  
>>  #define BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD     0
>>  #define BRW_DATAPORT_OWORD_DUAL_BLOCK_4OWORDS    2
>> diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
>> index 341f543..6141bfb 100644
>> --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
>> +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
>> @@ -2056,11 +2056,6 @@ void brw_oword_block_write_scratch(struct brw_codegen *p,
>>     mrf = retype(mrf, BRW_REGISTER_TYPE_UD);
>>  
>>     const unsigned mlen = 1 + num_regs;
>> -   const unsigned msg_control =
>> -      (num_regs == 1 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS :
>> -       num_regs == 2 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS :
>> -       num_regs == 4 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS : 0);
>> -   assert(msg_control);
>>  
>>     /* Set up the message header.  This is g0, with g0.2 filled with
>>      * the offset.  We don't want to leave our offset around in g0 or
>> @@ -2134,7 +2129,7 @@ void brw_oword_block_write_scratch(struct brw_codegen *p,
>>        brw_set_dp_write_message(p,
>>  			       insn,
>>                                 brw_scratch_surface_idx(p),
>> -			       msg_control,
>> +			       BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8),
>>  			       msg_type,
>>                                 target_cache,
>>  			       mlen,
>> @@ -2181,11 +2176,6 @@ brw_oword_block_read_scratch(struct brw_codegen *p,
>>     dest = retype(dest, BRW_REGISTER_TYPE_UW);
>>  
>>     const unsigned rlen = num_regs;
>> -   const unsigned msg_control =
>> -      (num_regs == 1 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS :
>> -       num_regs == 2 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS :
>> -       num_regs == 4 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS : 0);
>> -   assert(msg_control);
>>     const unsigned target_cache =
>>        (devinfo->gen >= 7 ? GEN7_SFID_DATAPORT_DATA_CACHE :
>>         devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_RENDER_CACHE :
>> @@ -2222,7 +2212,7 @@ brw_oword_block_read_scratch(struct brw_codegen *p,
>>        brw_set_dp_read_message(p,
>>  			      insn,
>>                                brw_scratch_surface_idx(p),
>> -			      msg_control,
>> +			      BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8),
>>  			      BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* msg_type */
>>  			      target_cache,
>>  			      1, /* msg_length */
>> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161211/5fe30c79/attachment.sig>


More information about the mesa-dev mailing list