[Mesa-dev] [PATCH 2/2] i965: Order write of query availablity with earlier writes

Chris Wilson chris at chris-wilson.co.uk
Fri Oct 7 08:38:46 UTC 2016


Currently we signal the availabilty of the query result using an
unordered pipe-control write. As it is unordered, it may be executed
before the write of the query result itself - and so an observer may
read the query result too early. Fix this by requesting that the write
of the availablity flag is ordered after earlier pipe control writes.

Testcase: piglit/arb_query_buffer_object-qbo/*async*
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 src/mesa/drivers/dri/i965/gen6_queryobj.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/gen6_queryobj.c b/src/mesa/drivers/dri/i965/gen6_queryobj.c
index bbd3c44..f6b90f7 100644
--- a/src/mesa/drivers/dri/i965/gen6_queryobj.c
+++ b/src/mesa/drivers/dri/i965/gen6_queryobj.c
@@ -60,8 +60,16 @@ set_query_availability(struct brw_context *brw, struct brw_query_object *query,
     */
    if (brw->ctx.Extensions.ARB_query_buffer_object &&
        brw_is_query_pipelined(query)) {
-      brw_emit_pipe_control_write(brw,
-                                  PIPE_CONTROL_WRITE_IMMEDIATE,
+      unsigned flags = PIPE_CONTROL_WRITE_IMMEDIATE;
+
+      if (available)
+         /* Order available *after* the query results */
+         flags |= PIPE_CONTROL_FLUSH_ENABLE;
+      else
+         /* Make it unavailable *before* any pipelined reads */
+         flags |= PIPE_CONTROL_CS_STALL;
+
+      brw_emit_pipe_control_write(brw, flags,
                                   query->bo, 2 * sizeof(uint64_t),
                                   available, 0);
    }
-- 
2.9.3



More information about the mesa-dev mailing list