From: Marek Olšák <marek.ol...@amd.com>

All of them are paused only between IBs.
---
 src/gallium/drivers/r600/r600_hw_context.c    |  3 +-
 src/gallium/drivers/radeon/r600_pipe_common.c | 18 ++------
 src/gallium/drivers/radeon/r600_pipe_common.h | 19 +++-----
 src/gallium/drivers/radeon/r600_query.c       | 65 ++++++---------------------
 4 files changed, 23 insertions(+), 82 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_hw_context.c 
b/src/gallium/drivers/r600/r600_hw_context.c
index 63b631a..3ef2ac5 100644
--- a/src/gallium/drivers/r600/r600_hw_context.c
+++ b/src/gallium/drivers/r600/r600_hw_context.c
@@ -65,8 +65,7 @@ void r600_need_cs_space(struct r600_context *ctx, unsigned 
num_dw,
        }
 
        /* Count in queries_suspend. */
-       num_dw += ctx->b.num_cs_dw_nontimer_queries_suspend +
-                 ctx->b.num_cs_dw_timer_queries_suspend;
+       num_dw += ctx->b.num_cs_dw_queries_suspend;
 
        /* Count in streamout_end at the end of CS. */
        if (ctx->b.streamout.begin_emitted) {
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c 
b/src/gallium/drivers/radeon/r600_pipe_common.c
index 32bd6e4..f587332 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -156,14 +156,8 @@ static void r600_memory_barrier(struct pipe_context *ctx, 
unsigned flags)
 void r600_preflush_suspend_features(struct r600_common_context *ctx)
 {
        /* suspend 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);
+       if (!LIST_IS_EMPTY(&ctx->active_queries))
+               r600_suspend_queries(ctx);
 
        ctx->streamout.suspended = false;
        if (ctx->streamout.begin_emitted) {
@@ -180,12 +174,8 @@ 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 (ctx->nontimer_queries_suspended_by_flush) {
-               ctx->nontimer_queries_suspended_by_flush = false;
-               r600_resume_nontimer_queries(ctx);
-       }
+       if (!LIST_IS_EMPTY(&ctx->active_queries))
+               r600_resume_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 57af0ff..c387922 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -428,18 +428,11 @@ struct r600_common_context {
        unsigned flags; /* flush flags */
 
        /* Queries. */
-       /* The list of active queries. */
+       /* Maintain the list of active queries for pausing between IBs. */
        int                             num_occlusion_queries;
        int                             num_perfect_occlusion_queries;
-       /* Keep track of non-timer queries, because they should be suspended
-        * during context flushing.
-        * The timer queries (TIME_ELAPSED) shouldn't be suspended for blits,
-        * but they should be suspended between IBs. */
-       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;
+       struct list_head                active_queries;
+       unsigned                        num_cs_dw_queries_suspend;
        /* Additional hardware info. */
        unsigned                        backend_mask;
        unsigned                        max_db; /* for OQ */
@@ -569,10 +562,8 @@ void r600_perfcounters_destroy(struct r600_common_screen 
*rscreen);
 /* r600_query.c */
 void r600_init_screen_query_functions(struct r600_common_screen *rscreen);
 void r600_query_init(struct r600_common_context *rctx);
-void r600_suspend_nontimer_queries(struct r600_common_context *ctx);
-void r600_resume_nontimer_queries(struct r600_common_context *ctx);
-void r600_suspend_timer_queries(struct r600_common_context *ctx);
-void r600_resume_timer_queries(struct r600_common_context *ctx);
+void r600_suspend_queries(struct r600_common_context *ctx);
+void r600_resume_queries(struct r600_common_context *ctx);
 void r600_query_init_backend_mask(struct r600_common_context *ctx);
 
 /* r600_streamout.c */
diff --git a/src/gallium/drivers/radeon/r600_query.c 
b/src/gallium/drivers/radeon/r600_query.c
index 7a2d2ee..aa86560 100644
--- a/src/gallium/drivers/radeon/r600_query.c
+++ b/src/gallium/drivers/radeon/r600_query.c
@@ -516,10 +516,7 @@ static void r600_query_hw_emit_start(struct 
r600_common_context *ctx,
 
        query->ops->emit_start(ctx, query, query->buffer.buf, va);
 
-       if (query->flags & R600_QUERY_HW_FLAG_TIMER)
-               ctx->num_cs_dw_timer_queries_suspend += query->num_cs_dw_end;
-       else
-               ctx->num_cs_dw_nontimer_queries_suspend += query->num_cs_dw_end;
+       ctx->num_cs_dw_queries_suspend += query->num_cs_dw_end;
 }
 
 static void r600_query_hw_do_emit_stop(struct r600_common_context *ctx,
@@ -590,12 +587,8 @@ static void r600_query_hw_emit_stop(struct 
r600_common_context *ctx,
 
        query->buffer.results_end += query->result_size;
 
-       if (!(query->flags & R600_QUERY_HW_FLAG_NO_START)) {
-               if (query->flags & R600_QUERY_HW_FLAG_TIMER)
-                       ctx->num_cs_dw_timer_queries_suspend -= 
query->num_cs_dw_end;
-               else
-                       ctx->num_cs_dw_nontimer_queries_suspend -= 
query->num_cs_dw_end;
-       }
+       if (!(query->flags & R600_QUERY_HW_FLAG_NO_START))
+               ctx->num_cs_dw_queries_suspend -= query->num_cs_dw_end;
 
        r600_update_occlusion_query_state(ctx, query->b.type, -1);
        r600_update_prims_generated_query_state(ctx, query->b.type, -1);
@@ -730,11 +723,8 @@ boolean r600_query_hw_begin(struct r600_common_context 
*rctx,
 
        r600_query_hw_emit_start(rctx, query);
 
-       if (query->flags & R600_QUERY_HW_FLAG_TIMER)
-               LIST_ADDTAIL(&query->list, &rctx->active_timer_queries);
-       else
-               LIST_ADDTAIL(&query->list, &rctx->active_nontimer_queries);
-   return true;
+       LIST_ADDTAIL(&query->list, &rctx->active_queries);
+       return true;
 }
 
 static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
@@ -973,28 +963,14 @@ static void r600_render_condition(struct pipe_context 
*ctx,
        rctx->set_atom_dirty(rctx, atom, query != NULL);
 }
 
-static void r600_suspend_queries(struct r600_common_context *ctx,
-                                struct list_head *query_list,
-                                unsigned *num_cs_dw_queries_suspend)
+void r600_suspend_queries(struct r600_common_context *ctx)
 {
        struct r600_query_hw *query;
 
-       LIST_FOR_EACH_ENTRY(query, query_list, list) {
+       LIST_FOR_EACH_ENTRY(query, &ctx->active_queries, list) {
                r600_query_hw_emit_stop(ctx, query);
        }
-       assert(*num_cs_dw_queries_suspend == 0);
-}
-
-void r600_suspend_nontimer_queries(struct r600_common_context *ctx)
-{
-       r600_suspend_queries(ctx, &ctx->active_nontimer_queries,
-                            &ctx->num_cs_dw_nontimer_queries_suspend);
-}
-
-void r600_suspend_timer_queries(struct r600_common_context *ctx)
-{
-       r600_suspend_queries(ctx, &ctx->active_timer_queries,
-                            &ctx->num_cs_dw_timer_queries_suspend);
+       assert(ctx->num_cs_dw_queries_suspend == 0);
 }
 
 static unsigned r600_queries_num_cs_dw_for_resuming(struct r600_common_context 
*ctx,
@@ -1022,35 +998,21 @@ static unsigned 
r600_queries_num_cs_dw_for_resuming(struct r600_common_context *
        return num_dw;
 }
 
-static void r600_resume_queries(struct r600_common_context *ctx,
-                               struct list_head *query_list,
-                               unsigned *num_cs_dw_queries_suspend)
+void r600_resume_queries(struct r600_common_context *ctx)
 {
        struct r600_query_hw *query;
-       unsigned num_cs_dw = r600_queries_num_cs_dw_for_resuming(ctx, 
query_list);
+       unsigned num_cs_dw = r600_queries_num_cs_dw_for_resuming(ctx, 
&ctx->active_queries);
 
-       assert(*num_cs_dw_queries_suspend == 0);
+       assert(ctx->num_cs_dw_queries_suspend == 0);
 
        /* Check CS space here. Resuming must not be interrupted by flushes. */
        ctx->need_gfx_cs_space(&ctx->b, num_cs_dw, TRUE);
 
-       LIST_FOR_EACH_ENTRY(query, query_list, list) {
+       LIST_FOR_EACH_ENTRY(query, &ctx->active_queries, list) {
                r600_query_hw_emit_start(ctx, query);
        }
 }
 
-void r600_resume_nontimer_queries(struct r600_common_context *ctx)
-{
-       r600_resume_queries(ctx, &ctx->active_nontimer_queries,
-                           &ctx->num_cs_dw_nontimer_queries_suspend);
-}
-
-void r600_resume_timer_queries(struct r600_common_context *ctx)
-{
-       r600_resume_queries(ctx, &ctx->active_timer_queries,
-                           &ctx->num_cs_dw_timer_queries_suspend);
-}
-
 /* Get backends mask */
 void r600_query_init_backend_mask(struct r600_common_context *ctx)
 {
@@ -1274,8 +1236,7 @@ void r600_query_init(struct r600_common_context *rctx)
        if (((struct 
r600_common_screen*)rctx->b.screen)->info.num_render_backends > 0)
            rctx->b.render_condition = r600_render_condition;
 
-       LIST_INITHEAD(&rctx->active_nontimer_queries);
-       LIST_INITHEAD(&rctx->active_timer_queries);
+       LIST_INITHEAD(&rctx->active_queries);
 }
 
 void r600_init_screen_query_functions(struct r600_common_screen *rscreen)
-- 
2.5.0

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

Reply via email to