summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r600
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/r600')
-rw-r--r--src/gallium/drivers/r600/evergreen_hw_context.c2
-rw-r--r--src/gallium/drivers/r600/r600.h11
-rw-r--r--src/gallium/drivers/r600/r600_hw_context.c33
-rw-r--r--src/gallium/drivers/r600/r600_query.c5
4 files changed, 19 insertions, 32 deletions
diff --git a/src/gallium/drivers/r600/evergreen_hw_context.c b/src/gallium/drivers/r600/evergreen_hw_context.c
index 3779dd480f8..72ec5630b9a 100644
--- a/src/gallium/drivers/r600/evergreen_hw_context.c
+++ b/src/gallium/drivers/r600/evergreen_hw_context.c
@@ -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);
diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h
index ea9a2d658c2..f58549afb4d 100644
--- a/src/gallium/drivers/r600/r600.h
+++ b/src/gallium/drivers/r600/r600.h
@@ -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 */
diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c
index aec537f82da..e9c61875429 100644
--- a/src/gallium/drivers/r600/r600_hw_context.c
+++ b/src/gallium/drivers/r600/r600_hw_context.c
@@ -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);
}
}
diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c
index e3512f7b1a6..a632ef4615b 100644
--- a/src/gallium/drivers/r600/r600_query.c
+++ b/src/gallium/drivers/r600/r600_query.c
@@ -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,