From: Marek Olšák <marek.ol...@amd.com>

Cc: 18.1 <mesa-sta...@lists.freedesktop.org>
---
 src/gallium/drivers/radeonsi/si_blit.c | 30 +++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_blit.c 
b/src/gallium/drivers/radeonsi/si_blit.c
index fe059b36577..93cf7fe9001 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -1320,23 +1320,47 @@ static void si_flush_resource(struct pipe_context *ctx,
        if (rtex->dcc_separate_buffer && !rtex->separate_dcc_dirty)
                return;
 
        if (!rtex->is_depth && (rtex->cmask.size || rtex->dcc_offset)) {
                si_blit_decompress_color(sctx, rtex, 0, res->last_level,
                                         0, util_max_layer(res, 0),
                                         rtex->dcc_separate_buffer != NULL);
        }
 
        /* Always do the analysis even if DCC is disabled at the moment. */
-       if (rtex->dcc_gather_statistics && rtex->separate_dcc_dirty) {
-               rtex->separate_dcc_dirty = false;
-               vi_separate_dcc_process_and_reset_stats(ctx, rtex);
+       if (rtex->dcc_gather_statistics) {
+               bool separate_dcc_dirty = rtex->separate_dcc_dirty;
+
+               /* If the color buffer hasn't been unbound and fast clear hasn't
+                * been used, separate_dcc_dirty is false, but there may have 
been
+                * new rendering. Check if the color buffer is bound and assume
+                * it's dirty.
+                *
+                * Note that DRI2 never unbinds window colorbuffers, which means
+                * the DCC pipeline statistics query would never be re-set and 
would
+                * keep adding new results until all free memory is exhausted 
if we
+                * didn't do this.
+                */
+               if (!separate_dcc_dirty) {
+                       for (unsigned i = 0; i < 
sctx->framebuffer.state.nr_cbufs; i++) {
+                               if (sctx->framebuffer.state.cbufs[i] &&
+                                   sctx->framebuffer.state.cbufs[i]->texture 
== res) {
+                                       separate_dcc_dirty = true;
+                                       break;
+                               }
+                       }
+               }
+
+               if (separate_dcc_dirty) {
+                       rtex->separate_dcc_dirty = false;
+                       vi_separate_dcc_process_and_reset_stats(ctx, rtex);
+               }
        }
 }
 
 void si_decompress_dcc(struct si_context *sctx, struct r600_texture *rtex)
 {
        if (!rtex->dcc_offset)
                return;
 
        si_blit_decompress_color(sctx, rtex, 0, rtex->buffer.b.b.last_level,
                                 0, util_max_layer(&rtex->buffer.b.b, 0),
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to