asahi: stub qbo on the cpu

allowed by spec, perf will suck of course.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26963>
This commit is contained in:
Alyssa Rosenzweig
2023-12-04 17:13:08 -04:00
parent 6deaaaa46a
commit c4fd1abc8b
2 changed files with 51 additions and 0 deletions

View File

@@ -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;

View File

@@ -6,6 +6,8 @@
#include <stdint.h>
#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;