From c01aac141a9737e637f1e565ad68461784f58d1d Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 20 Jan 2021 10:44:20 -0800 Subject: [PATCH] freedreno/a6xx: Don't early-z if there are stencil writes Fixes a similar stencil related misrendering in a couple "RV AppStudios" titles. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a6xx/fd6_emit.c | 2 +- src/gallium/drivers/freedreno/a6xx/fd6_zsa.c | 2 ++ src/gallium/drivers/freedreno/a6xx/fd6_zsa.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c index 1b773295bae..bea8b0619b3 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c @@ -593,7 +593,7 @@ compute_ztest_mode(struct fd6_emit *emit, bool lrz_valid) fs->writes_stencilref) { return A6XX_LATE_Z; } else if ((fs->has_kill || zsa->alpha_test) && - (zsa->base.depth_writemask || !pfb->zsbuf)) { + (zsa->writes_zs || !pfb->zsbuf)) { /* Slightly odd, but seems like the hw wants us to select * LATE_Z mode if there is no depth buffer + discard. Either * that, or when occlusion query is enabled. See: diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_zsa.c b/src/gallium/drivers/freedreno/a6xx/fd6_zsa.c index 60347d0dc85..d262e2049a0 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_zsa.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_zsa.c @@ -102,6 +102,8 @@ fd6_zsa_state_create(struct pipe_context *pctx, so->base = *cso; + so->writes_zs = util_writes_depth_stencil(cso); + so->rb_depth_cntl |= A6XX_RB_DEPTH_CNTL_ZFUNC(cso->depth_func); /* maps 1:1 */ diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_zsa.h b/src/gallium/drivers/freedreno/a6xx/fd6_zsa.h index 5cd636727b6..1ba5bc166b0 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_zsa.h +++ b/src/gallium/drivers/freedreno/a6xx/fd6_zsa.h @@ -49,6 +49,7 @@ struct fd6_zsa_stateobj { uint32_t rb_stencilwrmask; struct fd6_lrz_state lrz; + bool writes_zs; /* writes depth and/or stencil */ bool invalidate_lrz; bool alpha_test;