Hi, Attached is a patch that implements asyncronous queries for r600g.
Please review and may be apply. Mathias
From fd2aee0640211373c144b666b265a085b064383c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <[email protected]> Date: Sun, 23 Jan 2011 22:16:56 +0100 Subject: [PATCH 2/3] r600g: Implement asyncronous query results. --- src/gallium/winsys/r600/drm/r600_hw_context.c | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c b/src/gallium/winsys/r600/drm/r600_hw_context.c index 8966956..61d09a6 100644 --- a/src/gallium/winsys/r600/drm/r600_hw_context.c +++ b/src/gallium/winsys/r600/drm/r600_hw_context.c @@ -1246,13 +1246,19 @@ out_err: bof_decref(root); } -static void r600_query_result(struct r600_context *ctx, struct r600_query *query) +static boolean r600_query_result(struct r600_context *ctx, struct r600_query *query, boolean wait) { u64 start, end; u32 *results; int i; - results = r600_bo_map(ctx->radeon, query->buffer, 0, NULL); + if (wait) + results = r600_bo_map(ctx->radeon, query->buffer, PB_USAGE_CPU_READ, NULL); + else + results = r600_bo_map(ctx->radeon, query->buffer, PB_USAGE_DONTBLOCK | PB_USAGE_CPU_READ, NULL); + if (!results) + return FALSE; + for (i = 0; i < query->num_results; i += 4) { start = (u64)results[i] | (u64)results[i + 1] << 32; end = (u64)results[i + 2] | (u64)results[i + 3] << 32; @@ -1262,6 +1268,8 @@ static void r600_query_result(struct r600_context *ctx, struct r600_query *query } r600_bo_unmap(ctx->radeon, query->buffer); query->num_results = 0; + + return TRUE; } void r600_query_begin(struct r600_context *ctx, struct r600_query *query) @@ -1275,7 +1283,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query) /* if query buffer is full force a flush */ if (query->num_results*4 >= query->buffer_size - 16) { r600_context_flush(ctx); - r600_query_result(ctx, query); + r600_query_result(ctx, query, TRUE); } /* emit begin query */ @@ -1355,7 +1363,8 @@ boolean r600_context_query_result(struct r600_context *ctx, if (query->num_results) { r600_context_flush(ctx); } - r600_query_result(ctx, query); + if (!r600_query_result(ctx, query, wait)) + return FALSE; *result = query->result; query->result = 0; return TRUE; -- 1.7.3.4
_______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
