[Mesa-dev] [PATCH 4/4] i965: Force even an empty query to flush all previous queries.

Ian Romanick idr at freedesktop.org
Mon Dec 17 16:01:55 PST 2012


On 12/17/2012 02:24 PM, Carl Worth wrote:
> The specification requires that query results are processed in order, (when
> one query result is returned, all previous query of the same type must also be
> available). The implementation was failing this requirement in the case of
> BeginQuery and EndQuery with no intervening drawing, (the result would be made
> available immediately without flushing previous queries).

Do we potentially have this same problem for timer queries?

> This fixes the following es3conform test:
>
> 	occlusion_query_query_order
> ---
>   src/mesa/drivers/dri/i965/brw_queryobj.c |   17 +++++++++++++++++
>   1 file changed, 17 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
> index b6143f9..4923ecc 100644
> --- a/src/mesa/drivers/dri/i965/brw_queryobj.c
> +++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
> @@ -320,6 +320,23 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
>      case GL_ANY_SAMPLES_PASSED:
>      case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
>      case GL_SAMPLES_PASSED_ARB:
> +
> +      /* No query->bo means that EndQuery was called after BeginQuery with no
> +       * intervening drawing. Rather than doing nothing at all here in this
> +       * case, we emit the query_begin and query_end state to the
> +       * hardware. This is to guarantee that waiting on the result of this
> +       * empty state will cause all previous queries to complete at all, as
> +       * required by the specification:
> +       *
> +       * 	It must always be true that if any query object
> +       *	returns a result available of TRUE, all queries of the
> +       *	same type issued prior to that query must also return
> +       *	TRUE. [Open GL 4.3 (Core Profile) Section 4.2.1]
> +       */
> +      if (!query->bo) {
> +         brw_emit_query_begin(brw);
> +      }
> +
>         if (query->bo) {
>   	 brw_emit_query_end(brw);
>
>



More information about the mesa-dev mailing list