diff options
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_compiler.c | 3 | ||||
-rw-r--r-- | 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 5cf8656a9e7..fe145d4ed1c 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 6194deda846..2ef11f183d7 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)) { |