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)
