panvk: hide utrace behind more generic interface

Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Reviewed-by: Olivia Lee <olivia.lee@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36161>
This commit is contained in:
Christoph Pillmayer
2025-07-14 14:34:15 +00:00
committed by Marge Bot
parent 0ed1a10b73
commit 7358f0e045
7 changed files with 278 additions and 33 deletions
+69
View File
@@ -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);
+18 -7
View File
@@ -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;
}
+26 -10
View File
@@ -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);
}
+20 -10
View File
@@ -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);
}
+129
View File
@@ -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");
}
}
+1
View File
@@ -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',
]
+15 -6
View File
@@ -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;