From 59d2b7283c9ce5c465f13f14683446b005f9e436 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 22 Apr 2024 19:09:56 -0400 Subject: [PATCH] asahi: add agx_ppp_push_merged helper convenient for ppp merge trickery. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/.clang-format | 1 + src/asahi/lib/agx_ppp.h | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/.clang-format b/src/.clang-format index 9bd554cda64..d13cd051cf4 100644 --- a/src/.clang-format +++ b/src/.clang-format @@ -191,6 +191,7 @@ ForEachMacros: - agx_push - agx_usc_pack - agx_ppp_push + - agx_ppp_push_merged - agx_foreach_block - agx_foreach_block_safe - agx_foreach_block_from diff --git a/src/asahi/lib/agx_ppp.h b/src/asahi/lib/agx_ppp.h index 928ecdd6c54..006357b16e2 100644 --- a/src/asahi/lib/agx_ppp.h +++ b/src/asahi/lib/agx_ppp.h @@ -88,6 +88,13 @@ agx_ppp_validate(struct agx_ppp_update *ppp, size_t size) (ppp)->head += AGX_##T##_LENGTH; \ } while (0) +#define agx_ppp_push_merged(ppp, T, name, merge) \ + for (uint8_t _tmp[AGX_##T##_LENGTH], it = 1; it; \ + it = 0, agx_ppp_push_merged_blobs(ppp, AGX_##T##_LENGTH, \ + (uint32_t *)_tmp, \ + (uint32_t *)&merge)) \ + agx_pack(_tmp, T, name) + ALWAYS_INLINE static struct agx_ppp_update agx_new_ppp_update(struct agx_pool *pool, struct AGX_PPP_HEADER present) { @@ -132,3 +139,22 @@ agx_ppp_fini(uint8_t **out, struct agx_ppp_update *ppp) *out += AGX_PPP_STATE_LENGTH; } + +static void +agx_ppp_push_merged_blobs(struct agx_ppp_update *ppp, size_t length, + void *src1_, void *src2_) +{ + assert((length & 3) == 0); + assert(((uintptr_t)src1_ & 3) == 0); + assert(((uintptr_t)src2_ & 3) == 0); + + uint32_t *dst = (uint32_t *)ppp->head; + uint32_t *src1 = (uint32_t *)src1_; + uint32_t *src2 = (uint32_t *)src2_; + + for (unsigned i = 0; i < (length / 4); ++i) { + dst[i] = src1[i] | src2[i]; + } + + ppp->head += length; +}