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 {

Reply via email to