r600g: get backend mask after the context is fully set up
[mesa.git] / src / gallium / drivers / r600 / r600_hw_context.c
index d6dce2c1fd7dd3bf2d3acfcac2dd540c6f8ab312..ca245f0100211932b612adf1d483b9db948b3994 100644 (file)
@@ -88,9 +88,6 @@ void r600_get_backend_mask(struct r600_context *ctx)
                ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0, 0);
                ctx->pm4[ctx->pm4_cdwords++] = r600_context_bo_reloc(ctx, buffer, RADEON_USAGE_WRITE);
 
-               /* execute */
-               r600_context_flush(ctx, 0);
-
                /* analyze results */
                results = ctx->screen->ws->buffer_map(buffer->buf, ctx->cs, PIPE_TRANSFER_READ);
                if (results) {
@@ -835,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);
@@ -925,8 +922,6 @@ int r600_context_init(struct r600_context *ctx, struct r600_screen *screen)
        /* save 16dwords space for fence mecanism */
        ctx->pm4_ndwords -= 16;
        ctx->max_db = 4;
-
-       r600_get_backend_mask(ctx);
        return 0;
 out_err:
        r600_context_fini(ctx);
@@ -1571,20 +1566,17 @@ void r600_context_emit_fence(struct r600_context *ctx, struct r600_resource *fen
 static boolean r600_query_result(struct r600_context *ctx, struct r600_query *query, boolean wait)
 {
        unsigned results_base = query->results_start;
-       u64 start, end;
-       u32 *results, *current_result;
+       u32 *map;
 
-       if (wait)
-               results = ctx->screen->ws->buffer_map(query->buffer->buf, ctx->cs, PIPE_TRANSFER_READ);
-       else
-               results = ctx->screen->ws->buffer_map(query->buffer->buf, ctx->cs, PIPE_TRANSFER_DONTBLOCK | PIPE_TRANSFER_READ);
-       if (!results)
+       map = ctx->screen->ws->buffer_map(query->buffer->buf, ctx->cs,
+                                         PIPE_TRANSFER_READ | (wait ? 0 : PIPE_TRANSFER_DONTBLOCK));
+       if (!map)
                return FALSE;
 
-
        /* count all results across all data blocks */
        while (results_base != query->results_end) {
-               current_result = (u32*)((char*)results + results_base);
+               u64 start, end;
+               u32 *current_result = (u32*)((char*)map + results_base);
 
                start = (u64)current_result[0] | (u64)current_result[1] << 32;
                end = (u64)current_result[2] | (u64)current_result[3] << 32;
@@ -1629,7 +1621,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)
@@ -1643,8 +1635,6 @@ 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))
-                       r600_context_flush(ctx, 0);
                r600_query_result(ctx, query, TRUE);
        }
 
@@ -1690,8 +1680,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++;
 }
 
@@ -1723,9 +1711,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--;
 }
@@ -1812,15 +1798,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);
 }
 
@@ -1830,9 +1813,6 @@ boolean r600_context_query_result(struct r600_context *ctx,
 {
        uint64_t *result = (uint64_t*)vresult;
 
-       if (!(query->state & R600_QUERY_STATE_FLUSHED)) {
-               r600_context_flush(ctx, 0);
-       }
        if (!r600_query_result(ctx, query, wait))
                return FALSE;
 
@@ -1855,11 +1835,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);
        }
 }
 
@@ -1867,13 +1844,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);
        }
 }