Mesa (master): i965: Fix timer query on gen6+
Eric Anholt
anholt at kemper.freedesktop.org
Mon Oct 10 18:44:27 UTC 2011
Module: Mesa
Branch: master
Commit: 7457da5edd4a33c2581f10608ce5bcf0e254c5f9
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7457da5edd4a33c2581f10608ce5bcf0e254c5f9
Author: Zou Nan hai <nanhai.zou at intel.com>
Date: Thu Jul 21 00:12:59 2011 +0800
i965: Fix timer query on gen6+
PIPE_CONTROL reported time stamp are 64 bits value incrementing every
80 ns, and only the low 32 bits are active (high 32 are always 0).
v2: Cleaned up whitespace, function arguments (anholt).
Fixes piglit EXT_timer_query/time-elapsed
Signed-off-by: Zou Nan hai <nanhai.zou at intel.com>
Signed-off-by: Eric Anholt <eric at anholt.net>
---
src/mesa/drivers/dri/i965/brw_queryobj.c | 17 ++++++++++++-----
1 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
index b41d05d..08492d6 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -47,8 +47,11 @@
/** Waits on the query object's BO and totals the results for this query */
static void
-brw_queryobj_get_results(struct brw_query_object *query)
+brw_queryobj_get_results(struct gl_context *ctx,
+ struct brw_query_object *query)
{
+ struct intel_context *intel = intel_context(ctx);
+
int i;
uint64_t *results;
@@ -58,7 +61,10 @@ brw_queryobj_get_results(struct brw_query_object *query)
drm_intel_bo_map(query->bo, GL_FALSE);
results = query->bo->virtual;
if (query->Base.Target == GL_TIME_ELAPSED_EXT) {
- query->Base.Result += 1000 * ((results[1] >> 32) - (results[0] >> 32));
+ if (intel->gen >= 6)
+ query->Base.Result += 80 * (results[1] - results[0]);
+ else
+ query->Base.Result += 1000 * ((results[1] >> 32) - (results[0] >> 32));
} else {
/* Map and count the pixels from the current query BO */
for (i = query->first_index; i <= query->last_index; i++) {
@@ -201,7 +207,7 @@ static void brw_wait_query(struct gl_context *ctx, struct gl_query_object *q)
{
struct brw_query_object *query = (struct brw_query_object *)q;
- brw_queryobj_get_results(query);
+ brw_queryobj_get_results(ctx, query);
query->Base.Ready = GL_TRUE;
}
@@ -210,7 +216,7 @@ static void brw_check_query(struct gl_context *ctx, struct gl_query_object *q)
struct brw_query_object *query = (struct brw_query_object *)q;
if (query->bo == NULL || !drm_intel_bo_busy(query->bo)) {
- brw_queryobj_get_results(query);
+ brw_queryobj_get_results(ctx, query);
query->Base.Ready = GL_TRUE;
}
}
@@ -249,6 +255,7 @@ void
brw_emit_query_begin(struct brw_context *brw)
{
struct intel_context *intel = &brw->intel;
+ struct gl_context *ctx = &intel->ctx;
struct brw_query_object *query = brw->query.obj;
/* Skip if we're not doing any queries, or we've emitted the start. */
@@ -295,7 +302,7 @@ brw_emit_query_begin(struct brw_context *brw)
if (query->bo != brw->query.bo) {
if (query->bo != NULL)
- brw_queryobj_get_results(query);
+ brw_queryobj_get_results(ctx, query);
drm_intel_bo_reference(brw->query.bo);
query->bo = brw->query.bo;
query->first_index = brw->query.index;
More information about the mesa-commit
mailing list