radeon: only suspend queries on flush if they haven't been suspended yet
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 8a125afa6e
Author: Nicolai Hähnle <nhaehnle@gmail.com>
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 <marek.olsak@amd.com>
Reported-by: Axel Davy <axel.davy@ens.fr>
Cc: "11.1" <mesa-stable@lists.freedesktop.org>
Tested-by: Axel Davy <axel.davy@ens.fr>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
ea3f394e4a
commit
9e5e702cfb
|
@ -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,
|
||||
|
|
|
@ -396,6 +396,7 @@ struct r600_common_context {
|
|||
struct list_head active_nontimer_queries;
|
||||
struct list_head active_timer_queries;
|
||||
unsigned num_cs_dw_nontimer_queries_suspend;
|
||||
bool nontimer_queries_suspended_by_flush;
|
||||
unsigned num_cs_dw_timer_queries_suspend;
|
||||
/* Additional hardware info. */
|
||||
unsigned backend_mask;
|
||||
|
|
Loading…
Reference in New Issue