From: Nicolai Hähnle <nicolai.haeh...@amd.com>

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 <nhaeh...@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.ol...@amd.com>

Reported-by: Axel Davy <axel.d...@ens.fr>
Cc: "11.1" <mesa-sta...@lists.freedesktop.org>
---
 src/gallium/drivers/radeon/r600_pipe_common.c | 10 ++++++++--
 src/gallium/drivers/radeon/r600_pipe_common.h |  1 +
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c 
b/src/gallium/drivers/radeon/r600_pipe_common.c
index f03dcd9..aaea8fe 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,
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h 
b/src/gallium/drivers/radeon/r600_pipe_common.h
index 253d657..a4f3fce 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -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;
-- 
2.5.0

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

Reply via email to