From bd6234f24be024556a4b83e879bb65b89fea7a12 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 18 Mar 2020 21:57:31 +0100 Subject: [PATCH] radeonsi: clarify the conditions when FLUSH_AND_INV_DB is needed MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit FLUSH_AND_INV_DB should be done when we're changing surface state registers of a bound depth target. When depth_clear_value changes, si_state will modify S_028038_ZRANGE_PRECISION so we need to flush the DB caches. Verified with the captures from bugs cited below. Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1283 Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1330 Reviewed-by: Marek Olšák Tested-by: Marge Bot Part-of: --- src/gallium/drivers/radeonsi/si_clear.c | 20 +++++++------------ .../drivers/radeonsi/si_debug_options.h | 1 - src/util/00-mesa-defaults.conf | 3 --- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c index ef48b94a46d..2af778b41ad 100644 --- a/src/gallium/drivers/radeonsi/si_clear.c +++ b/src/gallium/drivers/radeonsi/si_clear.c @@ -575,6 +575,7 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers, struct pipe_surface *zsbuf = fb->zsbuf; struct si_texture *zstex = zsbuf ? (struct si_texture*)zsbuf->texture : NULL; + bool needs_db_flush = false; if (buffers & PIPE_CLEAR_COLOR) { si_do_fast_color_clear(sctx, &buffers, color); @@ -610,6 +611,11 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers, } if (zstex->depth_clear_value != (float)depth) { + if ((zstex->depth_clear_value != 0) != (depth != 0)) { + /* ZRANGE_PRECISION register of a bound surface will change so we + * must flush the DB caches. */ + needs_db_flush = true; + } /* Update DB_DEPTH_CLEAR. */ zstex->depth_clear_value = depth; sctx->framebuffer.dirty_zsbuf = true; @@ -641,19 +647,7 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers, si_mark_atom_dirty(sctx, &sctx->atoms.s.db_render_state); } - /* TODO: Find out what's wrong here. Fast depth clear leads to - * corruption in ARK: Survival Evolved, but that may just be - * a coincidence and the root cause is elsewhere. - * - * The corruption can be fixed by putting the DB flush before - * or after the depth clear. (surprisingly) - * - * https://bugs.freedesktop.org/show_bug.cgi?id=102955 (apitrace) - * - * This hack decreases back-to-back ClearDepth performance. - */ - if ((sctx->db_depth_clear || sctx->db_stencil_clear) && - sctx->screen->options.clear_db_cache_before_clear) + if (needs_db_flush) sctx->flags |= SI_CONTEXT_FLUSH_AND_INV_DB; } diff --git a/src/gallium/drivers/radeonsi/si_debug_options.h b/src/gallium/drivers/radeonsi/si_debug_options.h index 9a0dd0c9f78..b0e8db8646a 100644 --- a/src/gallium/drivers/radeonsi/si_debug_options.h +++ b/src/gallium/drivers/radeonsi/si_debug_options.h @@ -1,4 +1,3 @@ -OPT_BOOL(clear_db_cache_before_clear, false, "Clear DB cache before fast depth clear") OPT_BOOL(aux_debug, false, "Generate ddebug_dumps for the auxiliary context") OPT_BOOL(sync_compile, false, "Always compile synchronously (will cause stalls)") OPT_BOOL(dump_shader_binary, false, "Dump shader binary as part of ddebug_dumps") diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index 3b14fe7aec4..72c415abef8 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -547,9 +547,6 @@ TODO: document the other workarounds. - - -- 2.30.2