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