panvk: Make panvk_utrace_record_ts wait mask configurable

This is so that in subsequent commits the wait mask can be:
- set by the caller
- not provided at all -> synchronous ts write

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-15 13:14:22 +00:00 committed by Marge Bot
parent 7358f0e045
commit 737156b4df
3 changed files with 54 additions and 31 deletions

View file

@ -12,10 +12,10 @@
static void
panvk_instr_end_barrier(enum panvk_subqueue_id id,
struct panvk_cmd_buffer *cmdbuf,
struct panvk_utrace_cs_info *cs_info,
const struct panvk_instr_end_args *const args)
{
trace_end_barrier(&cmdbuf->utrace.uts[id], cmdbuf,
trace_end_barrier(&cs_info->cmdbuf->utrace.uts[id], cs_info,
args->barrier.wait_sb_mask,
args->barrier.wait_subqueue_mask, args->barrier.l2,
args->barrier.lsc, args->barrier.other);
@ -23,27 +23,27 @@ panvk_instr_end_barrier(enum panvk_subqueue_id id,
static void
panvk_instr_end_cmdbuf(enum panvk_subqueue_id id,
struct panvk_cmd_buffer *cmdbuf,
struct panvk_utrace_cs_info *cs_info,
const struct panvk_instr_end_args *const args)
{
trace_end_cmdbuf(&cmdbuf->utrace.uts[id], cmdbuf, args->cmdbuf.flags);
trace_end_cmdbuf(&cs_info->cmdbuf->utrace.uts[id], cs_info, args->cmdbuf.flags);
}
static void
panvk_instr_end_render(enum panvk_subqueue_id id,
struct panvk_cmd_buffer *cmdbuf,
struct panvk_utrace_cs_info *cs_info,
const struct panvk_instr_end_args *const args)
{
trace_end_render(&cmdbuf->utrace.uts[id], cmdbuf, args->render.flags,
trace_end_render(&cs_info->cmdbuf->utrace.uts[id], cs_info, args->render.flags,
args->render.fb);
}
static void
panvk_instr_end_dispatch(enum panvk_subqueue_id id,
struct panvk_cmd_buffer *cmdbuf,
struct panvk_utrace_cs_info *cs_info,
const struct panvk_instr_end_args *const args)
{
trace_end_dispatch(&cmdbuf->utrace.uts[id], cmdbuf,
trace_end_dispatch(&cs_info->cmdbuf->utrace.uts[id], cs_info,
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,
@ -53,10 +53,10 @@ panvk_instr_end_dispatch(enum panvk_subqueue_id id,
static void
panvk_instr_end_dispatch_indirect(enum panvk_subqueue_id id,
struct panvk_cmd_buffer *cmdbuf,
struct panvk_utrace_cs_info *cs_info,
const struct panvk_instr_end_args *const args)
{
trace_end_dispatch_indirect(&cmdbuf->utrace.uts[id], cmdbuf,
trace_end_dispatch_indirect(&cs_info->cmdbuf->utrace.uts[id], cs_info,
(struct u_trace_address){
.bo = NULL,
.offset = args->dispatch_indirect.buffer_gpu,
@ -68,27 +68,33 @@ panvk_per_arch(panvk_instr_begin_work)(enum panvk_subqueue_id id,
struct panvk_cmd_buffer *cmdbuf,
enum panvk_instr_work_type work_type)
{
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
struct panvk_utrace_cs_info cs_info = {
.cmdbuf = cmdbuf,
.ts_wait_mask = dev->csf.sb.all_iters_mask | SB_MASK(DEFERRED_FLUSH),
};
switch (work_type) {
case PANVK_INSTR_WORK_TYPE_CMDBUF:
trace_begin_cmdbuf(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_cmdbuf(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_META:
trace_begin_meta(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_meta(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_RENDER:
trace_begin_render(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_render(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_DISPATCH:
trace_begin_dispatch(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_dispatch(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT:
trace_begin_dispatch_indirect(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_dispatch_indirect(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_BARRIER:
trace_begin_barrier(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_barrier(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_SYNC_WAIT:
trace_begin_sync_wait(&cmdbuf->utrace.uts[id], cmdbuf);
trace_begin_sync_wait(&cmdbuf->utrace.uts[id], &cs_info);
break;
default:
unreachable("unsupported panvk_instr_work_type");
@ -101,27 +107,33 @@ panvk_per_arch(panvk_instr_end_work)(
enum panvk_instr_work_type work_type,
const struct panvk_instr_end_args *const args)
{
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
struct panvk_utrace_cs_info cs_info = {
.cmdbuf = cmdbuf,
.ts_wait_mask = dev->csf.sb.all_iters_mask | SB_MASK(DEFERRED_FLUSH),
};
switch (work_type) {
case PANVK_INSTR_WORK_TYPE_CMDBUF:
panvk_instr_end_cmdbuf(id, cmdbuf, args);
panvk_instr_end_cmdbuf(id, &cs_info, args);
break;
case PANVK_INSTR_WORK_TYPE_META:
trace_end_meta(&cmdbuf->utrace.uts[id], cmdbuf);
trace_end_meta(&cmdbuf->utrace.uts[id], &cs_info);
break;
case PANVK_INSTR_WORK_TYPE_RENDER:
panvk_instr_end_render(id, cmdbuf, args);
panvk_instr_end_render(id, &cs_info, args);
break;
case PANVK_INSTR_WORK_TYPE_DISPATCH:
panvk_instr_end_dispatch(id, cmdbuf, args);
panvk_instr_end_dispatch(id, &cs_info, args);
break;
case PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT:
panvk_instr_end_dispatch_indirect(id, cmdbuf, args);
panvk_instr_end_dispatch_indirect(id, &cs_info, args);
break;
case PANVK_INSTR_WORK_TYPE_BARRIER:
panvk_instr_end_barrier(id, cmdbuf, args);
panvk_instr_end_barrier(id, &cs_info, args);
break;
case PANVK_INSTR_WORK_TYPE_SYNC_WAIT:
trace_end_sync_wait(&cmdbuf->utrace.uts[id], cmdbuf);
trace_end_sync_wait(&cmdbuf->utrace.uts[id], &cs_info);
break;
default:
unreachable("unsupported panvk_instr_work_type");

View file

@ -14,13 +14,11 @@
static void
cmd_write_timestamp(const struct panvk_device *dev, struct cs_builder *b,
uint64_t addr)
uint64_t addr, uint32_t wait_mask)
{
const struct cs_index addr_reg = cs_scratch_reg64(b, 0);
/* abuse DEFERRED_SYNC */
const struct cs_async_op async =
cs_defer(dev->csf.sb.all_iters_mask | SB_MASK(DEFERRED_FLUSH),
SB_ID(DEFERRED_SYNC));
const struct cs_async_op async = cs_defer(wait_mask, SB_ID(DEFERRED_SYNC));
cs_move64_to(b, addr_reg, addr);
cs_store_state(b, addr_reg, 0, MALI_CS_STATE_TIMESTAMP, async);
@ -82,13 +80,16 @@ static void
panvk_utrace_record_ts(struct u_trace *ut, void *cs, void *timestamps,
uint64_t offset_B, uint32_t flags)
{
struct panvk_cmd_buffer *cmdbuf = cs;
/* Here the input type for void *cs is panvk_utrace_cs_info instead of
* panvk_cmd_buffer so we can pass additional parameters. */
struct panvk_utrace_cs_info *cs_info = cs;
struct panvk_cmd_buffer *cmdbuf = cs_info->cmdbuf;
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
struct cs_builder *b = get_builder(cmdbuf, ut);
const struct panvk_priv_bo *bo = timestamps;
const uint64_t addr = bo->addr.dev + offset_B;
cmd_write_timestamp(dev, b, addr);
cmd_write_timestamp(dev, b, addr, cs_info->ts_wait_mask);
}
static void
@ -96,7 +97,10 @@ panvk_utrace_capture_data(struct u_trace *ut, void *cs, void *dst_buffer,
uint64_t dst_offset_B, void *src_buffer,
uint64_t src_offset_B, uint32_t size_B)
{
struct cs_builder *b = get_builder(cs, ut);
/* Here the input type for void *cs is panvk_utrace_cs_info instead of
* panvk_cmd_buffer so we can pass additional parameters. */
struct panvk_utrace_cs_info *cs_info = cs;
struct cs_builder *b = get_builder(cs_info->cmdbuf, ut);
const struct panvk_priv_bo *dst_bo = dst_buffer;
const uint64_t dst_addr = dst_bo->addr.dev + dst_offset_B;
const uint64_t src_addr = src_offset_B;

View file

@ -41,6 +41,13 @@ void panvk_utrace_delete_flush_data(struct u_trace_context *utctx,
#if PAN_ARCH >= 10
struct panvk_cmd_buffer;
struct panvk_utrace_cs_info {
struct panvk_cmd_buffer *cmdbuf;
uint32_t ts_wait_mask;
};
void panvk_per_arch(utrace_context_init)(struct panvk_device *dev);
void panvk_per_arch(utrace_context_fini)(struct panvk_device *dev);