[Mesa-dev] [PATCH 11/57] i965/vec4: Replace vec4_instruction::regs_read with ::size_read using byte units.

Francisco Jerez currojerez at riseup.net
Fri Sep 9 01:51:04 UTC 2016


Iago Toral <itoral at igalia.com> writes:

> On Wed, 2016-09-07 at 18:48 -0700, Francisco Jerez wrote:
>> The previous regs_read value can be recovered by rewriting each
>> reference of regs_read() like 'x = i.regs_read(j)' to 'x =
>> DIV_ROUND_UP(i.size_read(j), reg_unit)'.
>> 
>> For the same reason as in the previous patches, this doesn't attempt
>> to be particularly clever about simplifying the result in the
>> interest
>> of keeping the rather lengthy patch as obvious as possible.  I'll
>> come
>> back later to clean up any ugliness introduced here.
>> ---
>>  src/mesa/drivers/dri/i965/brw_ir_vec4.h            |  6 +++--
>>  src/mesa/drivers/dri/i965/brw_vec4.cpp             | 30
>> ++++++++++++++--------
>>  .../drivers/dri/i965/brw_vec4_copy_propagation.cpp |  2 +-
>>  3 files changed, 25 insertions(+), 13 deletions(-)
>> 
>> diff --git a/src/mesa/drivers/dri/i965/brw_ir_vec4.h
>> b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
>> index 5a79062..2fd5441 100644
>> --- a/src/mesa/drivers/dri/i965/brw_ir_vec4.h
>> +++ b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
>> @@ -167,7 +167,7 @@ public:
>>     unsigned sol_vertex; /**< gen6: used for setting dst index in SVB
>> header */
>>  
>>     bool is_send_from_grf();
>> -   unsigned regs_read(unsigned arg) const;
>> +   unsigned size_read(unsigned arg) const;
>>     bool can_reswizzle(const struct gen_device_info *devinfo, int
>> dst_writemask,
>>                        int swizzle, int swizzle_mask);
>>     void reswizzle(int dst_writemask, int swizzle);
>> @@ -278,7 +278,9 @@ inline unsigned
>>  regs_read(const vec4_instruction *inst, unsigned i)
>>  {
>>     /* XXX - Take into account register-misaligned offsets correctly.
>> */
>> -   return inst->regs_read(i);
>> +   const unsigned reg_size =
>> +      inst->src[i].file == UNIFORM || inst->src[i].file == IMM ? 16
>> : REG_SIZE;
>> +   return DIV_ROUND_UP(inst->size_read(i), reg_size);
>>  }
>>  
>>  } /* namespace brw */
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> b/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> index bdd6e59..561170c 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> @@ -199,11 +199,8 @@
>> vec4_instruction::has_source_and_destination_hazard() const
>>  }
>>  
>>  unsigned
>> -vec4_instruction::regs_read(unsigned arg) const
>> +vec4_instruction::size_read(unsigned arg) const
>>  {
>> -   if (src[arg].file == BAD_FILE)
>> -      return 0;
>> -
>>     switch (opcode) {
>>     case SHADER_OPCODE_SHADER_TIME_ADD:
>>     case SHADER_OPCODE_UNTYPED_ATOMIC:
>> @@ -213,13 +210,26 @@ vec4_instruction::regs_read(unsigned arg) const
>>     case SHADER_OPCODE_TYPED_SURFACE_READ:
>>     case SHADER_OPCODE_TYPED_SURFACE_WRITE:
>>     case TCS_OPCODE_URB_WRITE:
>> -      return arg == 0 ? mlen : 1;
>> -
>> +      if (arg == 0)
>> +         return mlen * REG_SIZE;
>> +      break;
>>     case VS_OPCODE_PULL_CONSTANT_LOAD_GEN7:
>> -      return arg == 1 ? mlen : 1;
>> +      if (arg == 1)
>> +         return mlen * REG_SIZE;
>> +      break;
>> +   default:
>> +      break;
>> +   }
>>  
>> +   switch (src[arg].file) {
>> +   case BAD_FILE:
>> +      return 0;
>> +   case IMM:
>> +   case UNIFORM:
>> +      return 4 * type_sz(src[arg].type);
>>     default:
>> -      return 1;
>> +      /* XXX - Represent actual execution size and vertical stride.
>> */
>> +      return 8 * type_sz(src[arg].type);
>>     }
>>  }
>>  
>> @@ -1188,7 +1198,7 @@ vec4_visitor::opt_register_coalesce()
>>  	 bool interfered = false;
>>  	 for (int i = 0; i < 3; i++) {
>>              if (inst->src[0].in_range(scan_inst->src[i],
>> -                                      scan_inst->regs_read(i)))
>> +                                      DIV_ROUND_UP(scan_inst-
>> >size_read(i), REG_SIZE)))
>
> Why not just swap scan_inst->regs_read(i) with regs_read(scan_inst, i)
> instead?
>
>>  	       interfered = true;
>>  	 }
>>  	 if (interfered)
>> @@ -1214,7 +1224,7 @@ vec4_visitor::opt_register_coalesce()
>>           } else {
>>              for (int i = 0; i < 3; i++) {
>>                 if (inst->dst.in_range(scan_inst->src[i],
>> -                                      scan_inst->regs_read(i)))
>> +                                      DIV_ROUND_UP(scan_inst-
>> >size_read(i), REG_SIZE)))
>
> Same here.
>

These two are removed later on when backend_reg::in_range goes away in
PATCH 27, so the DIV_ROUND_UP() call also goes away and size_read() ends
up being exactly what we want.

>>                    interfered = true;
>>              }
>>              if (interfered)
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> index f98c7ac..777d252 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
>> @@ -437,7 +437,7 @@ vec4_visitor::opt_copy_propagation(bool
>> do_constant_prop)
>>  	    continue;
>>  
>>           /* We only handle single-register copies. */
>> -         if (inst->regs_read(i) != 1)
>> +         if (inst->size_read(i) != REG_SIZE)
>>              continue;
>>  
>>           const unsigned reg = (alloc.offsets[inst->src[i].nr] +
-------------- 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/20160908/dc527cfd/attachment-0001.sig>


More information about the mesa-dev mailing list