[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