Module: Mesa
Branch: main
Commit: 9a16effeac8cc808745729ab617869c29a0f13d2
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a16effeac8cc808745729ab617869c29a0f13d2

Author: Lionel Landwerlin <[email protected]>
Date:   Sat May 21 00:38:40 2022 +0300

anv: record secondaries' traces into primaries

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    |  1 +
 src/intel/ds/intel_tracepoints.py  |  3 +++
 src/intel/vulkan/anv_genX.h        |  2 ++
 src/intel/vulkan/anv_utrace.c      |  1 +
 src/intel/vulkan/genX_cmd_buffer.c | 41 ++++++++++++++++++++++++++++++++++++++
 src/intel/vulkan/genX_gpu_memcpy.c |  4 ++++
 6 files changed, 52 insertions(+)

diff --git a/src/intel/ds/intel_driver_ds.cc b/src/intel/ds/intel_driver_ds.cc
index f221b6bc516..0ab7af3e91b 100644
--- a/src/intel/ds/intel_driver_ds.cc
+++ b/src/intel/ds/intel_driver_ds.cc
@@ -423,6 +423,7 @@ CREATE_DUAL_EVENT_CALLBACK(draw_mesh_indirect_count, 
INTEL_DS_QUEUE_STAGE_DRAW_M
 CREATE_DUAL_EVENT_CALLBACK(xfb, INTEL_DS_QUEUE_STAGE_CMD_BUFFER)
 CREATE_DUAL_EVENT_CALLBACK(compute, INTEL_DS_QUEUE_STAGE_COMPUTE)
 CREATE_DUAL_EVENT_CALLBACK(generate_draws, INTEL_DS_QUEUE_STAGE_GENERATE_DRAWS)
+CREATE_DUAL_EVENT_CALLBACK(trace_copy, INTEL_DS_QUEUE_STAGE_BLORP)
 
 void
 intel_ds_begin_stall(struct intel_ds_device *device,
diff --git a/src/intel/ds/intel_tracepoints.py 
b/src/intel/ds/intel_tracepoints.py
index d43cf2ec28e..8811f6db87e 100644
--- a/src/intel/ds/intel_tracepoints.py
+++ b/src/intel/ds/intel_tracepoints.py
@@ -121,6 +121,9 @@ def define_tracepoints(args):
                           Arg(type='uint32_t', var='group_z', c_format='%u'),],
                  tp_print=['group=%ux%ux%u', '__entry->group_x', 
'__entry->group_y', '__entry->group_z'])
 
+    # Used to identify copies generated by utrace
+    begin_end_tp('trace_copy', end_pipelined=True)
+
     def flag_bits(args):
         bits = [Arg(type='enum intel_ds_stall_flag', name='flags', 
var='decode_cb(flags)', c_format='0x%x')]
         for a in args:
diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h
index f19e77d23a5..7f3be040c7d 100644
--- a/src/intel/vulkan/anv_genX.h
+++ b/src/intel/vulkan/anv_genX.h
@@ -97,6 +97,8 @@ void genX(emit_so_memcpy_init)(struct anv_memcpy_state *state,
 
 void genX(emit_so_memcpy_fini)(struct anv_memcpy_state *state);
 
+void genX(emit_so_memcpy_end)(struct anv_memcpy_state *state);
+
 void genX(emit_so_memcpy)(struct anv_memcpy_state *state,
                           struct anv_address dst, struct anv_address src,
                           uint32_t size);
diff --git a/src/intel/vulkan/anv_utrace.c b/src/intel/vulkan/anv_utrace.c
index 13e42e4aaf3..1c2f0e4aca3 100644
--- a/src/intel/vulkan/anv_utrace.c
+++ b/src/intel/vulkan/anv_utrace.c
@@ -158,6 +158,7 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
          }
       }
       anv_genX(device->info, emit_so_memcpy_fini)(&flush->memcpy_state);
+      anv_genX(device->info, emit_so_memcpy_end)(&flush->memcpy_state);
 
       u_trace_flush(&flush->ds.trace, flush, true);
 
diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 8914c831f3c..95d8a4430c3 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -3741,6 +3741,23 @@ genX(EndCommandBuffer)(
    return VK_SUCCESS;
 }
 
+static void
+cmd_buffer_emit_copy_ts_buffer(struct u_trace_context *utctx,
+                               void *cmdstream,
+                               void *ts_from, uint32_t from_offset,
+                               void *ts_to, uint32_t to_offset,
+                               uint32_t count)
+{
+   struct anv_memcpy_state *memcpy_state = cmdstream;
+   struct anv_address from_addr = (struct anv_address) {
+      .bo = ts_from, .offset = from_offset * sizeof(uint64_t) };
+   struct anv_address to_addr = (struct anv_address) {
+      .bo = ts_to, .offset = to_offset * sizeof(uint64_t) };
+
+   genX(emit_so_memcpy)(memcpy_state, to_addr, from_addr,
+                        count * sizeof(uint64_t));
+}
+
 void
 genX(CmdExecuteCommands)(
     VkCommandBuffer                             commandBuffer,
@@ -3858,6 +3875,30 @@ genX(CmdExecuteCommands)(
     * address calls?
     */
    genX(cmd_buffer_emit_state_base_address)(primary);
+
+   /* Copy of utrace timestamp buffers from secondary into primary */
+   struct anv_device *device = primary->device;
+   if (u_trace_enabled(&device->ds.trace_context)) {
+      trace_intel_begin_trace_copy(&primary->trace);
+
+      struct anv_memcpy_state memcpy_state;
+      genX(emit_so_memcpy_init)(&memcpy_state, device, &primary->batch);
+      for (uint32_t i = 0; i < commandBufferCount; i++) {
+         ANV_FROM_HANDLE(anv_cmd_buffer, secondary, pCmdBuffers[i]);
+
+         u_trace_clone_append(u_trace_begin_iterator(&secondary->trace),
+                              u_trace_end_iterator(&secondary->trace),
+                              &primary->trace,
+                              &memcpy_state,
+                              cmd_buffer_emit_copy_ts_buffer);
+      }
+      genX(emit_so_memcpy_fini)(&memcpy_state);
+
+      trace_intel_end_trace_copy(&primary->trace);
+
+      /* Memcpy is done using the 3D pipeline. */
+      primary->state.current_pipeline = _3D;
+   }
 }
 
 static void
diff --git a/src/intel/vulkan/genX_gpu_memcpy.c 
b/src/intel/vulkan/genX_gpu_memcpy.c
index a41bd44a1d0..27ee96604ed 100644
--- a/src/intel/vulkan/genX_gpu_memcpy.c
+++ b/src/intel/vulkan/genX_gpu_memcpy.c
@@ -253,7 +253,11 @@ genX(emit_so_memcpy_fini)(struct anv_memcpy_state *state)
 {
    genX(emit_apply_pipe_flushes)(state->batch, state->device, _3D,
                                  ANV_PIPE_END_OF_PIPE_SYNC_BIT);
+}
 
+void
+genX(emit_so_memcpy_end)(struct anv_memcpy_state *state)
+{
    anv_batch_emit(state->batch, GENX(MI_BATCH_BUFFER_END), end);
 
    if ((state->batch->next - state->batch->start) & 4)

Reply via email to