Module: Mesa Branch: main Commit: f0160ee2ab3598f379af23323d0057518d85a566 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f0160ee2ab3598f379af23323d0057518d85a566
Author: Lionel Landwerlin <[email protected]> Date: Sat May 21 19:04:21 2022 +0300 intel/ds: track secondary cmdbuffers in perfetto Signed-off-by: Lionel Landwerlin <[email protected]> Reviewed-by: Emma Anholt <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16655> --- src/intel/ds/intel_driver_ds.cc | 20 ++++++++++++-------- src/intel/ds/intel_driver_ds.h | 10 ++++++++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/intel/ds/intel_driver_ds.cc b/src/intel/ds/intel_driver_ds.cc index 0ab7af3e91b..c8efb8fdb1d 100644 --- a/src/intel/ds/intel_driver_ds.cc +++ b/src/intel/ds/intel_driver_ds.cc @@ -197,7 +197,7 @@ send_descriptors(IntelRenderpassDataSource::TraceContext &ctx, device->event_id = 0; u_vector_foreach(queue, &device->queues) { for (uint32_t s = 0; s < ARRAY_SIZE(queue->stages); s++) { - queue->stages[s].start_ns = 0; + queue->stages[s].start_ns[0] = 0; } } @@ -261,16 +261,17 @@ static void begin_event(struct intel_ds_queue *queue, uint64_t ts_ns, enum intel_ds_queue_stage stage_id) { + uint32_t level = queue->stages[stage_id].level; /* If we haven't managed to calibrate the alignment between GPU and CPU * timestamps yet, then skip this trace, otherwise perfetto won't know * what to do with it. */ if (!queue->device->sync_gpu_ts) { - queue->stages[stage_id].start_ns = 0; + queue->stages[stage_id].start_ns[level] = 0; return; } - queue->stages[stage_id].start_ns = ts_ns; + queue->stages[stage_id].start_ns[level] = ts_ns; } static void @@ -288,8 +289,12 @@ end_event(struct intel_ds_queue *queue, uint64_t ts_ns, if (!device->sync_gpu_ts) return; + if (queue->stages[stage_id].level == 0) + return; + + uint32_t level = --queue->stages[stage_id].level; struct intel_ds_stage *stage = &queue->stages[stage_id]; - uint64_t start_ns = stage->start_ns; + uint64_t start_ns = stage->start_ns[level]; if (!start_ns) return; @@ -326,7 +331,7 @@ end_event(struct intel_ds_queue *queue, uint64_t ts_ns, } }); - stage->start_ns = 0; + stage->start_ns[level] = 0; } static void @@ -402,7 +407,6 @@ extern "C" { &trace_payload_as_extra_intel_end_##event_name); \ } \ - CREATE_DUAL_EVENT_CALLBACK(batch, INTEL_DS_QUEUE_STAGE_CMD_BUFFER) CREATE_DUAL_EVENT_CALLBACK(cmd_buffer, INTEL_DS_QUEUE_STAGE_CMD_BUFFER) CREATE_DUAL_EVENT_CALLBACK(render_pass, INTEL_DS_QUEUE_STAGE_RENDER_PASS) @@ -444,8 +448,8 @@ intel_ds_end_stall(struct intel_ds_device *device, { const struct intel_ds_flush_data *flush = (const struct intel_ds_flush_data *) flush_data; - end_event(flush->queue, ts_ns, INTEL_DS_QUEUE_STAGE_STALL, flush->submission_id, - payload, + end_event(flush->queue, ts_ns, INTEL_DS_QUEUE_STAGE_STALL, + flush->submission_id, payload, (trace_payload_as_extra_func)custom_trace_payload_as_extra_end_stall); } diff --git a/src/intel/ds/intel_driver_ds.h b/src/intel/ds/intel_driver_ds.h index 243c161785e..52c5a436d5c 100644 --- a/src/intel/ds/intel_driver_ds.h +++ b/src/intel/ds/intel_driver_ds.h @@ -119,8 +119,14 @@ struct intel_ds_stage { /* Unique stage IID */ uint64_t stage_iid; - /* Start timestamp of the last work element */ - uint64_t start_ns; + /* Start timestamp of the last work element. We have a array indexed by + * level so that we can track multi levels of events (like + * primary/secondary command buffers). + */ + uint64_t start_ns[5]; + + /* Current number of valid elements in start_ns */ + uint32_t level; }; struct intel_ds_queue {
