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

Carl Worth cworth at cworth.org
Mon Dec 17 14:24:38 PST 2012


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
---
 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);
 
-- 
1.7.10.4



More information about the mesa-dev mailing list