Mesa (master): freedreno/ir3: fixes for indirect writes

Rob Clark robclark at kemper.freedesktop.org
Tue Jun 30 16:20:41 UTC 2015


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

Author: Rob Clark <robclark at freedesktop.org>
Date:   Fri Jun 26 10:52:34 2015 -0400

freedreno/ir3: fixes for indirect writes

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

---

 src/gallium/drivers/freedreno/ir3/ir3.c              |    1 -
 src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c |    9 ++++++++-
 src/gallium/drivers/freedreno/ir3/ir3_ra.c           |    6 ++++--
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3.c b/src/gallium/drivers/freedreno/ir3/ir3.c
index a166b67..6f6dad5 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3.c
@@ -669,7 +669,6 @@ struct ir3_instruction * ir3_instr_create(struct ir3_block *block,
 	return ir3_instr_create2(block, category, opc, 4);
 }
 
-/* only used by old compiler: */
 struct ir3_instruction * ir3_instr_clone(struct ir3_instruction *instr)
 {
 	struct ir3_instruction *new_instr = instr_create(instr->block,
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
index 53b8a6f..3b36114 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
@@ -1307,7 +1307,7 @@ emit_intrinisic_store_var(struct ir3_compile *ctx, nir_intrinsic_instr *intr)
 			 * store_output_indirect? or move this into
 			 * create_indirect_store()?
 			 */
-			for (int j = i; j < arr->length; j += 4) {
+			for (int j = i; j < arr->length; j += intr->num_components) {
 				struct ir3_instruction *split;
 
 				split = ir3_instr_create(ctx->block, -1, OPC_META_FO);
@@ -1318,6 +1318,13 @@ emit_intrinisic_store_var(struct ir3_compile *ctx, nir_intrinsic_instr *intr)
 				arr->arr[j] = split;
 			}
 		}
+		/* fixup fanout/split neighbors: */
+		for (int i = 0; i < arr->length; i++) {
+			arr->arr[i]->cp.right = (i < (arr->length - 1)) ?
+					arr->arr[i+1] : NULL;
+			arr->arr[i]->cp.left = (i > 0) ?
+					arr->arr[i-1] : NULL;
+		}
 		break;
 	}
 	default:
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_ra.c b/src/gallium/drivers/freedreno/ir3/ir3_ra.c
index e5aba85..0436e01 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_ra.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_ra.c
@@ -291,8 +291,6 @@ is_temp(struct ir3_register *reg)
 {
 	if (reg->flags & (IR3_REG_CONST | IR3_REG_IMMED))
 		return false;
-	if (reg->flags & IR3_REG_RELATIV) // TODO
-		return false;
 	if ((reg->num == regid(REG_A0, 0)) ||
 			(reg->num == regid(REG_P0, 0)))
 		return false;
@@ -312,6 +310,10 @@ static struct ir3_instruction *
 get_definer(struct ir3_instruction *instr, int *sz, int *off)
 {
 	struct ir3_instruction *d = NULL;
+
+	if (instr->fanin)
+		return get_definer(instr->fanin, sz, off);
+
 	if (is_meta(instr) && (instr->opc == OPC_META_FI)) {
 		/* What about the case where collect is subset of array, we
 		 * need to find the distance between where actual array starts




More information about the mesa-commit mailing list