freedreno/a4xx: improve condition for disabling early z
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 20 Nov 2021 07:30:37 +0000 (02:30 -0500)
committerMarge Bot <emma+marge@anholt.net>
Tue, 8 Mar 2022 01:23:05 +0000 (01:23 +0000)
This helps some subtests in the early-z piglit test, but leaves one
occlusion-based test still failing.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15251>

src/gallium/drivers/freedreno/a4xx/fd4_emit.c

index 2263009..0d001d1 100644 (file)
@@ -709,13 +709,14 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
 
    if (dirty & (FD_DIRTY_ZSA | FD_DIRTY_RASTERIZER | FD_DIRTY_PROG)) {
       struct fd4_zsa_stateobj *zsa = fd4_zsa_stateobj(ctx->zsa);
-      bool fragz = fp->no_earlyz | fp->has_kill | fp->writes_pos;
+      bool fragz = fp->no_earlyz || fp->has_kill || fp->writes_pos;
+      bool latez = fp->shader && !fp->shader->nir->info.fs.early_fragment_tests && fragz;
       bool clamp = !ctx->rasterizer->depth_clip_near;
 
       OUT_PKT0(ring, REG_A4XX_RB_DEPTH_CONTROL, 1);
       OUT_RING(ring, zsa->rb_depth_control |
                         COND(clamp, A4XX_RB_DEPTH_CONTROL_Z_CLAMP_ENABLE) |
-                        COND(fragz, A4XX_RB_DEPTH_CONTROL_EARLY_Z_DISABLE) |
+                        COND(latez, A4XX_RB_DEPTH_CONTROL_EARLY_Z_DISABLE) |
                         COND(fragz && fp->fragcoord_compmask != 0,
                              A4XX_RB_DEPTH_CONTROL_FORCE_FRAGZ_TO_FS));
 
@@ -724,7 +725,7 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
        */
       OUT_PKT0(ring, REG_A4XX_GRAS_ALPHA_CONTROL, 1);
       OUT_RING(ring, zsa->gras_alpha_control |
-                        COND(fragz, A4XX_GRAS_ALPHA_CONTROL_ALPHA_TEST_ENABLE) |
+                        COND(latez, A4XX_GRAS_ALPHA_CONTROL_ALPHA_TEST_ENABLE) |
                         COND(fragz && fp->fragcoord_compmask != 0,
                              A4XX_GRAS_ALPHA_CONTROL_FORCE_FRAGZ_TO_FS));
    }