From c8cc9e781d49929e3c34e9f7fab9710ea84ba78f Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 5 Dec 2024 13:18:14 -0800 Subject: [PATCH] panvk/csf: add more utrace tracepoints Add all newly defined tracepoints, including meta, render, dispatch/dispatch_indirect, barrier, and sync_wait. Signed-off-by: Chia-I Wu Reviewed-by: Christoph Pillmayer Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 16 +++++++++++++++- .../vulkan/csf/panvk_vX_cmd_dispatch.c | 18 ++++++++++++++++++ src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 13 +++++++++++++ src/panfrost/vulkan/panvk_vX_cmd_meta.c | 19 +++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index 431296ec9c4..f2ae5f85341 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -585,6 +585,7 @@ panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, struct panvk_cs_deps deps) { uint32_t wait_subqueue_mask = 0; + uint32_t utrace_subqueue_mask = 0; for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { /* no need to perform both types of waits on the same subqueue */ if (deps.src[i].wait_sb_mask) @@ -592,10 +593,16 @@ panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, assert(!(deps.dst[i].wait_subqueue_mask & BITFIELD_BIT(i))); wait_subqueue_mask |= deps.dst[i].wait_subqueue_mask; + + if (deps.src[i].wait_sb_mask || deps.dst[i].wait_subqueue_mask || + !panvk_cache_flush_is_nop(&deps.src[i].cache_flush)) + utrace_subqueue_mask |= BITFIELD_BIT(i); } - for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { + u_foreach_bit(i, utrace_subqueue_mask) + trace_begin_barrier(&cmdbuf->utrace.uts[i], cmdbuf); + for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { struct cs_builder *b = panvk_get_cs_builder(cmdbuf, i); struct panvk_cs_state *cs_state = &cmdbuf->state.cs[i]; @@ -643,6 +650,13 @@ panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, emit_barrier_insert_waits(b, cmdbuf, &deps, i, tmp_regs); } } + + 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); + } } VKAPI_ATTR void VKAPI_CALL diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c index e08a462b35e..66abacb62fc 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c @@ -23,6 +23,7 @@ #include "panvk_macros.h" #include "panvk_meta.h" #include "panvk_physical_device.h" +#include "panvk_tracepoints.h" #include "pan_desc.h" #include "pan_encoder.h" @@ -351,11 +352,20 @@ panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t groupCountY, uint32_t groupCountZ) { VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + const struct panvk_shader *shader = cmdbuf->state.compute.shader; struct panvk_dispatch_info info = { .wg_base = {baseGroupX, baseGroupY, baseGroupZ}, .direct.wg_count = {groupCountX, groupCountY, groupCountZ}, }; + + trace_begin_dispatch(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf); + 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); } VKAPI_ATTR void VKAPI_CALL @@ -368,5 +378,13 @@ panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer, struct panvk_dispatch_info info = { .indirect.buffer_dev_addr = buffer_gpu, }; + + trace_begin_dispatch_indirect(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], + cmdbuf); + cmd_dispatch(cmdbuf, &info); + + trace_end_dispatch_indirect(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], + cmdbuf, + (struct u_trace_address){.offset = buffer_gpu}); } diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 1a65da39fb0..205957aa234 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -31,6 +31,7 @@ #include "panvk_priv_bo.h" #include "panvk_query_pool.h" #include "panvk_shader.h" +#include "panvk_tracepoints.h" #include "pan_desc.h" #include "pan_earlyzs.h" @@ -2829,6 +2830,9 @@ 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); + if (!resuming) panvk_per_arch(cmd_preload_render_area_border)(cmdbuf, pRenderingInfo); } @@ -3031,7 +3035,9 @@ 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); wait_finish_tiling(cmdbuf); + trace_end_sync_wait(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_FRAGMENT], cmdbuf); /* 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 @@ -3403,4 +3409,11 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer) /* If we're not suspending, we need to resolve attachments. */ 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); } diff --git a/src/panfrost/vulkan/panvk_vX_cmd_meta.c b/src/panfrost/vulkan/panvk_vX_cmd_meta.c index 6f8f019adea..9ad416a2d48 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_meta.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -6,6 +6,7 @@ #include "panvk_cmd_meta.h" #include "panvk_entrypoints.h" +#include "panvk_tracepoints.h" static bool copy_to_image_use_gfx_pipeline(struct panvk_device *dev, @@ -45,6 +46,10 @@ panvk_per_arch(cmd_meta_compute_start)( save_ctx->push_constants = cmdbuf->state.push_constants; save_ctx->cs.shader = cmdbuf->state.compute.shader; save_ctx->cs.desc = cmdbuf->state.compute.cs.desc; + +#if PAN_ARCH >= 10 + trace_begin_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf); +#endif } void @@ -55,6 +60,10 @@ panvk_per_arch(cmd_meta_compute_end)( struct panvk_descriptor_set *push_set0 = cmdbuf->state.compute.desc_state.push_sets[0]; +#if PAN_ARCH >= 10 + trace_end_meta(&cmdbuf->utrace.uts[PANVK_SUBQUEUE_COMPUTE], cmdbuf); +#endif + cmdbuf->state.compute.desc_state.sets[0] = save_ctx->set0; if (save_ctx->push_set0.desc_count) { memcpy(push_set0->descs.host, save_ctx->push_set0.desc_storage, @@ -108,6 +117,11 @@ panvk_per_arch(cmd_meta_gfx_start)( gfx_state_set_dirty(cmdbuf, OQ); 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); +#endif } void @@ -118,6 +132,11 @@ panvk_per_arch(cmd_meta_gfx_end)( struct panvk_descriptor_set *push_set0 = 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); +#endif + cmdbuf->state.gfx.desc_state.sets[0] = save_ctx->set0; if (save_ctx->push_set0.desc_count) { memcpy(push_set0->descs.host, save_ctx->push_set0.desc_storage,