panfrost: Fix logic ops on Bifrost
authorAlyssa Rosenzweig <alyssa@collabora.com>
Thu, 12 Jan 2023 22:34:44 +0000 (17:34 -0500)
committerEric Engestrom <eric@engestrom.ch>
Thu, 26 Jan 2023 15:40:30 +0000 (15:40 +0000)
opaque should not be set when logicops are enabled, that needs blending
even on Bifrost. Fixes is for when I believe the bug became possible to hit.
The logical error is older.

Fixes Piglit logicop tests again.

Fixes: d849d9779a7 ("panfrost: Avoid blend shader when not blending")
Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20685>
(cherry picked from commit 41d99c10d1f2dff160b732e5311da398eb1ed90a)

.pick_status.json
src/gallium/drivers/panfrost/pan_cmdstream.c
src/panfrost/lib/pan_blend.c

index 5d103dc..4372dfc 100644 (file)
         "description": "panfrost: Fix logic ops on Bifrost",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "d849d9779a77f05d7acd418516e154a4e9018f40"
     },
index 1782ca1..63da955 100644 (file)
@@ -4511,7 +4511,7 @@ panfrost_create_blend_state(struct pipe_context *pipe,
                 const bool supports_2src = pan_blend_supports_2src(PAN_ARCH);
                 so->info[c] = (struct pan_blend_info) {
                         .enabled = (equation.color_mask != 0),
-                        .opaque = pan_blend_is_opaque(equation),
+                        .opaque = !blend->logicop_enable && pan_blend_is_opaque(equation),
                         .constant_mask = constant_mask,
 
                         /* TODO: check the dest for the logicop */
index f6e6bf6..b4c3f15 100644 (file)
@@ -800,7 +800,8 @@ GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev,
         };
 
         /* Blend shaders should only be used for blending on Bifrost onwards */
-        assert(dev->arch <= 5 || !pan_blend_is_opaque(state->rts[rt].equation));
+        assert(dev->arch <= 5 || state->logicop_enable ||
+               !pan_blend_is_opaque(state->rts[rt].equation));
         assert(state->rts[rt].equation.color_mask != 0);
 
         struct hash_entry *he = _mesa_hash_table_search(dev->blend_shaders.shaders, &key);