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:
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user