pan/bi: Workaround BLEND precolour with explicit moves
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 7 Jan 2021 14:28:11 +0000 (09:28 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 11 Jan 2021 20:43:13 +0000 (20:43 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8417>

src/panfrost/bifrost/bifrost_compile.c

index 17fd7f8..cbb3bcd 100644 (file)
@@ -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]);
+
+                /* 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, bi_src_index(&instr->src[0]),
-                                nir_intrinsic_src_type(instr), rt);
+                bi_emit_blend_op(b, color, nir_intrinsic_src_type(instr), rt);
         }
 
         if (b->shader->is_blend) {