summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/radeonsi/si_clear.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c
index 00589caf5be..4663fc29cc6 100644
--- a/src/gallium/drivers/radeonsi/si_clear.c
+++ b/src/gallium/drivers/radeonsi/si_clear.c
@@ -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;