Mesa (main): gallivm/st/lvp: add flags arg to get_query_result_resource api.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Feb 15 00:55:43 UTC 2022


Module: Mesa
Branch: main
Commit: 127bcbed18a4f739582291ded69f1dc9092de814
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=127bcbed18a4f739582291ded69f1dc9092de814

Author: Dave Airlie <airlied at redhat.com>
Date:   Sat Feb 12 10:48:51 2022 +1000

gallivm/st/lvp: add flags arg to get_query_result_resource api.

Currently this just has wait, but in order to get the right answer
for vulkan partial, lavapipe/llvmpipe need to pass a partial flag
through here in the future.

This just changes the API so that's possible.

v2: use an enum (zmike)

Acked-by: Ilia Mirkin <imirkin at alum.mit.edu>
Acked-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15009>

---

 src/gallium/auxiliary/driver_ddebug/dd_draw.c        |  8 ++++----
 src/gallium/auxiliary/driver_ddebug/dd_pipe.h        |  2 +-
 src/gallium/auxiliary/driver_noop/noop_state.c       |  2 +-
 src/gallium/auxiliary/driver_trace/tr_context.c      |  6 +++---
 src/gallium/auxiliary/driver_trace/tr_dump_defines.h |  9 +++++++++
 src/gallium/auxiliary/util/u_dump.h                  |  3 +++
 src/gallium/auxiliary/util/u_dump_defines.c          |  6 ++++++
 src/gallium/auxiliary/util/u_threaded_context.c      |  9 +++++----
 src/gallium/drivers/crocus/crocus_query.c            |  4 ++--
 src/gallium/drivers/iris/iris_query.c                |  4 ++--
 src/gallium/drivers/llvmpipe/lp_query.c              |  4 ++--
 src/gallium/drivers/nouveau/nvc0/nvc0_query.c        |  4 ++--
 src/gallium/drivers/nouveau/nvc0/nvc0_query.h        |  2 +-
 src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c     |  6 +++---
 src/gallium/drivers/r600/r600_query.c                | 10 +++++-----
 src/gallium/drivers/r600/r600_query.h                |  3 ++-
 src/gallium/drivers/radeonsi/gfx10_query.c           |  5 +++--
 src/gallium/drivers/radeonsi/si_query.c              | 12 +++++++-----
 src/gallium/drivers/radeonsi/si_query.h              |  3 ++-
 src/gallium/drivers/tegra/tegra_context.c            |  4 ++--
 src/gallium/drivers/virgl/virgl_query.c              |  4 ++--
 src/gallium/drivers/zink/zink_query.c                |  2 +-
 src/gallium/frontends/lavapipe/lvp_execute.c         |  7 ++++---
 src/gallium/include/pipe/p_context.h                 |  2 +-
 src/gallium/include/pipe/p_defines.h                 |  5 +++++
 src/mesa/main/queryobj.c                             |  7 +++++--
 26 files changed, 83 insertions(+), 50 deletions(-)

