panvk/utrace: Pass async_op instead of mask

This is needed to trace cs_defer_indirect.

Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36519>
This commit is contained in:
Lars-Ivar Hesselberg Simonsen 2025-08-01 12:18:51 +02:00 committed by Marge Bot
parent db4bcd48d7
commit abffb96c46
7 changed files with 35 additions and 22 deletions

View file

@ -69,9 +69,11 @@ void panvk_per_arch(panvk_instr_end_work)(
const struct panvk_instr_end_args *const args);
/**
* Mark the end of async work with an immediate scoreboard mask.
* Mark the end of async work with an async_op. Note that the signal_slot will
* be overwritten and should therefore be left as 0.
*/
void panvk_per_arch(panvk_instr_end_work_async)(
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, unsigned int wait_mask);
const struct panvk_instr_end_args *const args,
struct cs_async_op ts_async_op);

View file

@ -383,7 +383,7 @@ panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer,
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_COMPUTE, cmdbuf, PANVK_INSTR_WORK_TYPE_DISPATCH,
&instr_info, dev->csf.sb.all_iters_mask);
&instr_info, cs_defer(dev->csf.sb.all_iters_mask, 0));
}
VKAPI_ATTR void VKAPI_CALL
@ -408,5 +408,5 @@ panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer,
}};
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_COMPUTE, cmdbuf, PANVK_INSTR_WORK_TYPE_DISPATCH_INDIRECT,
&instr_info, dev->csf.sb.all_iters_mask);
&instr_info, cs_defer(dev->csf.sb.all_iters_mask, 0));
}

View file

@ -3568,8 +3568,8 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer)
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_VERTEX_TILER, cmdbuf, PANVK_INSTR_WORK_TYPE_RENDER,
&instr_info, dev->csf.sb.all_iters_mask);
&instr_info, cs_defer(dev->csf.sb.all_iters_mask, 0));
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_FRAGMENT, cmdbuf, PANVK_INSTR_WORK_TYPE_RENDER,
&instr_info, dev->csf.sb.all_iters_mask);
&instr_info, cs_defer(dev->csf.sb.all_iters_mask, 0));
}

View file

@ -68,11 +68,12 @@ 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 cs_async_op op = cs_now();
struct panvk_utrace_cs_info cs_info = {
.cmdbuf = cmdbuf,
/* For the begin marker, the caller should wait for dependencies before
calling begin. */
.ts_wait_mask = 0,
.ts_async_op = &op,
};
switch (work_type) {
@ -108,18 +109,20 @@ panvk_per_arch(panvk_instr_end_work)(
enum panvk_instr_work_type work_type,
const struct panvk_instr_end_args *const args)
{
panvk_per_arch(panvk_instr_end_work_async)(id, cmdbuf, work_type, args, 0);
panvk_per_arch(panvk_instr_end_work_async)(id, cmdbuf, work_type, args,
cs_now());
}
void
panvk_per_arch(panvk_instr_end_work_async)(
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, unsigned int wait_mask)
const struct panvk_instr_end_args *const args,
struct cs_async_op ts_async_op)
{
struct panvk_utrace_cs_info cs_info = {
.cmdbuf = cmdbuf,
.ts_wait_mask = wait_mask,
.ts_async_op = &ts_async_op,
};
switch (work_type) {

View file

@ -14,14 +14,22 @@
static void
cmd_write_timestamp(const struct panvk_device *dev, struct cs_builder *b,
uint64_t addr, uint32_t wait_mask)
uint64_t addr, struct cs_async_op ts_async_op)
{
const struct cs_index addr_reg = cs_scratch_reg64(b, 0);
/* Overwrite the signal_slot. Note that this has no effect in case of
* synchronous or indirect syncs. */
assert(!ts_async_op.wait_mask ||
#if PAN_ARCH >= 11
ts_async_op.indirect ||
#endif
ts_async_op.signal_slot == 0);
/* abuse DEFERRED_SYNC */
const struct cs_async_op async = cs_defer(wait_mask, SB_ID(DEFERRED_SYNC));
ts_async_op.signal_slot = SB_ID(DEFERRED_SYNC);
cs_move64_to(b, addr_reg, addr);
cs_store_state(b, addr_reg, 0, MALI_CS_STATE_TIMESTAMP, async);
cs_store_state(b, addr_reg, 0, MALI_CS_STATE_TIMESTAMP, ts_async_op);
}
static void
@ -90,7 +98,7 @@ panvk_utrace_record_ts(struct u_trace *ut, void *cs, void *timestamps,
const struct panvk_priv_bo *bo = timestamps;
const uint64_t addr = bo->addr.dev + offset_B;
cmd_write_timestamp(dev, b, addr, cs_info->ts_wait_mask);
cmd_write_timestamp(dev, b, addr, *cs_info->ts_async_op);
}
static void

View file

@ -45,7 +45,7 @@ struct panvk_cmd_buffer;
struct panvk_utrace_cs_info {
struct panvk_cmd_buffer *cmdbuf;
uint32_t ts_wait_mask;
struct cs_async_op *ts_async_op;
};
void panvk_per_arch(utrace_context_init)(struct panvk_device *dev);

View file

@ -66,9 +66,9 @@ panvk_per_arch(cmd_meta_compute_end)(
#if PAN_ARCH >= 10
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
panvk_per_arch(panvk_instr_end_work_async)(PANVK_SUBQUEUE_COMPUTE, cmdbuf,
PANVK_INSTR_WORK_TYPE_META, NULL,
dev->csf.sb.all_iters_mask);
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_COMPUTE, cmdbuf, PANVK_INSTR_WORK_TYPE_META, NULL,
cs_defer(dev->csf.sb.all_iters_mask, 0));
#endif
cmdbuf->state.compute.desc_state.sets[0] = save_ctx->set0;
@ -148,10 +148,10 @@ panvk_per_arch(cmd_meta_gfx_end)(
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_VERTEX_TILER, cmdbuf, PANVK_INSTR_WORK_TYPE_META, NULL,
dev->csf.sb.all_iters_mask);
panvk_per_arch(panvk_instr_end_work_async)(PANVK_SUBQUEUE_FRAGMENT, cmdbuf,
PANVK_INSTR_WORK_TYPE_META, NULL,
dev->csf.sb.all_iters_mask);
cs_defer(dev->csf.sb.all_iters_mask, 0));
panvk_per_arch(panvk_instr_end_work_async)(
PANVK_SUBQUEUE_FRAGMENT, cmdbuf, PANVK_INSTR_WORK_TYPE_META, NULL,
cs_defer(dev->csf.sb.all_iters_mask, 0));
#endif
cmdbuf->state.gfx.desc_state.sets[0] = save_ctx->set0;