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

Kenneth Graunke kenneth at whitecape.org
Wed Jul 20 11:12:56 PDT 2011


On 07/20/2011 09:12 AM, Zou Nan hai wrote:
> 	on gen6+, PIPE_CONTROL reported time stamp are 64 bits
> 	value (high 32 bits MBZ on snb), toggles every 80 ns.
> 
> 	Signed-off-by: Zou Nan hai <nanhai.zou at intel.com>

This seems correct to me.  The Sandybridge PRM, Volume 1, Part 3,
section 1.1.10.10 "TIMESTAMP - Reported Timestamp Count", does seem to
agree with your code.  The Ironlake PRM seems to have inaccurate info
(it lists the SNB field as Project: All), but the G45 PRM, Volume 1a,
section 8.16.10 does have the old U64 version.

That said, I haven't found the justification for the * 1000, nor why
we're only using 32-bits of the U64 counter (in the pre-gen6 code).

Please include spec references for things like this, it makes it a lot
easier to verify the changes.

--Kenneth

> ---
>  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..2e04fc2 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);
> +   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;



More information about the mesa-dev mailing list