From 63f8d648f019c4df8d4870539ea2c3f4bd468917 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 27 Jun 2016 19:47:27 +0200 Subject: [PATCH] gallium/radeon: remove zombie textures kept alive by DCC stat gathering MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeon/r600_texture.c | 39 +++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index 776ad7c..68f1701 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -1716,6 +1716,25 @@ unsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap) /* PIPELINE_STAT-BASED DCC ENABLEMENT FOR DISPLAYABLE SURFACES */ +static void vi_dcc_clean_up_context_slot(struct r600_common_context *rctx, + int slot) +{ + int i; + + if (rctx->dcc_stats[slot].query_active) + vi_separate_dcc_stop_query(&rctx->b, + rctx->dcc_stats[slot].tex); + + for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats[slot].ps_stats); i++) + if (rctx->dcc_stats[slot].ps_stats[i]) { + rctx->b.destroy_query(&rctx->b, + rctx->dcc_stats[slot].ps_stats[i]); + rctx->dcc_stats[slot].ps_stats[i] = NULL; + } + + r600_texture_reference(&rctx->dcc_stats[slot].tex, NULL); +} + /** * Return the per-context slot where DCC statistics queries for the texture live. */ @@ -1724,6 +1743,13 @@ static unsigned vi_get_context_dcc_stats_index(struct r600_common_context *rctx, { int i, empty_slot = -1; + /* Remove zombie textures (textures kept alive by this array only). */ + for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats); i++) + if (rctx->dcc_stats[i].tex && + rctx->dcc_stats[i].tex->resource.b.b.reference.count == 1) + vi_dcc_clean_up_context_slot(rctx, i); + + /* Find the texture. */ for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats); i++) { /* Return if found. */ if (rctx->dcc_stats[i].tex == tex) { @@ -1747,18 +1773,7 @@ static unsigned vi_get_context_dcc_stats_index(struct r600_common_context *rctx, oldest_slot = i; /* Clean up the oldest slot. */ - if (rctx->dcc_stats[oldest_slot].query_active) - vi_separate_dcc_stop_query(&rctx->b, - rctx->dcc_stats[oldest_slot].tex); - - for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats[oldest_slot].ps_stats); i++) - if (rctx->dcc_stats[oldest_slot].ps_stats[i]) { - rctx->b.destroy_query(&rctx->b, - rctx->dcc_stats[oldest_slot].ps_stats[i]); - rctx->dcc_stats[oldest_slot].ps_stats[i] = NULL; - } - - r600_texture_reference(&rctx->dcc_stats[oldest_slot].tex, NULL); + vi_dcc_clean_up_context_slot(rctx, oldest_slot); empty_slot = oldest_slot; } -- 2.7.4