[Mesa-dev] [PATCH] i965: fix timer query on gen6+

Zou Nan hai nanhai.zou at intel.com
Tue Jul 19 09:14:16 PDT 2011


	on gen6+, render engine PIPE_CONTROL reported time stamp is a 64 bits
value (high 32 bits MBZ on snb), toggles every 80 ns.

Signed-off-by: Zou Nan hai <nanhai.zou at intel.com>
---
 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..85a2a61 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -47,7 +47,7 @@
 
 /** 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 brw_query_object *query, int gen)
 {
    int i;
    uint64_t *results;
@@ -58,7 +58,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 (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++) {
@@ -200,17 +203,21 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
 static void brw_wait_query(struct gl_context *ctx, struct gl_query_object *q)
 {
    struct brw_query_object *query = (struct brw_query_object *)q;
+   struct brw_context *brw = brw_context(ctx);
+   struct intel_context *intel = intel_context(ctx);
 
-   brw_queryobj_get_results(query);
are are +   brw_queryobj_get_results(query, intel->gen);
    query->Base.Ready = GL_TRUE;
 }
 
 static void brw_check_query(struct gl_context *ctx, struct gl_query_object *q)
 {
    struct brw_query_object *query = (struct brw_query_object *)q;
+   struct brw_context *brw = brw_context(ctx);
+   struct intel_context *intel = intel_context(ctx);
 
    if (query->bo == NULL || !drm_intel_bo_busy(query->bo)) {
-      brw_queryobj_get_results(query);
+      brw_queryobj_get_results(query, intel->gen);
       query->Base.Ready = GL_TRUE;
    }
 }
@@ -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(query, intel->gen);
       drm_intel_bo_reference(brw->query.bo);
       query->bo = brw->query.bo;
       query->first_index = brw->query.index;
-- 
1.7.1



More information about the mesa-dev mailing list