i965: Order write of query availablity with earlier writes
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 6 Oct 2016 20:07:18 +0000 (21:07 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Sat, 3 Jun 2017 12:38:45 +0000 (13:38 +0100)
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@chris-wilson.co.uk>
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
src/mesa/drivers/dri/i965/gen6_queryobj.c

index cb4f46c28be2d8c328054e5e4a28c19f9ea334e7..a28f83af1d6817b69ffa5e9af834b912cf8931eb 100644 (file)
@@ -60,8 +60,17 @@ 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);
    }