aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <[email protected]>2020-03-18 21:57:31 +0100
committerPierre-Eric Pelloux-Prayer <[email protected]>2020-03-24 08:05:12 +0100
commitbd6234f24be024556a4b83e879bb65b89fea7a12 (patch)
tree4062b5db3b56ceb5db0d2ff2eb07dd3a4989f1d5
parent67a10ea21596b2dff3ea2dc40713e59784e02ef2 (diff)
radeonsi: clarify the conditions when FLUSH_AND_INV_DB is needed
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 <[email protected]> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4263> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4263>
-rw-r--r--src/gallium/drivers/radeonsi/si_clear.c20
-rw-r--r--src/gallium/drivers/radeonsi/si_debug_options.h1
-rw-r--r--src/util/00-mesa-defaults.conf3
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.
</application>
</device>
<device driver="radeonsi">
- <application name="ARK: Survival Evolved (and unintentionally the UE4 demo template)" executable="ShooterGame">
- <option name="radeonsi_clear_db_cache_before_clear" value="true" />
- </application>
<application name="American Truck Simulator" executable="amtrucks">
<option name="radeonsi_zerovram" value="true" />
</application>