diff --git a/src/asahi/lib/agx_nir_lower_gs.c b/src/asahi/lib/agx_nir_lower_gs.c index 6e65d2a3951..0fcf6bb005c 100644 --- a/src/asahi/lib/agx_nir_lower_gs.c +++ b/src/asahi/lib/agx_nir_lower_gs.c @@ -1588,6 +1588,12 @@ agx_nir_tess_setup_indirect(nir_builder *b, const void *data) libagx_tess_setup_indirect(b, params, with_counts, point_mode); } +void +agx_nir_increment_statistic(nir_builder *b, const void *data) +{ + libagx_increment_statistic(b, nir_load_preamble(b, 1, 64, .base = 0)); +} + void agx_nir_increment_cs_invocations(nir_builder *b, const void *data) { diff --git a/src/asahi/lib/agx_nir_lower_gs.h b/src/asahi/lib/agx_nir_lower_gs.h index c25e9ba62cb..a66cfca08e5 100644 --- a/src/asahi/lib/agx_nir_lower_gs.h +++ b/src/asahi/lib/agx_nir_lower_gs.h @@ -79,6 +79,8 @@ unsigned agx_tcs_output_stride(const struct nir_shader *nir); void agx_nir_tess_setup_indirect(struct nir_builder *b, const void *data); +void agx_nir_increment_statistic(struct nir_builder *b, const void *data); + void agx_nir_increment_cs_invocations(struct nir_builder *b, const void *data); struct agx_increment_ia_counters_key { diff --git a/src/asahi/lib/shaders/query.cl b/src/asahi/lib/shaders/query.cl index abc405fd02b..ba19eccb9f1 100644 --- a/src/asahi/lib/shaders/query.cl +++ b/src/asahi/lib/shaders/query.cl @@ -51,6 +51,12 @@ libagx_copy_xfb_counters(constant struct libagx_xfb_counter_copy *push) *(push->dest[i]) = push->src[i] ? *(push->src[i]) : 0; } +void +libagx_increment_statistic(constant struct libagx_increment_params *p) +{ + *(p->statistic) += p->delta; +} + void libagx_increment_cs_invocations(constant struct libagx_cs_invocation_params *p) { diff --git a/src/asahi/lib/shaders/query.h b/src/asahi/lib/shaders/query.h index 794d93a45d1..2c6cd6e7dbe 100644 --- a/src/asahi/lib/shaders/query.h +++ b/src/asahi/lib/shaders/query.h @@ -28,6 +28,14 @@ struct libagx_xfb_counter_copy { GLOBAL(uint32_t) src[4]; }; +struct libagx_increment_params { + /* Pointer to the invocation statistic */ + GLOBAL(uint32_t) statistic; + + /* Value to increment by */ + uint32_t delta; +}; + struct libagx_cs_invocation_params { /* Pointer to the indirect dispatch grid */ GLOBAL(uint32_t) grid;