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) {
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);
/* 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);
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;
/* 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)
/* 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);
}
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++;
}
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--;
}
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);
}
{
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;
{
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);
}
}
{
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);
}
}