Mesa (master): r600g: Implement asyncronous query results.

Alex Deucher agd5f at kemper.freedesktop.org
Tue Jan 25 19:19:50 UTC 2011


Module: Mesa
Branch: master
Commit: e7ec53273547335863b2377bea9d35aa9c114c6b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e7ec53273547335863b2377bea9d35aa9c114c6b

Author: Mathias Fröhlich <Mathias.Froehlich at web.de>
Date:   Sun Jan 23 22:16:56 2011 +0100

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 a589ef8..96e4090 100644
--- a/src/gallium/winsys/r600/drm/r600_hw_context.c
+++ b/src/gallium/winsys/r600/drm/r600_hw_context.c
@@ -1247,13 +1247,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;
@@ -1263,6 +1269,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)
@@ -1276,7 +1284,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 */
@@ -1356,7 +1364,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;




More information about the mesa-commit mailing list