i965: Fix timer query on gen6+
authorZou Nan hai <nanhai.zou@intel.com>
Wed, 20 Jul 2011 16:12:59 +0000 (00:12 +0800)
committerEric Anholt <eric@anholt.net>
Mon, 10 Oct 2011 18:38:52 +0000 (11:38 -0700)
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@intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_queryobj.c

index b41d05dd438adb07f0350543d153b72f1d9cbacc..08492d6b1118b475d3888007ff4c2d1860aaa930 100644 (file)
 
 /** 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;