#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)
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;
}
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);
}
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;
rquery->result += end - start;
}
}
- radeon_bo_unmap(rscreen->rw, rquery->buffer);
+ radeon_ws_bo_unmap(rscreen->rw, rquery->buffer);
rquery->num_results = 0;
}
}
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;
}
{
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;
}
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);
}
}
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);
}
}
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;
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;