Mesa (master): freedreno/ir3: legalize vs unused sam dst components

Rob Clark robclark at kemper.freedesktop.org
Thu Jan 8 00:38:21 UTC 2015


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

Author: Rob Clark <robclark at freedesktop.org>
Date:   Tue Jan  6 16:44:26 2015 -0500

freedreno/ir3: legalize vs unused sam dst components

We probably could be more clever elsewhere and mask out components that
are not used.  But either way, legalize should realize that there is
also a write-after-write hazard with texture sample instructions.

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

---

 src/gallium/drivers/freedreno/ir3/ir3_compiler.c |    3 ++-
 src/gallium/drivers/freedreno/ir3/ir3_legalize.c |    8 +++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
index 5cf8656..fe145d4 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
@@ -1374,12 +1374,13 @@ trans_samp(const struct instr_translater *t,
 
 	collect = ir3_instr_create(ctx->block, -1, OPC_META_FI);
 	ir3_reg_create(collect, 0, 0);
-	for (i = 0; i < 4; i++)
+	for (i = 0; i < 4; i++) {
 		if (tinf.src_wrmask & (1 << i))
 			ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
 					coord, src_swiz(coord, i));
 		else if (tinf.src_wrmask & ~((1 << i) - 1))
 			ir3_reg_create(collect, 0, 0);
+	}
 
 	/* Attach derivatives onto the end of the fan-in. Derivatives start after
 	 * the 4th argument, so make sure that fi is padded up to 4 first.
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_legalize.c b/src/gallium/drivers/freedreno/ir3/ir3_legalize.c
index 6194ded..2ef11f1 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_legalize.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_legalize.c
@@ -80,7 +80,13 @@ static void legalize(struct ir3_legalize_ctx *ctx)
 			ctx->max_bary = MAX2(ctx->max_bary, inloc->iim_val);
 		}
 
-		for (i = 1; i < n->regs_count; i++) {
+		/* NOTE: consider dst register too.. it could happen that
+		 * texture sample instruction (for example) writes some
+		 * components which are unused.  A subsequent instruction
+		 * that writes the same register can race w/ the sam instr
+		 * resulting in undefined results:
+		 */
+		for (i = 0; i < n->regs_count; i++) {
 			reg = n->regs[i];
 
 			if (reg_gpr(reg)) {




More information about the mesa-commit mailing list