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

Reply via email to