i965: Force even an empty query to flush all previous queries.
authorCarl Worth <cworth@cworth.org>
Thu, 13 Dec 2012 23:23:10 +0000 (15:23 -0800)
committerCarl Worth <cworth@cworth.org>
Tue, 15 Jan 2013 21:34:18 +0000 (13:34 -0800)
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).

This fixes the following es3conform test:

occlusion_query_query_order

as well as the following piglit test:

occlusion_query_order

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/dri/i965/brw_queryobj.c

index b6143f9..cd9c848 100644 (file)
@@ -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);