radeonsi: add a drirc workaround for HTILE corruption in ARK: Survival Evolved
authorMarek Olšák <marek.olsak@amd.com>
Tue, 3 Oct 2017 17:28:48 +0000 (19:28 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 6 Oct 2017 00:56:11 +0000 (02:56 +0200)
v2: use DB_META | PS_PARTIAL_FLUSH

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102955
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> (v1)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> (v1)
src/gallium/drivers/radeonsi/driinfo_radeonsi.h
src/gallium/drivers/radeonsi/si_blit.c
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/radeonsi/si_pipe.h
src/util/drirc
src/util/xmlpool/t_options.h

index 989e5175cc0683272b1c86a43c03fc0533b31c80..402d3406d45a2f739186a716f82bd03005fccd32 100644 (file)
@@ -4,3 +4,7 @@ DRI_CONF_SECTION_PERFORMANCE
     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_META_BEFORE_CLEAR("false")
+DRI_CONF_SECTION_END
index 67972a24ffb779722bcebc666b16831640d0a5d8..2e76a5c69987e2b86ad9d2d2ea8666c1560e77b2 100644 (file)
@@ -903,6 +903,21 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers,
                        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 metadata flush
+                * before or after the depth clear. (suprisingly)
+                *
+                * https://bugs.freedesktop.org/show_bug.cgi?id=102955 (apitrace)
+                *
+                * This hack decreases back-to-back ClearDepth performance.
+                */
+               if (sctx->screen->clear_db_meta_before_clear)
+                       sctx->b.flags |= SI_CONTEXT_FLUSH_AND_INV_DB_META |
+                                        SI_CONTEXT_PS_PARTIAL_FLUSH;
        }
 
        si_blitter_begin(ctx, SI_CLEAR);
index 3d2ce04725b661a8e9eaa896db229fe5af07712a..5e20a0b8e385e00e15cf2230dc3c316376d8cafb 100644 (file)
@@ -1055,6 +1055,8 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws,
                driQueryOptionb(config->options, "radeonsi_assume_no_z_fights");
        sscreen->commutative_blend_add =
                driQueryOptionb(config->options, "radeonsi_commutative_blend_add");
+       sscreen->clear_db_meta_before_clear =
+               driQueryOptionb(config->options, "radeonsi_clear_db_meta_before_clear");
        sscreen->has_msaa_sample_loc_bug = (sscreen->b.family >= CHIP_POLARIS10 &&
                                            sscreen->b.family <= CHIP_POLARIS12) ||
                                           sscreen->b.family == CHIP_VEGA10 ||
index b96bf9d2fe1e66ed1c1a1e5cb969b475b1b4774a..684fda13406fa8c8e7e9fdaf67d42cda5e747c46 100644 (file)
@@ -98,6 +98,7 @@ struct si_screen {
        bool                            has_out_of_order_rast;
        bool                            assume_no_z_fights;
        bool                            commutative_blend_add;
+       bool                            clear_db_meta_before_clear;
        bool                            has_msaa_sample_loc_bug;
        bool                            dpbb_allowed;
        bool                            dfsm_allowed;
index 0bedeef9a3c691a1c3b756cdaa1f4bea7f2f30f6..700402c630173fb9e5c1d2718c59ca8c5428ddf8 100644 (file)
@@ -235,4 +235,9 @@ TODO: document the other workarounds.
            <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_meta_before_clear" value="true" />
+        </application>
+    </device>
 </driconf>
index 64477c5ed654d2a544194229544fd8c018ebb250..957ed6150484fd3a558ee988bcbbbf54e4171121 100644 (file)
@@ -443,3 +443,8 @@ DRI_CONF_OPT_END
 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_META_BEFORE_CLEAR(def) \
+DRI_CONF_OPT_BEGIN_B(radeonsi_clear_db_meta_before_clear, def) \
+        DRI_CONF_DESC(en,"Clear DB metadata cache before fast depth clear") \
+DRI_CONF_OPT_END