mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
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:
parent
7358f0e045
commit
737156b4df
3 changed files with 54 additions and 31 deletions
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue