From 8555bffafdbcda9db0424d6ac2091fd3eac19bc5 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 26 Nov 2019 08:48:33 -0500 Subject: [PATCH] pan/midgard: Splatter on fragment out Make sure that the fragment is complete when writing it out. Signed-off-by: Alyssa Rosenzweig Signed-off-by: Tomeu Vizoso --- src/panfrost/midgard/midgard_compile.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 2d8145c2ec0..76f53fbabfc 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1590,7 +1590,26 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) case nir_intrinsic_store_raw_output_pan: assert (ctx->stage == MESA_SHADER_FRAGMENT); reg = nir_src_index(ctx, &instr->src[0]); - emit_fragment_store(ctx, reg, 0); + + if (ctx->quirks & MIDGARD_OLD_BLEND) { + /* Suppose reg = qr0.xyzw. That means 4 8-bit ---> 1 32-bit. So + * reg = r0.x. We want to splatter. So we can do a 32-bit move + * of: + * + * imov r0.xyzw, r0.xxxx + */ + + unsigned expanded = make_compiler_temp(ctx); + + midgard_instruction splatter = v_mov(reg, expanded); + + for (unsigned c = 0; c < 16; ++c) + splatter.swizzle[1][c] = 0; + + emit_mir_instruction(ctx, splatter); + emit_fragment_store(ctx, expanded, 0); + } else + emit_fragment_store(ctx, reg, 0); break; -- 2.30.2