DB_META | PS_PARTIAL_FLUSH are sufficient. I'll go with those. Marek
On Thu, Oct 5, 2017 at 5:10 PM, Nicolai Hähnle <[email protected]> wrote: > 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 <[email protected]> > > > > On 03.10.2017 19:32, Marek Olšák wrote: >> >> From: Marek Olšák <[email protected]> >> >> --- >> 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. _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
