r600g: move constant buffer creation behind winsys abstraction.
[mesa.git] / src / gallium / drivers / r600 / r600_query.c
index af857101e3caec99c3fd71f30fe6e0ccc2748f8c..12900cce1145c9455b17ac91c30d47c90b6e5481 100644 (file)
 #include "r600_screen.h"
 #include "r600_context.h"
 
-static struct radeon_state *r600_query_begin(struct r600_context *rctx, struct r600_query *rquery)
+static void r600_query_begin(struct r600_context *rctx, struct r600_query *rquery)
 {
        struct r600_screen *rscreen = rctx->screen;
-       struct radeon_state *rstate;
+       struct radeon_state *rstate = &rquery->rstate;
 
-       rstate = radeon_state(rscreen->rw, R600_STATE_QUERY_BEGIN, 0);
-       if (rstate == NULL)
-               return NULL;
+       radeon_state_fini(rstate);
+       radeon_state_init(rstate, rscreen->rw, R600_STATE_QUERY_BEGIN, 0, 0);
        rstate->states[R600_QUERY__OFFSET] = rquery->num_results;
-       rstate->bo[0] = radeon_bo_incref(rscreen->rw, rquery->buffer);
+       radeon_ws_bo_reference(rscreen->rw, &rstate->bo[0], rquery->buffer);
        rstate->nbo = 1;
        rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
        if (radeon_state_pm4(rstate)) {
-               radeon_state_decref(rstate);
-               return NULL;
+               radeon_state_fini(rstate);
        }
-       return rstate;
 }
 
-static struct radeon_state *r600_query_end(struct r600_context *rctx, struct r600_query *rquery)
+static void r600_query_end(struct r600_context *rctx, struct r600_query *rquery)
 {
        struct r600_screen *rscreen = rctx->screen;
-       struct radeon_state *rstate;
+       struct radeon_state *rstate = &rquery->rstate;
 
-       rstate = radeon_state(rscreen->rw, R600_STATE_QUERY_END, 0);
-       if (rstate == NULL)
-               return NULL;
+       radeon_state_fini(rstate);
+       radeon_state_init(rstate, rscreen->rw, R600_STATE_QUERY_END, 0, 0);
        rstate->states[R600_QUERY__OFFSET] = rquery->num_results + 8;
-       rstate->bo[0] = radeon_bo_incref(rscreen->rw, rquery->buffer);
+       radeon_ws_bo_reference(rscreen->rw, &rstate->bo[0], rquery->buffer);
        rstate->nbo = 1;
        rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
        if (radeon_state_pm4(rstate)) {
-               radeon_state_decref(rstate);
-               return NULL;
+               radeon_state_fini(rstate);
        }
-       return rstate;
 }
 
 static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned query_type)
@@ -83,14 +77,16 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned q
                return NULL;
 
        q->type = query_type;
-       LIST_ADDTAIL(&q->list, &rctx->query_list);
        q->buffer_size = 4096;
 
-       q->buffer = radeon_bo(rscreen->rw, 0, q->buffer_size, 1, NULL);
+       q->buffer = radeon_ws_bo(rscreen->rw, q->buffer_size, 1, 0);
        if (!q->buffer) {
                FREE(q);
                return NULL;
        }
+
+       LIST_ADDTAIL(&q->list, &rctx->query_list);
+
        return (struct pipe_query *)q;
 }
 
@@ -100,7 +96,7 @@ static void r600_destroy_query(struct pipe_context *ctx,
        struct r600_screen *rscreen = r600_screen(ctx->screen);
        struct r600_query *q = r600_query(query);
 
-       radeon_bo_decref(rscreen->rw, q->buffer);
+       radeon_ws_bo_reference(rscreen->rw, &q->buffer, NULL);
        LIST_DEL(&q->list);
        FREE(query);
 }
