r600g: only maintain the list of active queries
authorMarek Olšák <maraeo@gmail.com>
Fri, 28 Oct 2011 16:27:00 +0000 (18:27 +0200)
committerMarek Olšák <maraeo@gmail.com>
Fri, 28 Oct 2011 17:29:05 +0000 (19:29 +0200)
And not all existing queries. The only reason we have that list is to be able
to suspend and resume the active ones.

This reduces looping over queries when suspending and resuming.
The queries no longer have to track some of their states.

src/gallium/drivers/r600/evergreen_hw_context.c
src/gallium/drivers/r600/r600.h
src/gallium/drivers/r600/r600_hw_context.c
src/gallium/drivers/r600/r600_query.c

index 3779dd480f84f3b3141b1d19298d7b94afe7837f..72ec5630b9a0afbd0a81e221413dbf8848e5b4e3 100644 (file)
@@ -905,7 +905,7 @@ int evergreen_context_init(struct r600_context *ctx, struct r600_screen *screen)
        memset(ctx, 0, sizeof(struct r600_context));
        ctx->screen = screen;
 
-       LIST_INITHEAD(&ctx->query_list);
+       LIST_INITHEAD(&ctx->active_query_list);
 
        /* init dirty list */
        LIST_INITHEAD(&ctx->dirty);
index ea9a2d658c2443af63eb5667b744db93c1db2b29..f58549afb4ddb0093c18f1454bfa32b167c1d652 100644 (file)
@@ -179,7 +179,7 @@ struct r600_query {
        /* Count of new queries started in one stream without flushing */
        unsigned                                queries_emitted;
        /* State flags */
-       unsigned                                state;
+       boolean                                 flushed;
        /* The buffer where query results are stored. It's used as a ring,
         * data blocks for current query are stored sequentially from
         * results_start to results_end, with wrapping on the buffer end */
@@ -188,11 +188,6 @@ struct r600_query {
        struct list_head                        list;
 };
 
-#define R600_QUERY_STATE_STARTED       (1 << 0)
-#define R600_QUERY_STATE_ENDED         (1 << 1)
-#define R600_QUERY_STATE_SUSPENDED     (1 << 2)
-#define R600_QUERY_STATE_FLUSHED       (1 << 3)
-
 #define R600_CONTEXT_DRAW_PENDING      (1 << 0)
 #define R600_CONTEXT_DST_CACHES_DIRTY  (1 << 1)
 #define R600_CONTEXT_CHECK_EVENT_FLUSH (1 << 2)
@@ -218,7 +213,9 @@ struct r600_context {
        u32                     *pm4;
        unsigned                pm4_cdwords;
 
-       struct list_head        query_list;
+       /* The list of active queries. Only one query of each type can be active. */
+       struct list_head        active_query_list;
+
        unsigned                num_query_running;
        unsigned                backend_mask;
        unsigned                max_db; /* for OQ */
index aec537f82da1cf6f2b2a5da217729fd9017a6241..e9c61875429780ca540c858b4f586aa4e33b650a 100644 (file)
@@ -832,7 +832,7 @@ int r600_context_init(struct r600_context *ctx, struct r600_screen *screen)
        memset(ctx, 0, sizeof(struct r600_context));
        ctx->screen = screen;
 
-       LIST_INITHEAD(&ctx->query_list);
+       LIST_INITHEAD(&ctx->active_query_list);
 
        /* init dirty list */
        LIST_INITHEAD(&ctx->dirty);
@@ -1623,7 +1623,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
                /* Count queries emitted without flushes, and flush if more than
                 * half of buffer used, to avoid overwriting results which may be
                 * still in use. */
-               if (query->state & R600_QUERY_STATE_FLUSHED) {
+               if (query->flushed) {
                        query->queries_emitted = 1;
                } else {
                        if (++query->queries_emitted > query->buffer->b.b.b.width0 / query->result_size / 2)
@@ -1637,7 +1637,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
 
        /* collect current results if query buffer is full */
        if (new_results_end == query->results_start) {
-               if (!(query->state & R600_QUERY_STATE_FLUSHED))
+               if (!query->flushed)
                        r600_context_flush(ctx, 0);
                r600_query_result(ctx, query, TRUE);
        }
@@ -1684,8 +1684,6 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0, 0);
        ctx->pm4[ctx->pm4_cdwords++] = r600_context_bo_reloc(ctx, query->buffer, RADEON_USAGE_WRITE);
 
-       query->state |= R600_QUERY_STATE_STARTED;
-       query->state ^= R600_QUERY_STATE_ENDED;
        ctx->num_query_running++;
 }
 
@@ -1717,9 +1715,7 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query)
        if (query->results_end >= query->buffer->b.b.b.width0)
                query->results_end = 0;
 
-       query->state ^= R600_QUERY_STATE_STARTED;
-       query->state |= R600_QUERY_STATE_ENDED;
-       query->state &= ~R600_QUERY_STATE_FLUSHED;
+       query->flushed = FALSE;
 
        ctx->num_query_running--;
 }
