From ff7abb1e2241bf6a6714bf71a3844e62ec4fd50b Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 27 Nov 2024 08:58:07 -0500 Subject: [PATCH] libagx: refactor index buffer code Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/libagx/libagx_dgc.h | 38 +++++++++++++++++++++++++++++----- src/asahi/vulkan/hk_cmd_draw.c | 5 ++--- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/asahi/libagx/libagx_dgc.h b/src/asahi/libagx/libagx_dgc.h index a7d297b0eb5..ff4b6e2b63b 100644 --- a/src/asahi/libagx/libagx_dgc.h +++ b/src/asahi/libagx/libagx_dgc.h @@ -153,10 +153,40 @@ agx_draw_indexed_indirect(uint64_t ptr, uint64_t buf, uint32_t range_B, }; } +static inline unsigned +agx_draw_index_range_B(struct agx_draw d) +{ + uint range_B = d.index_buffer_range_B; + if (!agx_is_indirect(d.b)) + range_B -= agx_indices_to_B(d.start, d.index_size); + + return range_B; +} + static inline unsigned agx_draw_index_range_el(struct agx_draw d) { - return d.index_buffer_range_B >> d.index_size; + assert(d.indexed); + return agx_draw_index_range_B(d) >> d.index_size; +} + +static inline uint64_t +agx_draw_index_buffer(struct agx_draw d) +{ + assert(d.indexed); + + uint64_t ib = d.index_buffer; + if (!agx_is_indirect(d.b)) + ib += agx_indices_to_B(d.start, d.index_size); + + return ib; +} + +static bool +agx_direct_draw_overreads_indices(struct agx_draw d) +{ + uint32_t range_B = agx_indices_to_B(d.start + d.b.count[0], d.index_size); + return range_B > d.index_buffer_range_B; } enum agx_chip { @@ -219,9 +249,7 @@ static inline GLOBAL uint32_t * agx_vdm_draw(GLOBAL uint32_t *out, enum agx_chip chip, struct agx_draw draw, enum agx_primitive topology) { - uint64_t ib = draw.index_buffer; - if (draw.indexed && !agx_is_indirect(draw.b)) - ib += (draw.start << draw.index_size); + uint64_t ib = draw.indexed ? agx_draw_index_buffer(draw) : 0; agx_push(out, INDEX_LIST, cfg) { cfg.primitive = topology; @@ -271,7 +299,7 @@ agx_vdm_draw(GLOBAL uint32_t *out, enum agx_chip chip, struct agx_draw draw, if (draw.indexed) { agx_push(out, INDEX_LIST_BUFFER_SIZE, cfg) { - cfg.size = draw.index_buffer_range_B; + cfg.size = align(agx_draw_index_range_B(draw), 4); } } diff --git a/src/asahi/vulkan/hk_cmd_draw.c b/src/asahi/vulkan/hk_cmd_draw.c index 316385459ec..ae091fa0ea3 100644 --- a/src/asahi/vulkan/hk_cmd_draw.c +++ b/src/asahi/vulkan/hk_cmd_draw.c @@ -1071,11 +1071,10 @@ hk_upload_ia_params(struct hk_cmd_buffer *cmd, struct agx_draw draw) unsigned range_el = agx_draw_index_range_el(draw); ia.index_buffer = - libagx_index_buffer(draw.index_buffer, range_el, draw.start, + libagx_index_buffer(agx_draw_index_buffer(draw), range_el, 0, index_size_B, dev->rodata.zero_sink); - ia.index_buffer_range_el = - libagx_index_buffer_range_el(range_el, draw.start); + ia.index_buffer_range_el = range_el; } return hk_pool_upload(cmd, &ia, sizeof(ia), 8);