Mesa (master): r600g: Add pending output function

Dave Airlie airlied at kemper.freedesktop.org
Thu Feb 8 23:53:35 UTC 2018


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

Author: Glenn Kennard <glenn.kennard at gmail.com>
Date:   Sun Mar  5 18:26:50 2017 +0100

r600g: Add pending output function

Spills have to happen after the VLIW bundle currently
processed, so defer emitting the spill op.

Signed-off-by: Glenn Kennard <glenn.kennard at gmail.com>
Reviewed-by: Dave Airlie <airlied at redhat.com>

---

 src/gallium/drivers/r600/r600_asm.c | 18 ++++++++++++++++++
 src/gallium/drivers/r600/r600_asm.h |  4 ++++
 2 files changed, 22 insertions(+)

diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c
index 5b74be1748..7a4dddb7b6 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -231,6 +231,15 @@ int r600_bytecode_add_output(struct r600_bytecode *bc,
 	return 0;
 }
 
+int r600_bytecode_add_pending_output(struct r600_bytecode *bc,
+		const struct r600_bytecode_output *output)
+{
+	assert(bc->n_pending_outputs + 1 < ARRAY_SIZE(bc->pending_outputs));
+	bc->pending_outputs[bc->n_pending_outputs++] = *output;
+
+	return 0;
+}
+
 /* alu instructions that can ony exits once per group */
 static int is_alu_once_inst(struct r600_bytecode_alu *alu)
 {
@@ -1301,6 +1310,15 @@ int r600_bytecode_add_alu_type(struct r600_bytecode *bc,
 	if (nalu->dst.rel && bc->r6xx_nop_after_rel_dst)
 		insert_nop_r6xx(bc);
 
+	/* Might need to insert spill write ops after current clause */
+	if (nalu->last && bc->n_pending_outputs) {
+		while (bc->n_pending_outputs) {
+			r = r600_bytecode_add_output(bc, &bc->pending_outputs[--bc->n_pending_outputs]);
+			if (r)
+				return r;
+		}
+	}
+
 	return 0;
 }
 
diff --git a/src/gallium/drivers/r600/r600_asm.h b/src/gallium/drivers/r600/r600_asm.h
index b8abdf014d..93ac717fb8 100644
--- a/src/gallium/drivers/r600/r600_asm.h
+++ b/src/gallium/drivers/r600/r600_asm.h
@@ -274,6 +274,8 @@ struct r600_bytecode {
 	unsigned        index_reg[2]; /* indexing register CF_INDEX_[01] */
 	unsigned        debug_id;
 	struct r600_isa* isa;
+	struct r600_bytecode_output pending_outputs[5];
+	int n_pending_outputs;
 };
 
 /* eg_asm.c */
@@ -300,6 +302,8 @@ int r600_bytecode_add_gds(struct r600_bytecode *bc,
 		const struct r600_bytecode_gds *gds);
 int r600_bytecode_add_output(struct r600_bytecode *bc,
 		const struct r600_bytecode_output *output);
+int r600_bytecode_add_pending_output(struct r600_bytecode *bc,
+		const struct r600_bytecode_output *output);
 int r600_bytecode_build(struct r600_bytecode *bc);
 int r600_bytecode_add_cf(struct r600_bytecode *bc);
 int r600_bytecode_add_cfinst(struct r600_bytecode *bc,




More information about the mesa-commit mailing list