From 5046dd48b63314f83c4d2a9184c2badf58bc424a Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 16 Jan 2025 10:08:29 -0500 Subject: [PATCH] libagx: fix ia_primitives with tessellation fixes new CTS dEQP-VK.query_pool.statistics_query*input_assembly_primitives.*_patch_list_* Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/libagx/geometry.cl | 28 ++++++++++++++++++++------- src/asahi/vulkan/hk_cmd_draw.c | 6 ++++-- src/gallium/drivers/asahi/agx_state.c | 11 ++++++----- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/asahi/libagx/geometry.cl b/src/asahi/libagx/geometry.cl index 6433f7a13b3..2becb6574a5 100644 --- a/src/asahi/libagx/geometry.cl +++ b/src/asahi/libagx/geometry.cl @@ -330,16 +330,30 @@ increment_counters(global uint32_t *a, global uint32_t *b, global uint32_t *c, } } +static unsigned +decomposed_prims_for_vertices_with_tess(enum mesa_prim prim, int vertices, + unsigned verts_per_patch) +{ + if (prim >= MESA_PRIM_PATCHES) { + return vertices / verts_per_patch; + } else { + return u_decomposed_prims_for_vertices(prim, vertices); + } +} + KERNEL(1) libagx_increment_ia(global uint32_t *ia_vertices, global uint32_t *ia_primitives, global uint32_t *vs_invocations, global uint32_t *c_prims, global uint32_t *c_invs, constant uint32_t *draw, - enum mesa_prim prim) + enum mesa_prim prim, unsigned verts_per_patch) { increment_counters(ia_vertices, vs_invocations, NULL, draw[0] * draw[1]); - uint prims = u_decomposed_prims_for_vertices(prim, draw[0]) * draw[1]; + uint prims = + decomposed_prims_for_vertices_with_tess(prim, draw[0], verts_per_patch) * + draw[1]; + increment_counters(ia_primitives, c_prims, c_invs, prims); } @@ -351,7 +365,7 @@ libagx_increment_ia_restart(global uint32_t *ia_vertices, constant uint32_t *draw, uint64_t index_buffer, uint32_t index_buffer_range_el, uint32_t restart_index, uint32_t index_size_B, - enum mesa_prim prim) + enum mesa_prim prim, unsigned verts_per_patch) { uint tid = cl_global_id.x; unsigned count = draw[0]; @@ -389,15 +403,15 @@ libagx_increment_ia_restart(global uint32_t *ia_vertices, index_size_B); if (index == restart_index) { - accum += - u_decomposed_prims_for_vertices(prim, i - last_restart - 1); + accum += decomposed_prims_for_vertices_with_tess( + prim, i - last_restart - 1, verts_per_patch); last_restart = i; } } { - accum += - u_decomposed_prims_for_vertices(prim, count - last_restart - 1); + accum += decomposed_prims_for_vertices_with_tess( + prim, count - last_restart - 1, verts_per_patch); } increment_counters(ia_primitives, c_prims, c_invs, accum * draw[1]); diff --git a/src/asahi/vulkan/hk_cmd_draw.c b/src/asahi/vulkan/hk_cmd_draw.c index 07fa55bca59..6de48c1a548 100644 --- a/src/asahi/vulkan/hk_cmd_draw.c +++ b/src/asahi/vulkan/hk_cmd_draw.c @@ -3343,6 +3343,8 @@ hk_ia_update(struct hk_cmd_buffer *cmd, struct agx_draw draw, c_inv = 0; } + uint32_t patch_size = dyn->ts.patch_control_points; + if (draw.restart) { uint32_t index_size_B = agx_index_size_to_B(draw.index_size); @@ -3350,11 +3352,11 @@ hk_ia_update(struct hk_cmd_buffer *cmd, struct agx_draw draw, cmd, agx_1d(1024), AGX_BARRIER_ALL | AGX_PREGFX, ia_vertices, ia_prims, vs_invocations, c_prims, c_inv, draw_ptr, draw.index_buffer, agx_draw_index_range_el(draw), cmd->state.gfx.index.restart, - index_size_B, prim); + index_size_B, prim, patch_size); } else { libagx_increment_ia(cmd, agx_1d(1), AGX_BARRIER_ALL | AGX_PREGFX, ia_vertices, ia_prims, vs_invocations, c_prims, c_inv, - draw_ptr, prim); + draw_ptr, prim, patch_size); } } diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 4ed3be028b8..d5d639d822b 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -3936,16 +3936,17 @@ agx_ia_update(struct agx_batch *batch, const struct pipe_draw_info *info, if (info->primitive_restart) { perf_debug(dev, "Input assembly counters with primitive restart"); - libagx_increment_ia_restart( - batch, agx_1d(1024), AGX_BARRIER_ALL, ia_vertices, ia_primitives, - vs_invocations, c_prims, c_invs, draw, ib, ib_range_el, - info->restart_index, info->index_size, info->mode); + libagx_increment_ia_restart(batch, agx_1d(1024), AGX_BARRIER_ALL, + ia_vertices, ia_primitives, vs_invocations, + c_prims, c_invs, draw, ib, ib_range_el, + info->restart_index, info->index_size, + info->mode, ctx->patch_vertices); } else { perf_debug(dev, "Input assembly counters"); libagx_increment_ia(batch, agx_1d(1), AGX_BARRIER_ALL, ia_vertices, ia_primitives, vs_invocations, c_prims, c_invs, draw, - info->mode); + info->mode, ctx->patch_vertices); } }