From a6f1500bedd2ceaacdc95c7e7b04fc9b4d32f7f5 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 7 Jan 2021 09:28:11 -0500 Subject: [PATCH] pan/bi: Workaround BLEND precolour with explicit moves Signed-off-by: Alyssa Rosenzweig Reviewed-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bifrost_compile.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 17fd7f8d78d..cbb3bcdffa2 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -388,9 +388,21 @@ bi_emit_fragment_out(bi_builder *b, nir_intrinsic_instr *instr) unsigned rt = loc == FRAG_RESULT_COLOR ? 0 : (loc - FRAG_RESULT_DATA0); + bi_index color = bi_src_index(&instr->src[0]); - bi_emit_blend_op(b, bi_src_index(&instr->src[0]), - nir_intrinsic_src_type(instr), rt); + /* Explicit copy since BLEND inputs are precoloured to R0-R3, + * TODO: maybe schedule around this or implement in RA as a + * spill */ + if (rt > 0) { + bi_index srcs[4] = { color, color, color, color }; + unsigned channels[4] = { 0, 1, 2, 3 }; + color = bi_temp(b->shader); + bi_make_vec_to(b, color, srcs, channels, + nir_src_num_components(instr->src[0]), + nir_alu_type_get_type_size(nir_intrinsic_src_type(instr))); + } + + bi_emit_blend_op(b, color, nir_intrinsic_src_type(instr), rt); } if (b->shader->is_blend) {