diff --git a/src/panfrost/vulkan/panvk_utrace.c b/src/panfrost/vulkan/panvk_utrace.c index 63fc82dcb69..87e323526d3 100644 --- a/src/panfrost/vulkan/panvk_utrace.c +++ b/src/panfrost/vulkan/panvk_utrace.c @@ -51,6 +51,8 @@ panvk_utrace_create_buffer(struct u_trace_context *utctx, uint64_t size_B) .size = size_B, }; + memset(addr_host, 0, size_B); + return container; } diff --git a/src/panfrost/vulkan/panvk_utrace_perfetto.cc b/src/panfrost/vulkan/panvk_utrace_perfetto.cc index 726ea5d0e28..a4456db4d36 100644 --- a/src/panfrost/vulkan/panvk_utrace_perfetto.cc +++ b/src/panfrost/vulkan/panvk_utrace_perfetto.cc @@ -1,5 +1,6 @@ /* * Copyright 2024 Google LLC + * Copyright 2025 Arm Ltd. * SPDX-License-Identifier: MIT */ @@ -187,6 +188,11 @@ panvk_utrace_perfetto_begin_event(struct panvk_device *dev, if (!ev) return; + struct panvk_utrace_perfetto *utp = &dev->utrace.utp; + if (utp->queues[data->subqueue].stack_depth == 1) { + utp->base_ts_ns = ts_ns; + } + ev->begin_ns = ts_ns; } @@ -201,6 +207,14 @@ panvk_utrace_perfetto_end_event( if (!ev) return; + struct panvk_utrace_perfetto *utp = &dev->utrace.utp; + if (ev->begin_ns < utp->base_ts_ns) { + /* The event has started before the base event of this nested stack of + * events. Is is likely data from a previous submission, so we just drop + * it here. */ + return; + } + PanVKRenderpassDataSource::Trace( [=](PanVKRenderpassDataSource::TraceContext ctx) { struct panvk_utrace_perfetto *utp = &dev->utrace.utp; diff --git a/src/panfrost/vulkan/panvk_utrace_perfetto.h b/src/panfrost/vulkan/panvk_utrace_perfetto.h index dbc9c61bdaa..d971d48d0d8 100644 --- a/src/panfrost/vulkan/panvk_utrace_perfetto.h +++ b/src/panfrost/vulkan/panvk_utrace_perfetto.h @@ -51,6 +51,10 @@ struct panvk_utrace_perfetto { uint64_t next_clock_snapshot; uint64_t event_id; + /* Use this to reject unwritten timestamps with leftover data from previous + * submissions. */ + uint64_t base_ts_ns; + struct panvk_utrace_perfetto_queue queues[PANVK_UTRACE_PERFETTO_QUEUE_COUNT]; };