radeonsi: don't use fast color clear for small surfaces
authorMarek Olšák <marek.olsak@amd.com>
Sat, 25 Nov 2017 19:16:02 +0000 (20:16 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 29 Nov 2017 17:21:30 +0000 (18:21 +0100)
This removes 35+ clear eliminate passes from DOTA 2.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_clear.c

index 00589caf5be7019478d86cb106b1f0ad441173c0..4663fc29cc6d2f6d671072303ab0d93084278c89 100644 (file)
@@ -421,6 +421,17 @@ static void si_do_fast_color_clear(struct si_context *sctx,
 
                bool need_decompress_pass = false;
 
+               /* Use a slow clear for small surfaces where the cost of
+                * the eliminate pass can be higher than the benefit of fast
+                * clear. The closed driver does this, but the numbers may differ.
+                *
+                * Always use fast clear on APUs.
+                */
+               bool too_small = sctx->screen->b.info.has_dedicated_vram &&
+                                tex->resource.b.b.nr_samples <= 1 &&
+                                tex->resource.b.b.width0 <= 256 &&
+                                tex->resource.b.b.height0 <= 256;
+
                /* Try to clear DCC first, otherwise try CMASK. */
                if (vi_dcc_enabled(tex, 0)) {
                        uint32_t reset_value;
@@ -439,6 +450,9 @@ static void si_do_fast_color_clear(struct si_context *sctx,
                                                          &clear_words_needed))
                                continue;
 
+                       if (clear_words_needed && too_small)
+                               continue;
+
                        /* DCC fast clear with MSAA should clear CMASK to 0xC. */
                        if (tex->resource.b.b.nr_samples >= 2 && tex->cmask.size) {
                                /* TODO: This doesn't work with MSAA. */
@@ -458,6 +472,9 @@ static void si_do_fast_color_clear(struct si_context *sctx,
 
                        tex->separate_dcc_dirty = true;
                } else {
+                       if (too_small)
+                               continue;
+
                        /* 128-bit formats are unusupported */
                        if (tex->surface.bpe > 8) {
                                continue;