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