i965/vec4: Take into account misalignment in regs_written() and regs_read().
authorFrancisco Jerez <currojerez@riseup.net>
Sat, 3 Sep 2016 00:57:34 +0000 (17:57 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 14 Sep 2016 21:50:54 +0000 (14:50 -0700)
Unlike the FS counterpart of this commit this was likely not (yet) a
bug, but let's fix it already in preparation for implementing support
for sub-GRF offsets in the VEC4 back-end.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/mesa/drivers/dri/i965/brw_ir_vec4.h

index 2fd5441167af84dee8a7493cac543ad35b2fae43..9910d87d61e78eb2515a088f5485fa3c5731a54a 100644 (file)
@@ -263,9 +263,10 @@ set_saturate(bool saturate, vec4_instruction *inst)
 inline unsigned
 regs_written(const vec4_instruction *inst)
 {
-   /* XXX - Take into account register-misaligned offsets correctly. */
+   /* XXX - Use reg_offset() as promised by the comment above. */
    assert(inst->dst.file != UNIFORM && inst->dst.file != IMM);
-   return DIV_ROUND_UP(inst->size_written, REG_SIZE);
+   return DIV_ROUND_UP(inst->dst.offset % REG_SIZE + inst->size_written,
+                       REG_SIZE);
 }
 
 /**
@@ -277,10 +278,11 @@ regs_written(const vec4_instruction *inst)
 inline unsigned
 regs_read(const vec4_instruction *inst, unsigned i)
 {
-   /* XXX - Take into account register-misaligned offsets correctly. */
+   /* XXX - Use reg_offset() as promised by the comment above. */
    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);
+   return DIV_ROUND_UP(inst->src[i].offset % reg_size + inst->size_read(i),
+                       reg_size);
 }
 
 } /* namespace brw */