From 9e5e702cfb380af461062c96d974027da8d5f17a Mon Sep 17 00:00:00 2001 From: Nicolai Hähnle Date: Sat, 28 Nov 2015 00:02:26 +0100 Subject: radeon: only suspend queries on flush if they haven't been suspended yet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Non-timer queries are suspended during blits. When the blits end, the queries are resumed, but this resume operation itself might run out of CS space and trigger a flush. When this happens, we must prevent a duplicate suspend during preflush suspend, and we must also prevent a duplicate resume when the CS flush returns back to the original resume operation. This fixes a regression that was introduced by: commit 8a125afa6e88a3eeddba8c7fdc1a75c9b99d5489 Author: Nicolai Hähnle Date: Wed Nov 18 18:40:22 2015 +0100 radeon: ensure that timing/profiling queries are suspended on flush The queries_suspended_for_flush flag is redundant because suspended queries are not removed from their respective linked list. Reviewed-by: Marek Olšák Reported-by: Axel Davy Cc: "11.1" Tested-by: Axel Davy Reviewed-by: Marek Olšák --- src/gallium/drivers/radeon/r600_pipe_common.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/gallium/drivers/radeon/r600_pipe_common.c') diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index f03dcd96e85..aaea8fe27f4 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -136,8 +136,12 @@ static void r600_memory_barrier(struct pipe_context *ctx, unsigned flags) void r600_preflush_suspend_features(struct r600_common_context *ctx) { /* suspend queries */ - if (!LIST_IS_EMPTY(&ctx->active_nontimer_queries)) + if (ctx->num_cs_dw_nontimer_queries_suspend) { + /* Since non-timer queries are suspended during blits, + * we have to guard against double-suspends. */ r600_suspend_nontimer_queries(ctx); + ctx->nontimer_queries_suspended_by_flush = true; + } if (!LIST_IS_EMPTY(&ctx->active_timer_queries)) r600_suspend_timer_queries(ctx); @@ -158,8 +162,10 @@ void r600_postflush_resume_features(struct r600_common_context *ctx) /* resume queries */ if (!LIST_IS_EMPTY(&ctx->active_timer_queries)) r600_resume_timer_queries(ctx); - if (!LIST_IS_EMPTY(&ctx->active_nontimer_queries)) + if (ctx->nontimer_queries_suspended_by_flush) { + ctx->nontimer_queries_suspended_by_flush = false; r600_resume_nontimer_queries(ctx); + } } static void r600_flush_from_st(struct pipe_context *ctx, -- cgit v1.2.3