From 6893f2b5b4279457469072168721b830da4f825b Mon Sep 17 00:00:00 2001 From: Felix DeGrood Date: Tue, 3 Jan 2023 19:22:30 +0000 Subject: [PATCH] anv: Emit CS stall on INTEL_MEASURE timestamp For INTEL_MEASURE, ensure all prior instructions completed before timestamp taken. Continue to support no CS flush case for Perfetto. CS stall was dropped from pipecontrol when adding u_trace support. Fixes: cc5843a573b ("anv: implement u_trace support") Reviewed-by: Lionel Landwerlin Part-of: (cherry picked from commit 7f6beb8537bef69a9b14ec24aa4c817742d219df) --- .pick_status.json | 2 +- src/intel/vulkan/anv_genX.h | 2 +- src/intel/vulkan/anv_measure.c | 4 ++-- src/intel/vulkan/anv_private.h | 8 +++++++- src/intel/vulkan/anv_utrace.c | 5 ++++- src/intel/vulkan/genX_cmd_buffer.c | 29 +++++++++++++++++++++++------ 6 files changed, 38 insertions(+), 12 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index a35f09b8d4b..54cafb989f3 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2605,7 +2605,7 @@ "description": "anv: Emit CS stall on INTEL_MEASURE timestamp", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "cc5843a573bd0412c547b4f2af3cce18263ecfd4" }, diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index b556813897c..acc17cf0455 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -150,7 +150,7 @@ void genX(blorp_exec)(struct blorp_batch *batch, void genX(cmd_emit_timestamp)(struct anv_batch *batch, struct anv_device *device, struct anv_address addr, - bool end_of_pipe); + enum anv_timestamp_capture_type); void genX(batch_emit_dummy_post_sync_op)(struct anv_batch *batch, struct anv_device *device, diff --git a/src/intel/vulkan/anv_measure.c b/src/intel/vulkan/anv_measure.c index 41957cf56e9..8831f4cbeac 100644 --- a/src/intel/vulkan/anv_measure.c +++ b/src/intel/vulkan/anv_measure.c @@ -153,7 +153,7 @@ anv_measure_start_snapshot(struct anv_cmd_buffer *cmd_buffer, (struct anv_address) { .bo = measure->bo, .offset = index * sizeof(uint64_t) }, - true /* end_of_pipe */); + ANV_TIMESTAMP_CAPTURE_AT_CS_STALL); if (event_name == NULL) event_name = intel_measure_snapshot_string(type); @@ -196,7 +196,7 @@ anv_measure_end_snapshot(struct anv_cmd_buffer *cmd_buffer, (struct anv_address) { .bo = measure->bo, .offset = index * sizeof(uint64_t) }, - true /* end_of_pipe */); + ANV_TIMESTAMP_CAPTURE_AT_CS_STALL); struct intel_measure_snapshot *snapshot = &(measure->base.snapshots[index]); memset(snapshot, 0, sizeof(*snapshot)); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index ed1b789fbda..dd9925f9c49 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -953,6 +953,12 @@ struct anv_memregion { uint64_t available; }; +enum anv_timestamp_capture_type { + ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE, + ANV_TIMESTAMP_CAPTURE_END_OF_PIPE, + ANV_TIMESTAMP_CAPTURE_AT_CS_STALL, +}; + struct anv_physical_device { struct vk_physical_device vk; @@ -1052,7 +1058,7 @@ struct anv_physical_device { int64_t master_minor; struct intel_query_engine_info * engine_info; - void (*cmd_emit_timestamp)(struct anv_batch *, struct anv_device *, struct anv_address, bool); + void (*cmd_emit_timestamp)(struct anv_batch *, struct anv_device *, struct anv_address, enum anv_timestamp_capture_type); struct intel_measure_device measure_device; }; diff --git a/src/intel/vulkan/anv_utrace.c b/src/intel/vulkan/anv_utrace.c index 81f46e542c3..35a744dcb8b 100644 --- a/src/intel/vulkan/anv_utrace.c +++ b/src/intel/vulkan/anv_utrace.c @@ -227,11 +227,14 @@ anv_utrace_record_ts(struct u_trace *ut, void *cs, struct anv_device *device = cmd_buffer->device; struct anv_bo *bo = timestamps; + enum anv_timestamp_capture_type capture_type = + (end_of_pipe) ? ANV_TIMESTAMP_CAPTURE_END_OF_PIPE + : ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE; device->physical->cmd_emit_timestamp(&cmd_buffer->batch, device, (struct anv_address) { .bo = bo, .offset = idx * sizeof(uint64_t) }, - end_of_pipe); + capture_type); } static uint64_t diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 17629fb7ac8..e35b28cbf38 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -7461,17 +7461,34 @@ VkResult genX(CmdSetPerformanceStreamMarkerINTEL)( void genX(cmd_emit_timestamp)(struct anv_batch *batch, struct anv_device *device, struct anv_address addr, - bool end_of_pipe) { - if (end_of_pipe) { + enum anv_timestamp_capture_type type) { + switch (type) { + case ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE: { + struct mi_builder b; + mi_builder_init(&b, device->info, batch); + mi_store(&b, mi_mem64(addr), mi_reg64(TIMESTAMP)); + break; + } + + case ANV_TIMESTAMP_CAPTURE_END_OF_PIPE: anv_batch_emit(batch, GENX(PIPE_CONTROL), pc) { pc.PostSyncOperation = WriteTimestamp; pc.Address = addr; anv_debug_dump_pc(pc); } - } else { - struct mi_builder b; - mi_builder_init(&b, device->info, batch); - mi_store(&b, mi_mem64(addr), mi_reg64(TIMESTAMP)); + break; + + case ANV_TIMESTAMP_CAPTURE_AT_CS_STALL: + anv_batch_emit(batch, GENX(PIPE_CONTROL), pc) { + pc.CommandStreamerStallEnable = true; + pc.PostSyncOperation = WriteTimestamp; + pc.Address = addr; + anv_debug_dump_pc(pc); + } + break; + + default: + unreachable("invalid"); } }