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

Marek Olšák maraeo at gmail.com
Fri Oct 6 00:16:11 UTC 2017


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 <nhaehnle at gmail.com> 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 <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