iris: check query first
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 27 Nov 2018 22:20:48 +0000 (14:20 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:10 +0000 (10:26 -0800)
this lets us avoid the predicate bit in more cases, which is nice

src/gallium/drivers/iris/iris_query.c

index 27126d7f7bc7e4e2f9ece377d42ea2a4c06288ed..61b0e27a0cb359b992bd8772a721d935a12afe09 100644 (file)
@@ -546,6 +546,21 @@ iris_end_query(struct pipe_context *ctx, struct pipe_query *query)
    return true;
 }
 
+/**
+ * See if the snapshots have landed for a query, and if so, compute the
+ * result and mark it ready.  Does not flush (unlike iris_get_query_result).
+ */
+static void
+iris_check_query_no_flush(struct iris_context *ice, struct iris_query *q)
+{
+   struct iris_screen *screen = (void *) ice->ctx.screen;
+   const struct gen_device_info *devinfo = &screen->devinfo;
+
+   if (!q->ready && q->map->snapshots_landed) {
+      calculate_result_on_cpu(devinfo, q);
+   }
+}
+
 static boolean
 iris_get_query_result(struct pipe_context *ctx,
                       struct pipe_query *query,
@@ -815,6 +830,8 @@ iris_render_condition(struct pipe_context *ctx,
       return;
    }
 
+   iris_check_query_no_flush(ice, q);
+
    if (q->result || q->ready)
       set_predicate_enable(ice, (q->result != 0) ^ condition);
    else