@@ -1806,15 +1802,12 @@ struct r600_query *r600_context_query_create(struct r600_context *ctx, unsigned
                FREE(query);
                return NULL;
        }
-
-       LIST_ADDTAIL(&query->list, &ctx->query_list);
        return query;
 }
 
 void r600_context_query_destroy(struct r600_context *ctx, struct r600_query *query)
 {
        pipe_resource_reference((struct pipe_resource**)&query->buffer, NULL);
-       LIST_DELINIT(&query->list);
        free(query);
 }
 
@@ -1824,7 +1817,7 @@ boolean r600_context_query_result(struct r600_context *ctx,
 {
        uint64_t *result = (uint64_t*)vresult;
 
-       if (!(query->state & R600_QUERY_STATE_FLUSHED)) {
+       if (!query->flushed) {
                r600_context_flush(ctx, 0);
        }
        if (!r600_query_result(ctx, query, wait))
@@ -1849,11 +1842,8 @@ void r600_context_queries_suspend(struct r600_context *ctx)
 {
        struct r600_query *query;
 
-       LIST_FOR_EACH_ENTRY(query, &ctx->query_list, list) {
-               if (query->state & R600_QUERY_STATE_STARTED) {
-                       r600_query_end(ctx, query);
-                       query->state |= R600_QUERY_STATE_SUSPENDED;
-               }
+       LIST_FOR_EACH_ENTRY(query, &ctx->active_query_list, list) {
+               r600_query_end(ctx, query);
        }
 }
 
@@ -1861,13 +1851,10 @@ void r600_context_queries_resume(struct r600_context *ctx, boolean flushed)
 {
        struct r600_query *query;
 
-       LIST_FOR_EACH_ENTRY(query, &ctx->query_list, list) {
+       LIST_FOR_EACH_ENTRY(query, &ctx->active_query_list, list) {
                if (flushed)
-                       query->state |= R600_QUERY_STATE_FLUSHED;
+                       query->flushed = TRUE;
 
-               if (query->state & R600_QUERY_STATE_SUSPENDED) {
-                       r600_query_begin(ctx, query);
-                       query->state ^= R600_QUERY_STATE_SUSPENDED;
-               }
+               r600_query_begin(ctx, query);
        }
 }
index e3512f7b1a66a5c3435b9735ace3e3953ae6bc40..a632ef4615b33295c6ebfb6ed07a2391b6421350 100644 (file)
@@ -45,13 +45,16 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query)
        rquery->result = 0;
        rquery->results_start = rquery->results_end;
        r600_query_begin(&rctx->ctx, (struct r600_query *)query);
+       LIST_ADDTAIL(&rquery->list, &rctx->ctx.active_query_list);
 }
 
 static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
 {
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
+       struct r600_query *rquery = (struct r600_query *)query;
 
-       r600_query_end(&rctx->ctx, (struct r600_query *)query);
+       r600_query_end(&rctx->ctx, rquery);
+       LIST_DELINIT(&rquery->list);
 }
 
 static boolean r600_get_query_result(struct pipe_context *ctx,