From c4fd1abc8bb5113c2b2f9ff2675b8a65ec097f30 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 4 Dec 2023 17:13:08 -0400 Subject: [PATCH] asahi: stub qbo on the cpu allowed by spec, perf will suck of course. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/asahi/agx_pipe.c | 3 ++ src/gallium/drivers/asahi/agx_query.c | 48 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 6be04e13d2b..d9d1b686280 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -1728,6 +1728,9 @@ agx_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_NIR_IMAGES_AS_DEREF: return 0; + case PIPE_CAP_QUERY_BUFFER_OBJECT: + return true; + case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_FREEDRENO; diff --git a/src/gallium/drivers/asahi/agx_query.c b/src/gallium/drivers/asahi/agx_query.c index c142a0b7bb8..528078e2bf9 100644 --- a/src/gallium/drivers/asahi/agx_query.c +++ b/src/gallium/drivers/asahi/agx_query.c @@ -6,6 +6,8 @@ #include #include "pipe/p_defines.h" +#include "util/macros.h" +#include "util/u_inlines.h" #include "util/u_prim.h" #include "agx_device.h" #include "agx_state.h" @@ -231,6 +233,51 @@ agx_get_query_result(struct pipe_context *pctx, struct pipe_query *pquery, } } +static void +agx_get_query_result_resource(struct pipe_context *pipe, struct pipe_query *q, + enum pipe_query_flags flags, + enum pipe_query_value_type result_type, int index, + struct pipe_resource *resource, unsigned offset) +{ + struct agx_query *query = (struct agx_query *)q; + + /* TODO: Don't cheat XXX */ + struct agx_context *ctx = agx_context(pipe); + agx_sync_all(ctx, "Stubbed QBOs"); + + union pipe_query_result result; + if (index < 0) { + /* availability */ + result.u64 = 1; + } else { + bool ready = agx_get_query_result(pipe, q, true, &result); + assert(ready); + } + + switch (query->type) { + case PIPE_QUERY_OCCLUSION_PREDICATE: + case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: + result.u32 = result.b; + break; + default: + break; + } + + /* Clamp to type, arb_query_buffer_object-qbo tests */ + if (result_type == PIPE_QUERY_TYPE_U32) { + result.u32 = MIN2(result.u64, u_uintN_max(32)); + } else if (result_type == PIPE_QUERY_TYPE_I32) { + int64_t x = result.u64; + x = MAX2(MIN2(x, u_intN_max(32)), u_intN_min(32)); + result.u32 = x; + } + + if (result_type <= PIPE_QUERY_TYPE_U32) + pipe_buffer_write(pipe, resource, offset, 4, &result.u32); + else + pipe_buffer_write(pipe, resource, offset, 8, &result.u64); +} + static void agx_set_active_query_state(struct pipe_context *pipe, bool enable) { @@ -394,6 +441,7 @@ agx_init_query_functions(struct pipe_context *pctx) pctx->begin_query = agx_begin_query; pctx->end_query = agx_end_query; pctx->get_query_result = agx_get_query_result; + pctx->get_query_result_resource = agx_get_query_result_resource; pctx->set_active_query_state = agx_set_active_query_state; pctx->render_condition = agx_render_condition;