diff --git a/src/gallium/auxiliary/driver_ddebug/dd_draw.c b/src/gallium/auxiliary/driver_ddebug/dd_draw.c
index 5e70765f55e..4ada10049a0 100644
--- a/src/gallium/auxiliary/driver_ddebug/dd_draw.c
+++ b/src/gallium/auxiliary/driver_ddebug/dd_draw.c
@@ -500,7 +500,7 @@ dd_dump_get_query_result_resource(struct call_get_query_result_resource *info, F
 {
    fprintf(f, "%s:\n", __func__ + 8);
    DUMP_M(query_type, info, query_type);
-   DUMP_M(uint, info, wait);
+   DUMP_M(query_flags, info, flags);
    DUMP_M(query_value_type, info, result_type);
    DUMP_M(int, info, index);
    DUMP_M(resource, info, resource);
@@ -1445,7 +1445,7 @@ dd_context_generate_mipmap(struct pipe_context *_pipe,
 static void
 dd_context_get_query_result_resource(struct pipe_context *_pipe,
                                      struct pipe_query *query,
-                                     bool wait,
+                                     enum pipe_query_flags flags,
                                      enum pipe_query_value_type result_type,
                                      int index,
                                      struct pipe_resource *resource,
@@ -1458,7 +1458,7 @@ dd_context_get_query_result_resource(struct pipe_context *_pipe,
 
    record->call.type = CALL_GET_QUERY_RESULT_RESOURCE;
    record->call.info.get_query_result_resource.query = query;
-   record->call.info.get_query_result_resource.wait = wait;
+   record->call.info.get_query_result_resource.flags = flags;
    record->call.info.get_query_result_resource.result_type = result_type;
    record->call.info.get_query_result_resource.index = index;
    record->call.info.get_query_result_resource.resource = NULL;
@@ -1470,7 +1470,7 @@ dd_context_get_query_result_resource(struct pipe_context *_pipe,
    record->call.info.get_query_result_resource.query_type = dquery->type;
 
    dd_before_draw(dctx, record);
-   pipe->get_query_result_resource(pipe, dquery->query, wait,
+   pipe->get_query_result_resource(pipe, dquery->query, flags,
                                    result_type, index, resource, offset);
    dd_after_draw(dctx, record);
 }
diff --git a/src/gallium/auxiliary/driver_ddebug/dd_pipe.h b/src/gallium/auxiliary/driver_ddebug/dd_pipe.h
index e7e23fe1caa..b880a804536 100644
--- a/src/gallium/auxiliary/driver_ddebug/dd_pipe.h
+++ b/src/gallium/auxiliary/driver_ddebug/dd_pipe.h
@@ -131,7 +131,7 @@ struct call_draw_info {
 struct call_get_query_result_resource {
    struct pipe_query *query;
    enum pipe_query_type query_type;
-   bool wait;
+   enum pipe_query_flags flags;
    enum pipe_query_value_type result_type;
    int index;
    struct pipe_resource *resource;
diff --git a/src/gallium/auxiliary/driver_noop/noop_state.c b/src/gallium/auxiliary/driver_noop/noop_state.c
index 56036e22ede..74069401b85 100644
--- a/src/gallium/auxiliary/driver_noop/noop_state.c
+++ b/src/gallium/auxiliary/driver_noop/noop_state.c
@@ -303,7 +303,7 @@ static void noop_render_condition( struct pipe_context *pipe,
 
 static void noop_get_query_result_resource(struct pipe_context *pipe,
                                            struct pipe_query *q,
-                                           bool wait,
+                                           enum pipe_query_flags flags,
                                            enum pipe_query_value_type result_type,
                                            int index,
                                            struct pipe_resource *resource,
diff --git a/src/gallium/auxiliary/driver_trace/tr_context.c b/src/gallium/auxiliary/driver_trace/tr_context.c
index 5c58b3f95a1..9465a665552 100644
--- a/src/gallium/auxiliary/driver_trace/tr_context.c
+++ b/src/gallium/auxiliary/driver_trace/tr_context.c
@@ -324,7 +324,7 @@ trace_context_get_query_result(struct pipe_context *_pipe,
 static void
 trace_context_get_query_result_resource(struct pipe_context *_pipe,
                                         struct pipe_query *_query,
-                                        bool wait,
+                                        enum pipe_query_flags flags,
                                         enum pipe_query_value_type result_type,
                                         int index,
                                         struct pipe_resource *resource,
@@ -339,7 +339,7 @@ trace_context_get_query_result_resource(struct pipe_context *_pipe,
 
    trace_dump_arg(ptr, pipe);
    trace_dump_arg(ptr, query);
-   trace_dump_arg(bool, wait);
+   trace_dump_arg(query_flags, flags);
    trace_dump_arg(uint, result_type);
    trace_dump_arg(uint, index);
    trace_dump_arg(ptr, resource);
@@ -350,7 +350,7 @@ trace_context_get_query_result_resource(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
-   pipe->get_query_result_resource(pipe, query, wait, result_type, index, resource, offset);
+   pipe->get_query_result_resource(pipe, query, flags, result_type, index, resource, offset);
 }
 
 
diff --git a/src/gallium/auxiliary/driver_trace/tr_dump_defines.h b/src/gallium/auxiliary/driver_trace/tr_dump_defines.h
index 7c18cd13adc..c523da25a38 100644
--- a/src/gallium/auxiliary/driver_trace/tr_dump_defines.h
+++ b/src/gallium/auxiliary/driver_trace/tr_dump_defines.h
@@ -53,6 +53,15 @@ trace_dump_query_type(unsigned value)
    trace_dump_enum(util_str_query_type(value, false));
 }
 
+static inline void
+trace_dump_query_flags(unsigned value)
+{
+   if (!trace_dumping_enabled_locked())
+      return;
+
+   trace_dump_enum(util_str_query_type(value, false));
+}
+
 
 
 #endif /* TR_DUMP_DEFINES_H_ */
diff --git a/src/gallium/auxiliary/util/u_dump.h b/src/gallium/auxiliary/util/u_dump.h
index 0e7f4c27192..d9188fb7806 100644
--- a/src/gallium/auxiliary/util/u_dump.h
+++ b/src/gallium/auxiliary/util/u_dump.h
@@ -102,6 +102,9 @@ util_dump_query_type(FILE *stream, unsigned value);
 void
 util_dump_query_value_type(FILE *stream, unsigned value);
 
+void
+util_dump_query_flags(FILE *stream, unsigned value);
+
 void
 util_dump_transfer_usage(FILE *stream, unsigned value);
 
diff --git a/src/gallium/auxiliary/util/u_dump_defines.c b/src/gallium/auxiliary/util/u_dump_defines.c
index c228ed5a938..a9dac512af9 100644
--- a/src/gallium/auxiliary/util/u_dump_defines.c
+++ b/src/gallium/auxiliary/util/u_dump_defines.c
@@ -509,6 +509,12 @@ util_dump_query_value_type(FILE *stream, unsigned value)
    fprintf(stream, "%s", util_str_query_value_type(value, false));
 }
 
+void
+util_dump_query_flags(FILE *stream, unsigned value)
+{
+   fprintf(stream, "%s", util_str_query_value_type(value, false));
+}
+
 
 static const char * const
 util_transfer_usage_names[] = {
diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index dfb3a5d2031..cbeba1ea94a 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -894,7 +894,7 @@ tc_get_query_result(struct pipe_context *_pipe,
 
 struct tc_query_result_resource {
    struct tc_call_base base;
-   bool wait;
+   enum pipe_query_flags flags:8;
    enum pipe_query_value_type result_type:8;
    int8_t index; /* it can be -1 */
    unsigned offset;
@@ -907,7 +907,7 @@ tc_call_get_query_result_resource(struct pipe_context *pipe, void *call, uint64_
 {
    struct tc_query_result_resource *p = to_call(call, tc_query_result_resource);
 
-   pipe->get_query_result_resource(pipe, p->query, p->wait, p->result_type,
+   pipe->get_query_result_resource(pipe, p->query, p->flags, p->result_type,
                                    p->index, p->resource, p->offset);
    tc_drop_resource_reference(p->resource);
    return call_size(tc_query_result_resource);
@@ -915,7 +915,8 @@ tc_call_get_query_result_resource(struct pipe_context *pipe, void *call, uint64_
 
 static void
 tc_get_query_result_resource(struct pipe_context *_pipe,
-                             struct pipe_query *query, bool wait,
+                             struct pipe_query *query,
+                             enum pipe_query_flags flags,
                              enum pipe_query_value_type result_type, int index,
                              struct pipe_resource *resource, unsigned offset)
 {
@@ -927,7 +928,7 @@ tc_get_query_result_resource(struct pipe_context *_pipe,
       tc_add_call(tc, TC_CALL_get_query_result_resource,
                   tc_query_result_resource);
    p->query = query;
-   p->wait = wait;
+   p->flags = flags;
    p->result_type = result_type;
    p->index = index;
    tc_set_resource_reference(&p->resource, resource);
diff --git a/src/gallium/drivers/crocus/crocus_query.c b/src/gallium/drivers/crocus/crocus_query.c
index 152fd4fa289..677affd7513 100644
--- a/src/gallium/drivers/crocus/crocus_query.c
+++ b/src/gallium/drivers/crocus/crocus_query.c
@@ -699,7 +699,7 @@ crocus_get_query_result(struct pipe_context *ctx,
 static void
 crocus_get_query_result_resource(struct pipe_context *ctx,
                                  struct pipe_query *query,
-                                 bool wait,
+                                 enum pipe_query_flags flags,
                                  enum pipe_query_value_type result_type,
                                  int index,
                                  struct pipe_resource *p_res,
@@ -759,7 +759,7 @@ crocus_get_query_result_resource(struct pipe_context *ctx,
    }
 
 #if GFX_VERx10 >= 75
-   bool predicated = !wait && !q->stalled;
+   bool predicated = !(flags & PIPE_QUERY_WAIT) && !q->stalled;
 
    struct mi_builder b;
    mi_builder_init(&b, &batch->screen->devinfo, batch);
diff --git a/src/gallium/drivers/iris/iris_query.c b/src/gallium/drivers/iris/iris_query.c
index e79d23c702f..bb7ad66f887 100644
--- a/src/gallium/drivers/iris/iris_query.c
+++ b/src/gallium/drivers/iris/iris_query.c
@@ -651,7 +651,7 @@ iris_get_query_result(struct pipe_context *ctx,
 static void
 iris_get_query_result_resource(struct pipe_context *ctx,
                                struct pipe_query *query,
-                               bool wait,
+                               enum pipe_query_flags flags,
                                enum pipe_query_value_type result_type,
                                int index,
                                struct pipe_resource *p_res,
@@ -709,7 +709,7 @@ iris_get_query_result_resource(struct pipe_context *ctx,
       return;
    }
 
-   bool predicated = !wait && !q->stalled;
+   bool predicated = !(flags & PIPE_QUERY_WAIT) && !q->stalled;
 
    struct mi_builder b;
    mi_builder_init(&b, &batch->screen->devinfo, batch);
diff --git a/src/gallium/drivers/llvmpipe/lp_query.c b/src/gallium/drivers/llvmpipe/lp_query.c
index e369925d531..5d65e53f9ec 100644
--- a/src/gallium/drivers/llvmpipe/lp_query.c
+++ b/src/gallium/drivers/llvmpipe/lp_query.c
@@ -204,7 +204,7 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
 static void
 llvmpipe_get_query_result_resource(struct pipe_context *pipe,
                                    struct pipe_query *q,
-                                   bool wait,
+                                   enum pipe_query_flags flags,
                                    enum pipe_query_value_type result_type,
                                    int index,
                                    struct pipe_resource *resource,
@@ -221,7 +221,7 @@ llvmpipe_get_query_result_resource(struct pipe_context *pipe,
          if (!lp_fence_issued(pq->fence))
             llvmpipe_flush(pipe, NULL, __FUNCTION__);
 
-         if (wait)
+         if (flags & PIPE_QUERY_WAIT)
             lp_fence_wait(pq->fence);
       }
       unsignalled = !lp_fence_signalled(pq->fence);
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
index 41d7ab9da7a..0deb667a02e 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
@@ -77,7 +77,7 @@ nvc0_get_query_result(struct pipe_context *pipe, struct pipe_query *pq,
 static void
 nvc0_get_query_result_resource(struct pipe_context *pipe,
                                struct pipe_query *pq,
-                               bool wait,
+                               enum pipe_query_flags flags,
                                enum pipe_query_value_type result_type,
                                int index,
                                struct pipe_resource *resource,
@@ -88,7 +88,7 @@ nvc0_get_query_result_resource(struct pipe_context *pipe,
       assert(!"Unexpected lack of get_query_result_resource");
       return;
    }
-   q->funcs->get_query_result_resource(nvc0_context(pipe), q, wait, result_type,
+   q->funcs->get_query_result_resource(nvc0_context(pipe), q, flags, result_type,
                                        index, resource, offset);
 }
 
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.h b/src/gallium/drivers/nouveau/nvc0/nvc0_query.h
index 4667dcdbd94..f76f3189474 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.h
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.h
@@ -16,7 +16,7 @@ struct nvc0_query_funcs {
                             bool, union pipe_query_result *);
    void (*get_query_result_resource)(struct nvc0_context *nvc0,
                                      struct nvc0_query *q,
-                                     bool wait,
+                                     enum pipe_query_flags flags,
                                      enum pipe_query_value_type result_type,
                                      int index,
                                      struct pipe_resource *resource,
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
index 59d4cbe88c7..40f200100cc 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
@@ -387,7 +387,7 @@ nvc0_hw_get_query_result(struct nvc0_context *nvc0, struct nvc0_query *q,
 static void
 nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
                                   struct nvc0_query *q,
-                                  bool wait,
+                                  enum pipe_query_flags flags,
                                   enum pipe_query_value_type result_type,
                                   int index,
                                   struct pipe_resource *resource,
@@ -432,7 +432,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
    if (hq->state != NVC0_HW_QUERY_STATE_READY)
       nvc0_hw_query_update(nvc0->screen->base.client, q);
 
-   if (wait && hq->state != NVC0_HW_QUERY_STATE_READY)
+   if ((flags & PIPE_QUERY_WAIT) && hq->state != NVC0_HW_QUERY_STATE_READY)
       nvc0_hw_query_fifo_wait(nvc0, q);
 
    nouveau_pushbuf_space(push, 32, 2, 3);
@@ -493,7 +493,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
       PUSH_DATA(push, 0);
    }
 
-   if (wait || hq->state == NVC0_HW_QUERY_STATE_READY) {
+   if ((flags & PIPE_QUERY_WAIT) || hq->state == NVC0_HW_QUERY_STATE_READY) {
       PUSH_DATA(push, 0);
       PUSH_DATA(push, 0);
    } else if (hq->is64bit) {
diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c
index b42843e5cdf..8d6ada94a76 100644
--- a/src/gallium/drivers/r600/r600_query.c
+++ b/src/gallium/drivers/r600/r600_query.c
@@ -560,7 +560,7 @@ static bool r600_query_hw_prepare_buffer(struct r600_common_screen *rscreen,
 
 static void r600_query_hw_get_result_resource(struct r600_common_context *rctx,
                                               struct r600_query *rquery,
-                                              bool wait,
+                                              enum pipe_query_flags flags,
                                               enum pipe_query_value_type result_type,
                                               int index,
                                               struct pipe_resource *resource,
@@ -1307,7 +1307,7 @@ static bool r600_get_query_result(struct pipe_context *ctx,
 
 static void r600_get_query_result_resource(struct pipe_context *ctx,
                                            struct pipe_query *query,
-                                           bool wait,
+                                           enum pipe_query_flags flags,
                                            enum pipe_query_value_type result_type,
                                            int index,
                                            struct pipe_resource *resource,
@@ -1316,7 +1316,7 @@ static void r600_get_query_result_resource(struct pipe_context *ctx,
 	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
 	struct r600_query *rquery = (struct r600_query *)query;
 
-	rquery->ops->get_result_resource(rctx, rquery, wait, result_type, index,
+	rquery->ops->get_result_resource(rctx, rquery, flags, result_type, index,
 	                                 resource, offset);
 }
 
@@ -1599,7 +1599,7 @@ static void r600_restore_qbo_state(struct r600_common_context *rctx,
 
 static void r600_query_hw_get_result_resource(struct r600_common_context *rctx,
                                               struct r600_query *rquery,
-                                              bool wait,
+                                              enum pipe_query_flags flags,
                                               enum pipe_query_value_type result_type,
                                               int index,
                                               struct pipe_resource *resource,
@@ -1728,7 +1728,7 @@ static void r600_query_hw_get_result_resource(struct r600_common_context *rctx,
 
 		rctx->b.set_shader_buffers(&rctx->b, PIPE_SHADER_COMPUTE, 0, 3, ssbo, ~0);
 
-		if (wait && qbuf == &query->buffer) {
+		if ((flags & PIPE_QUERY_WAIT) && qbuf == &query->buffer) {
 			uint64_t va;
 
 			/* Wait for result availability. Wait only for readiness
diff --git a/src/gallium/drivers/r600/r600_query.h b/src/gallium/drivers/r600/r600_query.h
index 20647ff98d1..092b293399f 100644
--- a/src/gallium/drivers/r600/r600_query.h
+++ b/src/gallium/drivers/r600/r600_query.h
@@ -125,7 +125,8 @@ struct r600_query_ops {
 			   struct r600_query *, bool wait,
 			   union pipe_query_result *result);
 	void (*get_result_resource)(struct r600_common_context *,
-				    struct r600_query *, bool wait,
+				    struct r600_query *,
+				    enum pipe_query_flags flags,
 				    enum pipe_query_value_type result_type,
 				    int index,
 				    struct pipe_resource *resource,
diff --git a/src/gallium/drivers/radeonsi/gfx10_query.c b/src/gallium/drivers/radeonsi/gfx10_query.c
index 7a39f520e22..a6aac5a49b3 100644
--- a/src/gallium/drivers/radeonsi/gfx10_query.c
+++ b/src/gallium/drivers/radeonsi/gfx10_query.c
@@ -276,7 +276,8 @@ static bool gfx10_sh_query_get_result(struct si_context *sctx, struct si_query *
 }
 
 static void gfx10_sh_query_get_result_resource(struct si_context *sctx, struct si_query *rquery,
-                                               bool wait, enum pipe_query_value_type result_type,
+                                               enum pipe_query_flags flags,
+                                               enum pipe_query_value_type result_type,
                                                int index, struct pipe_resource *resource,
                                                unsigned offset)
 {
@@ -388,7 +389,7 @@ static void gfx10_sh_query_get_result_resource(struct si_context *sctx, struct s
 
       sctx->b.set_constant_buffer(&sctx->b, PIPE_SHADER_COMPUTE, 0, false, &constant_buffer);
 
-      if (wait) {
+      if (flags & PIPE_QUERY_WAIT) {
          uint64_t va;
 
          /* Wait for result availability. Wait only for readiness
diff --git a/src/gallium/drivers/radeonsi/si_query.c b/src/gallium/drivers/radeonsi/si_query.c
index 22f8ee295cb..8a666710b73 100644
--- a/src/gallium/drivers/radeonsi/si_query.c
+++ b/src/gallium/drivers/radeonsi/si_query.c
@@ -638,7 +638,8 @@ static bool si_query_hw_prepare_buffer(struct si_context *sctx, struct si_query_
 }
 
 static void si_query_hw_get_result_resource(struct si_context *sctx, struct si_query *squery,
-                                            bool wait, enum pipe_query_value_type result_type,
+                                            enum pipe_query_flags flags,
+                                            enum pipe_query_value_type result_type,
                                             int index, struct pipe_resource *resource,
                                             unsigned offset);
 
@@ -1372,13 +1373,13 @@ static bool si_get_query_result(struct pipe_context *ctx, struct pipe_query *que
 }
 
 static void si_get_query_result_resource(struct pipe_context *ctx, struct pipe_query *query,
-                                         bool wait, enum pipe_query_value_type result_type,
+                                         enum pipe_query_flags flags, enum pipe_query_value_type result_type,
                                          int index, struct pipe_resource *resource, unsigned offset)
 {
    struct si_context *sctx = (struct si_context *)ctx;
    struct si_query *squery = (struct si_query *)query;
 
-   squery->ops->get_result_resource(sctx, squery, wait, result_type, index, resource, offset);
+   squery->ops->get_result_resource(sctx, squery, flags, result_type, index, resource, offset);
 }
 
 static void si_query_hw_clear_result(struct si_query_hw *query, union pipe_query_result *result)
@@ -1423,7 +1424,8 @@ bool si_query_hw_get_result(struct si_context *sctx, struct si_query *squery, bo
 }
 
 static void si_query_hw_get_result_resource(struct si_context *sctx, struct si_query *squery,
-                                            bool wait, enum pipe_query_value_type result_type,
+                                            enum pipe_query_flags flags,
+                                            enum pipe_query_value_type result_type,
                                             int index, struct pipe_resource *resource,
                                             unsigned offset)
 {
@@ -1541,7 +1543,7 @@ static void si_query_hw_get_result_resource(struct si_context *sctx, struct si_q
          si_resource(resource)->TC_L2_dirty = true;
       }
 
-      if (wait && qbuf == &query->buffer) {
+      if ((flags & PIPE_QUERY_WAIT) && qbuf == &query->buffer) {
          uint64_t va;
 
          /* Wait for result availability. Wait only for readiness
diff --git a/src/gallium/drivers/radeonsi/si_query.h b/src/gallium/drivers/radeonsi/si_query.h
index b0e11373852..4a21c34103c 100644
--- a/src/gallium/drivers/radeonsi/si_query.h
+++ b/src/gallium/drivers/radeonsi/si_query.h
@@ -133,7 +133,8 @@ struct si_query_ops {
    bool (*end)(struct si_context *, struct si_query *);
    bool (*get_result)(struct si_context *, struct si_query *, bool wait,
                       union pipe_query_result *result);
-   void (*get_result_resource)(struct si_context *, struct si_query *, bool wait,
+   void (*get_result_resource)(struct si_context *, struct si_query *,
+                               enum pipe_query_flags flags,
                                enum pipe_query_value_type result_type, int index,
                                struct pipe_resource *resource, unsigned offset);
 
diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c
index a07c740dc0b..b170f5eb547 100644
--- a/src/gallium/drivers/tegra/tegra_context.c
+++ b/src/gallium/drivers/tegra/tegra_context.c
@@ -154,7 +154,7 @@ tegra_get_query_result(struct pipe_context *pcontext,
 static void
 tegra_get_query_result_resource(struct pipe_context *pcontext,
                                 struct pipe_query *query,
-                                bool wait,
+                                enum pipe_query_flags flags,
                                 enum pipe_query_value_type result_type,
                                 int index,
                                 struct pipe_resource *resource,
@@ -162,7 +162,7 @@ tegra_get_query_result_resource(struct pipe_context *pcontext,
 {
    struct tegra_context *context = to_tegra_context(pcontext);
 
-   context->gpu->get_query_result_resource(context->gpu, query, wait,
+   context->gpu->get_query_result_resource(context->gpu, query, flags,
                                            result_type, index, resource,
                                            offset);
 }
diff --git a/src/gallium/drivers/virgl/virgl_query.c b/src/gallium/drivers/virgl/virgl_query.c
index 4d442b79a37..072a8688366 100644
--- a/src/gallium/drivers/virgl/virgl_query.c
+++ b/src/gallium/drivers/virgl/virgl_query.c
@@ -237,7 +237,7 @@ virgl_set_active_query_state(struct pipe_context *pipe, bool enable)
 static void
 virgl_get_query_result_resource(struct pipe_context *ctx,
                                 struct pipe_query *q,
-                                bool wait,
+                                enum pipe_query_flags flags,
                                 enum pipe_query_value_type result_type,
                                 int index,
                                 struct pipe_resource *resource,
@@ -247,7 +247,7 @@ virgl_get_query_result_resource(struct pipe_context *ctx,
    struct virgl_query *query = virgl_query(q);
    struct virgl_resource *qbo = (struct virgl_resource *)resource;
 
-   virgl_encode_get_query_result_qbo(vctx, query->handle, qbo, wait, result_type, offset, index);
+   virgl_encode_get_query_result_qbo(vctx, query->handle, qbo, (flags & PIPE_QUERY_WAIT), result_type, offset, index);
 }
 
 void virgl_init_query_functions(struct virgl_context *vctx)
diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c
index e2362d1690b..eb3fc3d7f9c 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -980,7 +980,7 @@ zink_render_condition(struct pipe_context *pctx,
 static void
 zink_get_query_result_resource(struct pipe_context *pctx,
                                struct pipe_query *pquery,
-                               bool wait,
+                               enum pipe_query_flags flags,
                                enum pipe_query_value_type result_type,
                                int index,
                                struct pipe_resource *pres,
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index 228aeb72662..b0e52776bb4 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -2987,6 +2987,7 @@ static void handle_copy_query_pool_results(struct vk_cmd_queue_entry *cmd,
 {
    struct vk_cmd_copy_query_pool_results *copycmd = &cmd->u.copy_query_pool_results;
    LVP_FROM_HANDLE(lvp_query_pool, pool, copycmd->query_pool);
+   enum pipe_query_flags flags = (copycmd->flags & VK_QUERY_RESULT_WAIT_BIT) ? PIPE_QUERY_WAIT : 0;
 
    for (unsigned i = copycmd->first_query; i < copycmd->first_query + copycmd->query_count; i++) {
       unsigned offset = copycmd->dst_offset + lvp_buffer_from_handle(copycmd->dst_buffer)->offset + (copycmd->stride * (i - copycmd->first_query));
@@ -2994,7 +2995,7 @@ static void handle_copy_query_pool_results(struct vk_cmd_queue_entry *cmd,
          if (copycmd->flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
             state->pctx->get_query_result_resource(state->pctx,
                                                    pool->queries[i],
-                                                   copycmd->flags & VK_QUERY_RESULT_WAIT_BIT,
+                                                   flags,
                                                    copycmd->flags & VK_QUERY_RESULT_64_BIT ? PIPE_QUERY_TYPE_U64 : PIPE_QUERY_TYPE_U32,
                                                    -1,
                                                    lvp_buffer_from_handle(copycmd->dst_buffer)->bo,
@@ -3005,7 +3006,7 @@ static void handle_copy_query_pool_results(struct vk_cmd_queue_entry *cmd,
             u_foreach_bit(bit, pool->pipeline_stats)
                state->pctx->get_query_result_resource(state->pctx,
                                                       pool->queries[i],
-                                                      copycmd->flags & VK_QUERY_RESULT_WAIT_BIT,
+                                                      flags,
                                                       copycmd->flags & VK_QUERY_RESULT_64_BIT ? PIPE_QUERY_TYPE_U64 : PIPE_QUERY_TYPE_U32,
                                                       bit,
                                                       lvp_buffer_from_handle(copycmd->dst_buffer)->bo,
@@ -3013,7 +3014,7 @@ static void handle_copy_query_pool_results(struct vk_cmd_queue_entry *cmd,
          } else {
             state->pctx->get_query_result_resource(state->pctx,
                                                    pool->queries[i],
-                                                   copycmd->flags & VK_QUERY_RESULT_WAIT_BIT,
+                                                   flags,
                                                    copycmd->flags & VK_QUERY_RESULT_64_BIT ? PIPE_QUERY_TYPE_U64 : PIPE_QUERY_TYPE_U32,
                                                    0,
                                                    lvp_buffer_from_handle(copycmd->dst_buffer)->bo,
diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
index af040fb2b11..b4db1581f68 100644
--- a/src/gallium/include/pipe/p_context.h
+++ b/src/gallium/include/pipe/p_context.h
@@ -265,7 +265,7 @@ struct pipe_context {
     */
    void (*get_query_result_resource)(struct pipe_context *pipe,
                                      struct pipe_query *q,
-                                     bool wait,
+                                     enum pipe_query_flags flags,
                                      enum pipe_query_value_type result_type,
                                      int index,
                                      struct pipe_resource *resource,
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 014c5ba9a00..4b8bab9bc55 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -1286,6 +1286,11 @@ enum pipe_query_value_type
    PIPE_QUERY_TYPE_U64,
 };
 
+enum pipe_query_flags
+{
+   PIPE_QUERY_WAIT = (1 << 0),
+};
+
 union pipe_color_union
 {
    float f[4];
diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c
index 98faae8e64d..77b800145c5 100644
--- a/src/mesa/main/queryobj.c
+++ b/src/mesa/main/queryobj.c
@@ -381,10 +381,13 @@ store_query_result(struct gl_context *ctx, struct gl_query_object *q,
                    GLenum pname, GLenum ptype)
 {
    struct pipe_context *pipe = ctx->pipe;
-   boolean wait = pname == GL_QUERY_RESULT;
+   enum pipe_query_flags flags = 0;
    enum pipe_query_value_type result_type;
    int index;
 
+   if (pname == GL_QUERY_RESULT)
+      flags |= PIPE_QUERY_WAIT;
+
    /* GL_QUERY_TARGET is a bit of an extension since it has nothing to
     * do with the GPU end of the query. Write it in "by hand".
     */
@@ -462,7 +465,7 @@ store_query_result(struct gl_context *ctx, struct gl_query_object *q,
       index = 0;
    }
 
-   pipe->get_query_result_resource(pipe, q->pq, wait, result_type, index,
+   pipe->get_query_result_resource(pipe, q->pq, flags, result_type, index,
                                    buf->buffer, offset);
 }
 



More information about the mesa-commit mailing list