[Mesa-dev] [PATCH] radeonsi: add a drirc workaround for HTILE corruption in ARK: Survival Evolved

Nicolai Hähnle nhaehnle at gmail.com
Thu Oct 5 15:10:48 UTC 2017


Did you test whether a META flush is sufficient? I'm somewhat reminded 
of commit 34124e412f00432ba8b3b8d16e3f2168aa596622 ("radeonsi/gfx9: 
always flush DB metadata on framebuffer changes"). From my testing I got 
the impression that this was specific to gfx9, but perhaps earlier 
generations are affected as well.

If META flush isn't sufficient, then, well,

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


On 03.10.2017 19:32, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> ---
>   src/gallium/drivers/radeonsi/driinfo_radeonsi.h |  4 ++++
>   src/gallium/drivers/radeonsi/si_blit.c          | 14 ++++++++++++++
>   src/gallium/drivers/radeonsi/si_pipe.c          |  2 ++
>   src/gallium/drivers/radeonsi/si_pipe.h          |  1 +
>   src/util/drirc                                  |  5 +++++
>   src/util/xmlpool/t_options.h                    |  5 +++++
>   6 files changed, 31 insertions(+)
> 
> diff --git a/src/gallium/drivers/radeonsi/driinfo_radeonsi.h b/src/gallium/drivers/radeonsi/driinfo_radeonsi.h
> index 989e517..7f57b4e 100644
> --- a/src/gallium/drivers/radeonsi/driinfo_radeonsi.h
> +++ b/src/gallium/drivers/radeonsi/driinfo_radeonsi.h
> @@ -1,6 +1,10 @@
>   // DriConf options specific to radeonsi
>   DRI_CONF_SECTION_PERFORMANCE
>       DRI_CONF_RADEONSI_ENABLE_SISCHED("false")
>       DRI_CONF_RADEONSI_ASSUME_NO_Z_FIGHTS("false")
>       DRI_CONF_RADEONSI_COMMUTATIVE_BLEND_ADD("false")
>   DRI_CONF_SECTION_END
> +
> +DRI_CONF_SECTION_DEBUG
> +   DRI_CONF_RADEONSI_CLEAR_DB_CACHE_BEFORE_CLEAR("false")
> +DRI_CONF_SECTION_END
> diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
> index 67972a2..44e5251 100644
> --- a/src/gallium/drivers/radeonsi/si_blit.c
> +++ b/src/gallium/drivers/radeonsi/si_blit.c
> @@ -896,20 +896,34 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers,
>   			if (!zstex->stencil_cleared || zstex->stencil_clear_value != stencil) {
>   				sctx->db_stencil_disable_expclear = true;
>   			}
>   
>   			zstex->stencil_clear_value = stencil;
>   			sctx->framebuffer.dirty_zsbuf = true;
>   			si_mark_atom_dirty(sctx, &sctx->framebuffer.atom); /* updates DB_STENCIL_CLEAR */
>   			sctx->db_stencil_clear = true;
>   			si_mark_atom_dirty(sctx, &sctx->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. (suprisingly)
> +		 *
> +		 * https://bugs.freedesktop.org/show_bug.cgi?id=102955 (apitrace)
> +		 *
> +		 * This hack massively decreases back-to-back ClearDepth performance.
> +		 */
> +		if (sctx->screen->clear_db_cache_before_clear)
> +			sctx->b.flags |= SI_CONTEXT_FLUSH_AND_INV_DB;
>   	}
>   
>   	si_blitter_begin(ctx, SI_CLEAR);
>   	util_blitter_clear(sctx->blitter, fb->width, fb->height,
>   			   util_framebuffer_get_num_layers(fb),
>   			   buffers, color, depth, stencil);
>   	si_blitter_end(ctx);
>   
>   	if (sctx->db_depth_clear) {
>   		sctx->db_depth_clear = false;
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 79e4e1c..7039aab 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -1050,20 +1050,22 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws,
>   		 sscreen->b.info.pfp_fw_version >= 79 &&
>   		 sscreen->b.info.me_fw_version >= 142);
>   
>   	sscreen->has_out_of_order_rast = sscreen->b.chip_class >= VI &&
>   					 sscreen->b.info.max_se >= 2 &&
>   					 !(sscreen->b.debug_flags & DBG_NO_OUT_OF_ORDER);
>   	sscreen->assume_no_z_fights =
>   		driQueryOptionb(config->options, "radeonsi_assume_no_z_fights");
>   	sscreen->commutative_blend_add =
>   		driQueryOptionb(config->options, "radeonsi_commutative_blend_add");
> +	sscreen->clear_db_cache_before_clear =
> +		driQueryOptionb(config->options, "radeonsi_clear_db_cache_before_clear");
>   	sscreen->has_msaa_sample_loc_bug = (sscreen->b.family >= CHIP_POLARIS10 &&
>   					    sscreen->b.family <= CHIP_POLARIS12) ||
>   					   sscreen->b.family == CHIP_VEGA10 ||
>   					   sscreen->b.family == CHIP_RAVEN;
>   	sscreen->dpbb_allowed = sscreen->b.chip_class >= GFX9 &&
>   				!(sscreen->b.debug_flags & DBG_NO_DPBB);
>   	sscreen->dfsm_allowed = sscreen->dpbb_allowed &&
>   				!(sscreen->b.debug_flags & DBG_NO_DFSM);
>   
>   	/* While it would be nice not to have this flag, we are constrained
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
> index b96bf9d..50f59b9 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.h
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
> @@ -91,20 +91,21 @@ struct u_suballocator;
>   struct si_screen {
>   	struct r600_common_screen	b;
>   	unsigned			gs_table_depth;
>   	unsigned			tess_offchip_block_dw_size;
>   	bool				has_clear_state;
>   	bool				has_distributed_tess;
>   	bool				has_draw_indirect_multi;
>   	bool				has_out_of_order_rast;
>   	bool				assume_no_z_fights;
>   	bool				commutative_blend_add;
> +	bool				clear_db_cache_before_clear;
>   	bool				has_msaa_sample_loc_bug;
>   	bool				dpbb_allowed;
>   	bool				dfsm_allowed;
>   	bool				llvm_has_working_vgpr_indexing;
>   
>   	/* Whether shaders are monolithic (1-part) or separate (3-part). */
>   	bool				use_monolithic_shaders;
>   	bool				record_llvm_ir;
>   
>   	mtx_t			shader_parts_mutex;
> diff --git a/src/util/drirc b/src/util/drirc
> index 0bedeef..8e36196 100644
> --- a/src/util/drirc
> +++ b/src/util/drirc
> @@ -228,11 +228,16 @@ TODO: document the other workarounds.
>       <device driver="vmwgfx">
>           <application name="gnome-shell" executable="gnome-shell">
>               <option name="glx_disable_ext_buffer_age" value="true" />
>               <option name="glx_disable_oml_sync_control" value="true" />
>           </application>
>   	<application name="Compiz" executable="Compiz">
>               <option name="glx_disable_ext_buffer_age" value="true" />
>   	    <option name="glx_disable_oml_sync_control" value="true" />
>           </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>
> +    </device>
>   </driconf>
> diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h
> index 214c7c3..f21ef57 100644
> --- a/src/util/xmlpool/t_options.h
> +++ b/src/util/xmlpool/t_options.h
> @@ -441,10 +441,15 @@ DRI_CONF_OPT_END
>   
>   #define DRI_CONF_RADEONSI_ASSUME_NO_Z_FIGHTS(def) \
>   DRI_CONF_OPT_BEGIN_B(radeonsi_assume_no_z_fights, def) \
>           DRI_CONF_DESC(en,gettext("Assume no Z fights (enables aggressive out-of-order rasterization to improve performance; may cause rendering errors)")) \
>   DRI_CONF_OPT_END
>   
>   #define DRI_CONF_RADEONSI_COMMUTATIVE_BLEND_ADD(def) \
>   DRI_CONF_OPT_BEGIN_B(radeonsi_commutative_blend_add, def) \
>           DRI_CONF_DESC(en,gettext("Commutative additive blending optimizations (may cause rendering errors)")) \
>   DRI_CONF_OPT_END
> +
> +#define DRI_CONF_RADEONSI_CLEAR_DB_CACHE_BEFORE_CLEAR(def) \
> +DRI_CONF_OPT_BEGIN_B(radeonsi_clear_db_cache_before_clear, def) \
> +        DRI_CONF_DESC(en,"Clear DB cache before fast depth clear") \
> +DRI_CONF_OPT_END
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list