freedreno/a6xx: disable LRZ when color channels are masked
authorRob Clark <robdclark@chromium.org>
Thu, 20 Aug 2020 18:14:36 +0000 (11:14 -0700)
committerMarge Bot <eric+marge@anholt.net>
Thu, 20 Aug 2020 19:01:52 +0000 (19:01 +0000)
From the PoV of early-z tests, having masked color channels is basically
like blend, ie. we do actually care about the fragments (or at least
parts of them) from previous draws.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6409>

src/gallium/drivers/freedreno/a6xx/fd6_blend.c

index d69d3f0f59d7b1f7dc7ffc2d7da23767cd0061d6..fe63be97fd5c83fd8d8dfff144716979c8d247f5 100644 (file)
@@ -166,7 +166,20 @@ fd6_blend_state_create(struct pipe_context *pctx,
                const struct pipe_rt_blend_state *rt = &cso->rt[i];
 
                so->reads_dest |= rt->blend_enable;
                const struct pipe_rt_blend_state *rt = &cso->rt[i];
 
                so->reads_dest |= rt->blend_enable;
-               if (rt->blend_enable) {
+
+               /* From the PoV of LRZ, having masked color channels is
+                * the same as having blend enabled, in that the draw will
+                * care about the fragments from an earlier draw.
+                *
+                * NOTE we actually don't care about masked color channels
+                * that don't actually exist in the render target, but we
+                * don't know the render target format here to determine
+                * that.  It is probably not worth worrying about, but if
+                * we find a game/benchmark that goes out of it's way to
+                * mask off non-existent channels, we should fixup the
+                * pipe_blend_state to give us more info.
+                */
+               if (rt->blend_enable || (rt->colormask != 0xf)) {
                        so->reads_dest = true;
                }
        }
                        so->reads_dest = true;
                }
        }