From 7358f0e0451b044ad4687fd612de061fb059f12b Mon Sep 17 00:00:00 2001 From: Christoph Pillmayer Date: Mon, 14 Jul 2025 14:34:15 +0000 Subject: [PATCH] panvk: hide utrace behind more generic interface Reviewed-by: Lars-Ivar Hesselberg Simonsen Reviewed-by: Olivia Lee Part-of: --- src/panfrost/vulkan/csf/panvk_instr.h | 69 ++++++++++ src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 25 +++- .../vulkan/csf/panvk_vX_cmd_dispatch.c | 36 +++-- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 30 ++-- src/panfrost/vulkan/csf/panvk_vX_instr.c | 129 ++++++++++++++++++ src/panfrost/vulkan/meson.build | 1 + src/panfrost/vulkan/panvk_vX_cmd_meta.c | 21 ++- 7 files changed, 278 insertions(+), 33 deletions(-) create mode 100644 src/panfrost/vulkan/csf/panvk_instr.h create mode 100644 src/panfrost/vulkan/csf/panvk_vX_instr.c diff --git a/src/panfrost/vulkan/csf/panvk_instr.h b/src/panfrost/vulkan/csf/panvk_instr.h new file mode 100644 index 00000000000..e099ee718e4 --- /dev/null +++ b/src/panfrost/vulkan/csf/panvk_instr.h @@ -0,0 +1,69 @@ +/* + * Copyright 2025 Arm Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#include "panvk_cmd_buffer.h" +#include "panvk_queue.h" + +enum panvk_instr_work_type { + PANVK_INSTR_WORK_TYPE_CMDBUF, + PANVK_INSTR_WORK_TYPE_META, + PANVK_INSTR_WORK_TYPE_RENDER, + PANVK_INSTR_WORK_TYPE_DISPATCH, + PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT, + PANVK_INSTR_WORK_TYPE_BARRIER, + PANVK_INSTR_WORK_TYPE_SYNC_WAIT, +}; + +struct panvk_instr_end_args { + /* Depending on which work type is ended, one of the options below is valid. */ + union { + struct { + uint8_t wait_sb_mask; + uint8_t wait_subqueue_mask; + uint8_t l2; + uint8_t lsc; + uint8_t other; + } barrier; + + struct { + VkCommandBufferUsageFlags flags; + } cmdbuf; + + struct { + VkRenderingFlags flags; + const struct pan_fb_info *fb; + } render; + + struct { + uint16_t base_group_x; + uint16_t base_group_y; + uint16_t base_group_z; + uint16_t group_count_x; + uint16_t group_count_y; + uint16_t group_count_z; + uint16_t group_size_x; + uint16_t group_size_y; + uint16_t group_size_z; + } dispatch; + + struct { + uint64_t buffer_gpu; + } dispatch_indirect; + }; +}; + +void + panvk_per_arch(panvk_instr_begin_work)(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + enum panvk_instr_work_type work_type); + +/** + * Mark the end of synchronous work. + */ +void panvk_per_arch(panvk_instr_end_work)( + enum panvk_subqueue_id id, struct panvk_cmd_buffer *cmdbuf, + enum panvk_instr_work_type work_type, + const struct panvk_instr_end_args *const args); diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index f2ae5f85341..6bdfed03116 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -40,6 +40,7 @@ #include "panvk_device.h" #include "panvk_entrypoints.h" #include "panvk_instance.h" +#include "panvk_instr.h" #include "panvk_physical_device.h" #include "panvk_priv_bo.h" #include "panvk_tracepoints.h" @@ -171,7 +172,11 @@ finish_cs(struct panvk_cmd_buffer *cmdbuf, uint32_t subqueue) } } - trace_end_cmdbuf(&cmdbuf->utrace.uts[subqueue], cmdbuf, cmdbuf->flags); + struct panvk_instr_end_args instr_info = {.cmdbuf = { + .flags = cmdbuf->flags, + }}; + panvk_per_arch(panvk_instr_end_work)( + subqueue, cmdbuf, PANVK_INSTR_WORK_TYPE_CMDBUF, &instr_info); cs_finish(&cmdbuf->state.cs[subqueue].builder); } @@ -600,7 +605,8 @@ panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, } u_foreach_bit(i, utrace_subqueue_mask) - trace_begin_barrier(&cmdbuf->utrace.uts[i], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(i, cmdbuf, + PANVK_INSTR_WORK_TYPE_BARRIER); for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { struct cs_builder *b = panvk_get_cs_builder(cmdbuf, i); @@ -652,10 +658,14 @@ panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, } u_foreach_bit(i, utrace_subqueue_mask) { - trace_end_barrier( - &cmdbuf->utrace.uts[i], cmdbuf, deps.src[i].wait_sb_mask, - deps.dst[i].wait_subqueue_mask, deps.src[i].cache_flush.l2, - deps.src[i].cache_flush.lsc, deps.src[i].cache_flush.others); + struct panvk_instr_end_args info = { + .barrier = {.wait_sb_mask = deps.src[i].wait_sb_mask, + .wait_subqueue_mask = deps.dst[i].wait_subqueue_mask, + .l2 = deps.src[i].cache_flush.l2, + .lsc = deps.src[i].cache_flush.lsc, + .other = deps.src[i].cache_flush.others}}; + panvk_per_arch(panvk_instr_end_work)( + i, cmdbuf, PANVK_INSTR_WORK_TYPE_BARRIER, &info); } } @@ -960,7 +970,8 @@ panvk_per_arch(BeginCommandBuffer)(VkCommandBuffer commandBuffer, panvk_per_arch(cmd_inherit_render_state)(cmdbuf, pBeginInfo); for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) - trace_begin_cmdbuf(&cmdbuf->utrace.uts[i], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(i, cmdbuf, + PANVK_INSTR_WORK_TYPE_CMDBUF); return VK_SUCCESS; } diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c index 86a5e2d11c8..c438986a7e1 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c @@ -20,6 +20,7 @@ #include "panvk_cmd_push_constant.h" #include "panvk_device.h" #include "panvk_entrypoints.h" +#include "panvk_instr.h" #include "panvk_macros.h" #include "panvk_meta.h" #include "panvk_physical_device.h" @@ -362,14 +363,26 @@ panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer, .direct.wg_count = {groupCountX, groupCountY, groupCountZ}, }; - trace_begin_dispatch(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_COMPUTE, cmdbuf, + PANVK_INSTR_WORK_TYPE_DISPATCH); cmd_dispatch(cmdbuf, &info); - trace_end_dispatch(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf, - baseGroupX, baseGroupY, baseGroupZ, groupCountX, - groupCountY, groupCountZ, shader->cs.local_size.x, - shader->cs.local_size.y, shader->cs.local_size.z); + struct panvk_instr_end_args instr_info = { + .dispatch = { + .base_group_x = baseGroupX, + .base_group_y = baseGroupY, + .base_group_z = baseGroupZ, + .group_count_x = groupCountX, + .group_count_y = groupCountY, + .group_count_z = groupCountZ, + .group_size_x = shader->cs.local_size.x, + .group_size_y = shader->cs.local_size.y, + .group_size_z = shader->cs.local_size.z, + }}; + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_COMPUTE, cmdbuf, + PANVK_INSTR_WORK_TYPE_DISPATCH, + &instr_info); } VKAPI_ATTR void VKAPI_CALL @@ -383,12 +396,15 @@ panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer, .indirect.buffer_dev_addr = buffer_gpu, }; - trace_begin_dispatch_indirect(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], - cmdbuf); + panvk_per_arch(panvk_instr_begin_work)( + PANVK_SUBQUEUE_COMPUTE, cmdbuf, PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT); cmd_dispatch(cmdbuf, &info); - trace_end_dispatch_indirect(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], - cmdbuf, - (struct u_trace_address){.offset = buffer_gpu}); + struct panvk_instr_end_args instr_info = {.dispatch_indirect = { + .buffer_gpu = buffer_gpu, + }}; + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_COMPUTE, cmdbuf, + PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT, + &instr_info); } diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index da8f61bf4b4..09c5c9efce4 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -28,6 +28,7 @@ #include "panvk_image.h" #include "panvk_image_view.h" #include "panvk_instance.h" +#include "panvk_instr.h" #include "panvk_priv_bo.h" #include "panvk_query_pool.h" #include "panvk_shader.h" @@ -2855,8 +2856,10 @@ panvk_per_arch(CmdBeginRendering)(VkCommandBuffer commandBuffer, /* If we're not resuming, the FBD should be NULL. */ assert(!state->render.fbds.gpu || resuming); - trace_begin_render(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_VERTEX_TILER], cmdbuf); - trace_begin_render(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_VERTEX_TILER, cmdbuf, + PANVK_INSTR_WORK_TYPE_RENDER); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf, + PANVK_INSTR_WORK_TYPE_RENDER); if (!resuming) panvk_per_arch(cmd_preload_render_area_border)(cmdbuf, pRenderingInfo); @@ -3060,9 +3063,11 @@ issue_fragment_jobs(struct panvk_cmd_buffer *cmdbuf) length_reg); /* Wait for the tiling to be done before submitting the fragment job. */ - trace_begin_sync_wait(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf, + PANVK_INSTR_WORK_TYPE_SYNC_WAIT); wait_finish_tiling(cmdbuf); - trace_end_sync_wait(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf); + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf, + PANVK_INSTR_WORK_TYPE_SYNC_WAIT, NULL); /* Disable the oom handler once the vertex/tiler work has finished. * We need to disable the handler at this point as the vertex/tiler subqueue @@ -3435,10 +3440,15 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer) if (!suspending) panvk_per_arch(cmd_resolve_attachments)(cmdbuf); - trace_end_render(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_VERTEX_TILER], cmdbuf, - cmdbuf->state.gfx.render.flags, - &cmdbuf->state.gfx.render.fb.info); - trace_end_render(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf, - cmdbuf->state.gfx.render.flags, - &cmdbuf->state.gfx.render.fb.info); + struct panvk_instr_end_args instr_info = { + .render = { + .flags = cmdbuf->state.gfx.render.flags, + .fb = &cmdbuf->state.gfx.render.fb.info, + }}; + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_VERTEX_TILER, cmdbuf, + PANVK_INSTR_WORK_TYPE_RENDER, + &instr_info); + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf, + PANVK_INSTR_WORK_TYPE_RENDER, + &instr_info); } diff --git a/src/panfrost/vulkan/csf/panvk_vX_instr.c b/src/panfrost/vulkan/csf/panvk_vX_instr.c new file mode 100644 index 00000000000..789ff30f85c --- /dev/null +++ b/src/panfrost/vulkan/csf/panvk_vX_instr.c @@ -0,0 +1,129 @@ +/* + * Copyright 2025 Arm Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#include "panvk_instr.h" +#include "panvk_tracepoints.h" +#include "panvk_utrace.h" + +#include "util/macros.h" + +static void +panvk_instr_end_barrier(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + const struct panvk_instr_end_args *const args) +{ + trace_end_barrier(&cmdbuf->utrace.uts[id], cmdbuf, + args->barrier.wait_sb_mask, + args->barrier.wait_subqueue_mask, args->barrier.l2, + args->barrier.lsc, args->barrier.other); +} + +static void +panvk_instr_end_cmdbuf(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + const struct panvk_instr_end_args *const args) +{ + trace_end_cmdbuf(&cmdbuf->utrace.uts[id], cmdbuf, args->cmdbuf.flags); +} + +static void +panvk_instr_end_render(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + const struct panvk_instr_end_args *const args) +{ + trace_end_render(&cmdbuf->utrace.uts[id], cmdbuf, args->render.flags, + args->render.fb); +} + +static void +panvk_instr_end_dispatch(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + const struct panvk_instr_end_args *const args) +{ + trace_end_dispatch(&cmdbuf->utrace.uts[id], cmdbuf, + args->dispatch.base_group_x, args->dispatch.base_group_y, + args->dispatch.base_group_z, args->dispatch.group_count_x, + args->dispatch.group_count_y, + args->dispatch.group_count_z, args->dispatch.group_size_x, + args->dispatch.group_size_y, args->dispatch.group_size_z); +} + +static void +panvk_instr_end_dispatch_indirect(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + const struct panvk_instr_end_args *const args) +{ + trace_end_dispatch_indirect(&cmdbuf->utrace.uts[id], cmdbuf, + (struct u_trace_address){ + .bo = NULL, + .offset = args->dispatch_indirect.buffer_gpu, + }); +} + +void +panvk_per_arch(panvk_instr_begin_work)(enum panvk_subqueue_id id, + struct panvk_cmd_buffer *cmdbuf, + enum panvk_instr_work_type work_type) +{ + switch (work_type) { + case PANVK_INSTR_WORK_TYPE_CMDBUF: + trace_begin_cmdbuf(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_META: + trace_begin_meta(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_RENDER: + trace_begin_render(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_DISPATCH: + trace_begin_dispatch(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT: + trace_begin_dispatch_indirect(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_BARRIER: + trace_begin_barrier(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_SYNC_WAIT: + trace_begin_sync_wait(&cmdbuf->utrace.uts[id], cmdbuf); + break; + default: + unreachable("unsupported panvk_instr_work_type"); + } +} + +void +panvk_per_arch(panvk_instr_end_work)( + enum panvk_subqueue_id id, struct panvk_cmd_buffer *cmdbuf, + enum panvk_instr_work_type work_type, + const struct panvk_instr_end_args *const args) +{ + switch (work_type) { + case PANVK_INSTR_WORK_TYPE_CMDBUF: + panvk_instr_end_cmdbuf(id, cmdbuf, args); + break; + case PANVK_INSTR_WORK_TYPE_META: + trace_end_meta(&cmdbuf->utrace.uts[id], cmdbuf); + break; + case PANVK_INSTR_WORK_TYPE_RENDER: + panvk_instr_end_render(id, cmdbuf, args); + break; + case PANVK_INSTR_WORK_TYPE_DISPATCH: + panvk_instr_end_dispatch(id, cmdbuf, args); + break; + case PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT: + panvk_instr_end_dispatch_indirect(id, cmdbuf, args); + break; + case PANVK_INSTR_WORK_TYPE_BARRIER: + panvk_instr_end_barrier(id, cmdbuf, args); + break; + case PANVK_INSTR_WORK_TYPE_SYNC_WAIT: + trace_end_sync_wait(&cmdbuf->utrace.uts[id], cmdbuf); + break; + default: + unreachable("unsupported panvk_instr_work_type"); + } +} diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index c25fd45bdcc..97c93bd084d 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -93,6 +93,7 @@ csf_files = [ 'csf/panvk_vX_event.c', 'csf/panvk_vX_exception_handler.c', 'csf/panvk_vX_gpu_queue.c', + 'csf/panvk_vX_instr.c', 'csf/panvk_vX_utrace.c', ] diff --git a/src/panfrost/vulkan/panvk_vX_cmd_meta.c b/src/panfrost/vulkan/panvk_vX_cmd_meta.c index 9ad416a2d48..479c1533c7c 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_meta.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -7,6 +7,9 @@ #include "panvk_cmd_meta.h" #include "panvk_entrypoints.h" #include "panvk_tracepoints.h" +#if PAN_ARCH >= 10 +#include "csf/panvk_instr.h" +#endif static bool copy_to_image_use_gfx_pipeline(struct panvk_device *dev, @@ -48,7 +51,8 @@ panvk_per_arch(cmd_meta_compute_start)( save_ctx->cs.desc = cmdbuf->state.compute.cs.desc; #if PAN_ARCH >= 10 - trace_begin_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_COMPUTE, cmdbuf, + PANVK_INSTR_WORK_TYPE_META); #endif } @@ -61,7 +65,8 @@ panvk_per_arch(cmd_meta_compute_end)( cmdbuf->state.compute.desc_state.push_sets[0]; #if PAN_ARCH >= 10 - trace_end_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf); + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_COMPUTE, cmdbuf, + PANVK_INSTR_WORK_TYPE_META, NULL); #endif cmdbuf->state.compute.desc_state.sets[0] = save_ctx->set0; @@ -119,8 +124,10 @@ panvk_per_arch(cmd_meta_gfx_start)( cmdbuf->state.gfx.vk_meta = true; #if PAN_ARCH >= 10 - trace_begin_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_VERTEX_TILER], cmdbuf); - trace_begin_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_VERTEX_TILER, cmdbuf, + PANVK_INSTR_WORK_TYPE_META); + panvk_per_arch(panvk_instr_begin_work)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf, + PANVK_INSTR_WORK_TYPE_META); #endif } @@ -133,8 +140,10 @@ panvk_per_arch(cmd_meta_gfx_end)( cmdbuf->state.gfx.desc_state.push_sets[0]; #if PAN_ARCH >= 10 - trace_end_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_VERTEX_TILER], cmdbuf); - trace_end_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf); + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_VERTEX_TILER, cmdbuf, + PANVK_INSTR_WORK_TYPE_META, NULL); + panvk_per_arch(panvk_instr_end_work)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf, + PANVK_INSTR_WORK_TYPE_META, NULL); #endif cmdbuf->state.gfx.desc_state.sets[0] = save_ctx->set0;