@@ -112,9 +108,8 @@ static void r600_query_result(struct pipe_context *ctx, struct r600_query *rquer
        u32 *results;
        int i;
 
-       radeon_bo_wait(rscreen->rw, rquery->buffer);
-       radeon_bo_map(rscreen->rw, rquery->buffer);
-       results = rquery->buffer->data;
+       radeon_ws_bo_wait(rscreen->rw, rquery->buffer);
+       results = radeon_ws_bo_map(rscreen->rw, rquery->buffer, 0, r600_context(ctx));
        for (i = 0; i < rquery->num_results; i += 4) {
                start = (u64)results[i] | (u64)results[i + 1] << 32;
                end = (u64)results[i + 2] | (u64)results[i + 3] << 32;
@@ -122,7 +117,7 @@ static void r600_query_result(struct pipe_context *ctx, struct r600_query *rquer
                        rquery->result += end - start;
                }
        }
-       radeon_bo_unmap(rscreen->rw, rquery->buffer);
+       radeon_ws_bo_unmap(rscreen->rw, rquery->buffer);
        rquery->num_results = 0;
 }
 
@@ -137,8 +132,7 @@ static void r600_query_resume(struct pipe_context *ctx, struct r600_query *rquer
                }
                r600_query_result(ctx, rquery);
        }
-       rquery->rstate = radeon_state_decref(rquery->rstate);
-       rquery->rstate = r600_query_begin(rctx, rquery);
+       r600_query_begin(rctx, rquery);
        rquery->flushed = false;
 }
 
@@ -146,8 +140,7 @@ static void r600_query_suspend(struct pipe_context *ctx, struct r600_query *rque
 {
        struct r600_context *rctx = r600_context(ctx);
 
-       rquery->rstate = radeon_state_decref(rquery->rstate);
-       rquery->rstate = r600_query_end(rctx, rquery);
+       r600_query_end(rctx, rquery);
        rquery->num_results += 16;
 }
 
@@ -161,12 +154,12 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query)
        rquery->num_results = 0;
        rquery->flushed = false;
        r600_query_resume(ctx, rquery);
-       r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+       r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
        if (r == -EBUSY) {
                /* this shouldn't happen */
                R600_ERR("had to flush while emitting end query\n");
                ctx->flush(ctx, 0, NULL);
-               r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+               r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
        }
 }
 
@@ -179,12 +172,12 @@ static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
        rquery->state &= ~R600_QUERY_STATE_STARTED;
        rquery->state |= R600_QUERY_STATE_ENDED;
        r600_query_suspend(ctx, rquery);
-       r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+       r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
        if (r == -EBUSY) {
                /* this shouldn't happen */
                R600_ERR("had to flush while emitting end query\n");
                ctx->flush(ctx, 0, NULL);
-               r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+               r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
        }
 }
 
@@ -197,12 +190,12 @@ void r600_queries_suspend(struct pipe_context *ctx)
        LIST_FOR_EACH_ENTRY(rquery, &rctx->query_list, list) {
                if (rquery->state & R600_QUERY_STATE_STARTED) {
                        r600_query_suspend(ctx, rquery);
-                       r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+                       r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
                        if (r == -EBUSY) {
                                /* this shouldn't happen */
                                R600_ERR("had to flush while emitting end query\n");
                                ctx->flush(ctx, 0, NULL);
-                               r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+                               r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
                        }
                }
                rquery->state |= R600_QUERY_STATE_SUSPENDED;
@@ -218,12 +211,12 @@ void r600_queries_resume(struct pipe_context *ctx)
        LIST_FOR_EACH_ENTRY(rquery, &rctx->query_list, list) {
                if (rquery->state & R600_QUERY_STATE_STARTED) {
                        r600_query_resume(ctx, rquery);
-                       r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+                       r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
                        if (r == -EBUSY) {
                                /* this shouldn't happen */
                                R600_ERR("had to flush while emitting end query\n");
                                ctx->flush(ctx, 0, NULL);
-                               r = radeon_ctx_set_query_state(rctx->ctx, rquery->rstate);
+                               r = radeon_ctx_set_query_state(rctx->ctx, &rquery->rstate);
                        }
                }
                rquery->state &= ~R600_QUERY_STATE_SUSPENDED;