[Mesa-dev] [PATCH 08/11] radeonsi: fix memory exhaustion issue with DCC statistics gathering with DRI2
Marek Olšák
maraeo at gmail.com
Mon Jun 18 23:33:09 UTC 2018
From: Marek Olšák <marek.olsak at amd.com>
Cc: 18.1 <mesa-stable at 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
More information about the mesa-dev
mailing list