From 4cc66123ec70a451ebf0e31c6126fe07b7e187a2 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Mon, 24 Apr 2023 12:12:32 -0700 Subject: [PATCH] anv/ds: Forward VkDebugUtilsObjectNameInfoEXT to perfetto. This gets us names on zink/wsi command buffers in perfetto, but may also be useful some day for getting app names onto framebuffers and non-dynamic renderpasses. Part-of: --- src/intel/ds/intel_driver_ds.cc | 22 ++++++++++++++++++++++ src/intel/ds/intel_driver_ds.h | 19 +++++++++++++++++++ src/intel/vulkan/anv_batch_chain.c | 10 ++++++++++ src/intel/vulkan/anv_utrace.c | 14 ++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/src/intel/ds/intel_driver_ds.cc b/src/intel/ds/intel_driver_ds.cc index 44748b5e20e..c1bcd70d2d4 100644 --- a/src/intel/ds/intel_driver_ds.cc +++ b/src/intel/ds/intel_driver_ds.cc @@ -566,6 +566,28 @@ intel_ds_end_submit(struct intel_ds_queue *queue, }); } +void intel_ds_perfetto_set_debug_utils_object_name(struct intel_ds_device *device, + const VkDebugUtilsObjectNameInfoEXT *pNameInfo) +{ + IntelRenderpassDataSource::Trace([=](auto tctx) { + /* Do we need this for SEQ_INCREMENTAL_STATE_CLEARED for the object name to stick? */ + setup_incremental_state(tctx, device); + + tctx.GetDataSourceLocked()->SetDebugUtilsObjectNameEXT(tctx, pNameInfo); + }); +} + +void intel_ds_perfetto_refresh_debug_utils_object_name(struct intel_ds_device *device, + const struct vk_object_base *object) +{ + IntelRenderpassDataSource::Trace([=](auto tctx) { + /* Do we need this for SEQ_INCREMENTAL_STATE_CLEARED for the object name to stick? */ + setup_incremental_state(tctx, device); + + tctx.GetDataSourceLocked()->RefreshSetDebugUtilsObjectNameEXT(tctx, object); + }); +} + #endif /* HAVE_PERFETTO */ static void diff --git a/src/intel/ds/intel_driver_ds.h b/src/intel/ds/intel_driver_ds.h index 3ee2a6c5d9f..910d0d781b5 100644 --- a/src/intel/ds/intel_driver_ds.h +++ b/src/intel/ds/intel_driver_ds.h @@ -36,6 +36,9 @@ extern "C" { #endif +struct vk_object_base; +struct VkDebugUtilsObjectNameInfoEXT; + enum intel_ds_api { INTEL_DS_API_OPENGL, INTEL_DS_API_VULKAN, @@ -223,6 +226,12 @@ uint64_t intel_ds_begin_submit(struct intel_ds_queue *queue); void intel_ds_end_submit(struct intel_ds_queue *queue, uint64_t start_ts); +void intel_ds_perfetto_set_debug_utils_object_name(struct intel_ds_device *device, + const struct VkDebugUtilsObjectNameInfoEXT *pNameInfo); + +void intel_ds_perfetto_refresh_debug_utils_object_name(struct intel_ds_device *device, + const struct vk_object_base *object); + #else static inline uint64_t intel_ds_begin_submit(struct intel_ds_queue *queue) @@ -235,6 +244,16 @@ static inline void intel_ds_end_submit(struct intel_ds_queue *queue, { } +static inline void intel_ds_perfetto_set_debug_utils_object_name(struct intel_ds_device *device, + const struct VkDebugUtilsObjectNameInfoEXT *pNameInfo) +{ +} + +static inline void intel_ds_perfetto_refresh_debug_utils_object_name(struct intel_ds_device *device, + const struct vk_object_base *object) +{ +} + #endif /* HAVE_PERFETTO */ #ifdef __cplusplus diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 7cceba7e7ba..5902fd7964d 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1612,6 +1612,16 @@ anv_queue_submit(struct vk_queue *vk_queue, anv_queue_free_initial_submission(queue); + if (u_trace_should_process(&device->ds.trace_context)) { + /* Refresh perfetto's knowledge of any easily accessible, long-lived + * object names referenced by this submit -- this helps provide better + * information in traces when tracing starts after application launch. + */ + for (int i = 0; i < submit->command_buffer_count; i++) + intel_ds_perfetto_refresh_debug_utils_object_name(&device->ds, + &submit->command_buffers[i]->base); + } + if (queue->device->info->no_hw) { for (uint32_t i = 0; i < submit->signal_count; i++) { result = vk_sync_signal(&device->vk, diff --git a/src/intel/vulkan/anv_utrace.c b/src/intel/vulkan/anv_utrace.c index da4f9a870e3..30e38901546 100644 --- a/src/intel/vulkan/anv_utrace.c +++ b/src/intel/vulkan/anv_utrace.c @@ -588,6 +588,20 @@ void anv_CmdEndDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer) vk_common_CmdEndDebugUtilsLabelEXT(_commandBuffer); } +VKAPI_ATTR VkResult VKAPI_CALL +anv_SetDebugUtilsObjectNameEXT( + VkDevice _device, + const VkDebugUtilsObjectNameInfoEXT *pNameInfo) +{ + VK_FROM_HANDLE(anv_device, device, _device); + VkResult result = vk_common_SetDebugUtilsObjectNameEXT(_device, pNameInfo); + + if (result == VK_SUCCESS) + intel_ds_perfetto_set_debug_utils_object_name(&device->ds, pNameInfo); + + return result; +} + void anv_queue_trace(struct anv_queue *queue, const char *label, bool frame, bool begin) {