From e5d3eba096939461689f5ec38e0c3cc56ee9a373 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Mon, 9 Sep 2024 14:04:23 +0200 Subject: [PATCH] u_trace: Fix trace_payload_as_extra_func desync between drivers Buffer with indirect args wasn't passed to the function which adds extra event args. Since function definition depends on the common code, the definition is moved to a single place. Fixes: 0a17035b5cd3e181a2bf4ab6feea8b4d5763b613 ("u_trace: add support for indirect data") Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/vulkan/tu_perfetto.cc | 12 ++++++------ src/gallium/drivers/radeonsi/si_perfetto.cpp | 5 +---- src/intel/ds/intel_driver_ds.cc | 2 -- src/util/perf/u_trace.py | 2 ++ 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/freedreno/vulkan/tu_perfetto.cc b/src/freedreno/vulkan/tu_perfetto.cc index 3281eca1873..93afa1f9bd1 100644 --- a/src/freedreno/vulkan/tu_perfetto.cc +++ b/src/freedreno/vulkan/tu_perfetto.cc @@ -182,8 +182,6 @@ stage_push(struct tu_device *dev) return &p->stages[p->stage_depth++]; } -typedef void (*trace_payload_as_extra_func)(perfetto::protos::pbzero::GpuRenderStageEvent *, const void*); - static struct tu_perfetto_stage * stage_pop(struct tu_device *dev) { @@ -207,6 +205,7 @@ stage_start(struct tu_device *dev, const char *app_event, const void *payload = nullptr, size_t payload_size = 0, + const void *indirect = nullptr, trace_payload_as_extra_func payload_as_extra = nullptr) { struct tu_perfetto_stage *stage = stage_push(dev); @@ -245,6 +244,7 @@ static void stage_end(struct tu_device *dev, uint64_t ts_ns, enum tu_stage_id stage_id, const void *flush_data, const void* payload = nullptr, + const void *indirect = nullptr, trace_payload_as_extra_func payload_as_extra = nullptr) { struct tu_perfetto_stage *stage = stage_pop(dev); @@ -296,12 +296,12 @@ stage_end(struct tu_device *dev, uint64_t ts_ns, enum tu_stage_id stage_id, if (stage->payload) { if (stage->start_payload_function) ((trace_payload_as_extra_func) stage->start_payload_function)( - event, stage->payload); + event, stage->payload, nullptr); free((void *)stage->payload); } if (payload && payload_as_extra) - payload_as_extra(event, payload); + payload_as_extra(event, payload, indirect); }); } @@ -480,7 +480,7 @@ tu_perfetto_submit(struct tu_device *dev, const void *indirect_data) \ { \ stage_start( \ - dev, ts_ns, stage_id, NULL, payload, sizeof(*payload), \ + dev, ts_ns, stage_id, NULL, payload, sizeof(*payload), indirect_data, \ (trace_payload_as_extra_func) &trace_payload_as_extra_start_##event_name); \ } \ \ @@ -490,7 +490,7 @@ tu_perfetto_submit(struct tu_device *dev, const void *indirect_data) \ { \ stage_end( \ - dev, ts_ns, stage_id, flush_data, payload, \ + dev, ts_ns, stage_id, flush_data, payload, indirect_data, \ (trace_payload_as_extra_func) &trace_payload_as_extra_end_##event_name); \ } diff --git a/src/gallium/drivers/radeonsi/si_perfetto.cpp b/src/gallium/drivers/radeonsi/si_perfetto.cpp index 7c22f7995ea..9b57220934f 100644 --- a/src/gallium/drivers/radeonsi/si_perfetto.cpp +++ b/src/gallium/drivers/radeonsi/si_perfetto.cpp @@ -154,9 +154,6 @@ static void send_descriptors(SIRenderpassDataSource::TraceContext &ctx, sync_timestamp(ctx, device); } -typedef void (*trace_payload_as_extra_func)(perfetto::protos::pbzero::GpuRenderStageEvent *, - const void*); - static void begin_event(struct si_ds_queue *queue, uint64_t ts_ns, enum si_ds_queue_stage stage_id) { PERFETTO_LOG("begin event called - ts_ns=%" PRIu64, ts_ns); @@ -237,7 +234,7 @@ static void end_event(struct si_ds_queue *queue, uint64_t ts_ns, enum si_ds_queu event->set_submission_id(submission_id); if (payload && payload_as_extra) { - payload_as_extra(event, payload); + payload_as_extra(event, payload, nullptr); } }); diff --git a/src/intel/ds/intel_driver_ds.cc b/src/intel/ds/intel_driver_ds.cc index 9032aad3e7d..618cd2fa90a 100644 --- a/src/intel/ds/intel_driver_ds.cc +++ b/src/intel/ds/intel_driver_ds.cc @@ -229,8 +229,6 @@ send_descriptors(IntelRenderpassDataSource::TraceContext &ctx, sync_timestamp(ctx, device); } -typedef void (*trace_payload_as_extra_func)(perfetto::protos::pbzero::GpuRenderStageEvent *, const void*, const void *); - static void begin_event(struct intel_ds_queue *queue, uint64_t ts_ns, enum intel_ds_queue_stage stage_id) diff --git a/src/util/perf/u_trace.py b/src/util/perf/u_trace.py index d0ef6ddf643..5921841ae5b 100644 --- a/src/util/perf/u_trace.py +++ b/src/util/perf/u_trace.py @@ -679,6 +679,8 @@ UNUSED static const char *${basename}_names[] = { % endfor }; +typedef void (*trace_payload_as_extra_func)(perfetto::protos::pbzero::GpuRenderStageEvent *, const void*, const void*); + % for trace_name, trace in TRACEPOINTS.items(): static void UNUSED trace_payload_as_extra_${trace_name}(perfetto::protos::pbzero::GpuRenderStageEvent *event,