Mesa (master): freedreno/ir3: fix register usage calculations

Rob Clark robclark at kemper.freedesktop.org
Sun Mar 8 21:57:11 UTC 2015


Module: Mesa
Branch: master
Commit: 26b79ac3e40624726bff5101dfe892d3ee2ba607
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=26b79ac3e40624726bff5101dfe892d3ee2ba607

Author: Rob Clark <robclark at freedesktop.org>
Date:   Sun Feb  1 13:04:09 2015 -0500

freedreno/ir3: fix register usage calculations

For cat1 instructions, use reg() as well for relative src, to ensure
proper accounting of register usage.  Also, for relative instructions,
use reg->size rather than reg->wrmask to determine the number of
components read/written.

Signed-off-by: Rob Clark <robclark at freedesktop.org>

---

 src/gallium/drivers/freedreno/ir3/ir3.c |   21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3.c b/src/gallium/drivers/freedreno/ir3/ir3.c
index fe0ffc9..01cdd8a 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3.c
@@ -105,11 +105,18 @@ static uint32_t reg(struct ir3_register *reg, struct ir3_info *info,
 	if (reg->flags & IR3_REG_IMMED) {
 		val.iim_val = reg->iim_val;
 	} else {
-		int8_t components = util_last_bit(reg->wrmask);
-		int16_t max = (reg->num + repeat + components - 1) >> 2;
+		unsigned components;
 
-		val.comp = reg->num & 0x3;
-		val.num  = reg->num >> 2;
+		if (reg->flags & IR3_REG_RELATIV) {
+			components = reg->size;
+			val.dummy10 = reg->offset;
+		} else {
+			components = util_last_bit(reg->wrmask);
+			val.comp = reg->num & 0x3;
+			val.num  = reg->num >> 2;
+		}
+
+		int16_t max = (reg->num + repeat + components - 1) >> 2;
 
 		if (reg->flags & IR3_REG_CONST) {
 			info->max_const = MAX2(info->max_const, max);
@@ -166,13 +173,13 @@ static int emit_cat1(struct ir3_instruction *instr, void *ptr,
 		cat1->iim_val = src->iim_val;
 		cat1->src_im  = 1;
 	} else if (src->flags & IR3_REG_RELATIV) {
-		cat1->off       = src->offset;
+		cat1->off       = reg(src, info, instr->repeat,
+				IR3_REG_R | IR3_REG_CONST | IR3_REG_HALF | IR3_REG_RELATIV);
 		cat1->src_rel   = 1;
 		cat1->src_rel_c = !!(src->flags & IR3_REG_CONST);
 	} else {
 		cat1->src  = reg(src, info, instr->repeat,
-				IR3_REG_IMMED | IR3_REG_R |
-				IR3_REG_CONST | IR3_REG_HALF);
+				IR3_REG_R | IR3_REG_CONST | IR3_REG_HALF);
 		cat1->src_c     = !!(src->flags & IR3_REG_CONST);
 	}
 




More information about the mesa-commit mailing list