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: #1283
Closes: #1330Reviewed-by: default avatarMarek Olšák <marek.olsak@amd.com>
Tested-by: Marge Bot <!4263>
Part-of: <!4263>
parent 67a10ea2
Pipeline #123514 passed with stages
in 19 minutes and 24 seconds
......@@ -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;
}
......
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")
......
......@@ -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>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment