From 7a377708fdef5d63c03049c9f2aa35b63952f054 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 17 Feb 2021 13:57:09 +0100 Subject: [PATCH] radv: add support for user event markers with SQTT This enables VK_EXT_debug_marker only if SQTT is enabled, otherwise it's just useless. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/layers/radv_sqtt_layer.c | 73 +++++++++++++++++++++++++++++++++ src/amd/vulkan/radv_device.c | 57 ++++++++++++------------- 2 files changed, 102 insertions(+), 28 deletions(-) diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c index a005eca..81214e9 100644 --- a/src/amd/vulkan/layers/radv_sqtt_layer.c +++ b/src/amd/vulkan/layers/radv_sqtt_layer.c @@ -105,6 +105,37 @@ radv_write_event_with_dims_marker(struct radv_cmd_buffer *cmd_buffer, radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); } +static void +radv_write_user_event_marker(struct radv_cmd_buffer *cmd_buffer, + enum rgp_sqtt_marker_user_event_type type, + const char *str) +{ + struct radeon_cmdbuf *cs = cmd_buffer->cs; + + if (type == UserEventPop) { + assert (str == NULL); + struct rgp_sqtt_marker_user_event marker = { 0 }; + marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT; + marker.data_type = type; + + radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + } else { + assert (str != NULL); + unsigned len = strlen(str); + struct rgp_sqtt_marker_user_event_with_length marker = { 0 }; + marker.user_event.identifier = RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT; + marker.user_event.data_type = type; + marker.length = align(len, 4); + + uint8_t *buffer = alloca(sizeof(marker) + marker.length); + memset(buffer, 0, sizeof(marker) + marker.length); + memcpy(buffer, &marker, sizeof(marker)); + memcpy(buffer + sizeof(marker), str, len); + + radv_emit_thread_trace_userdata(cmd_buffer->device, cs, buffer, sizeof(marker) / 4 + marker.length / 4); + } +} + void radv_describe_begin_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) { @@ -864,4 +895,46 @@ void sqtt_CmdSetStencilReference( API_MARKER(SetStencilReference, commandBuffer, faceMask, reference); } +/* VK_EXT_debug_marker */ +void sqtt_CmdDebugMarkerBeginEXT( + VkCommandBuffer commandBuffer, + const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + radv_write_user_event_marker(cmd_buffer, UserEventPush, + pMarkerInfo->pMarkerName); +} + +void sqtt_CmdDebugMarkerEndEXT( + VkCommandBuffer commandBuffer) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + radv_write_user_event_marker(cmd_buffer, UserEventPop, NULL); +} + +void sqtt_CmdDebugMarkerInsertEXT( + VkCommandBuffer commandBuffer, + const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + radv_write_user_event_marker(cmd_buffer, UserEventTrigger, + pMarkerInfo->pMarkerName); +} + +VkResult sqtt_DebugMarkerSetObjectNameEXT( + VkDevice device, + const VkDebugMarkerObjectNameInfoEXT* pNameInfo) +{ + /* no-op */ + return VK_SUCCESS; +} + +VkResult sqtt_DebugMarkerSetObjectTagEXT( + VkDevice device, + const VkDebugMarkerObjectTagInfoEXT* pTagInfo) +{ + /* no-op */ + return VK_SUCCESS; +} + #undef API_MARKER diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 3187387..bb16a7c 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -288,6 +288,34 @@ radv_get_compiler_string(struct radv_physical_device *pdevice) return "LLVM " MESA_LLVM_VERSION_STRING; } +int +radv_get_int_debug_option(const char *name, int default_value) +{ + const char *str; + int result; + + str = getenv(name); + if (!str) { + result = default_value; + } else { + char *endptr; + + result = strtol(str, &endptr, 0); + if (str == endptr) { + /* No digits founs. */ + result = default_value; + } + } + + return result; +} + +static bool radv_thread_trace_enabled() +{ + return radv_get_int_debug_option("RADV_THREAD_TRACE", -1) >= 0 || + getenv("RADV_THREAD_TRACE_TRIGGER"); +} + #if defined(VK_USE_PLATFORM_WAYLAND_KHR) || \ defined(VK_USE_PLATFORM_XCB_KHR) || \ defined(VK_USE_PLATFORM_XLIB_KHR) || \ @@ -407,6 +435,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device .EXT_conditional_rendering = true, .EXT_conservative_rasterization = device->rad_info.chip_class >= GFX9, .EXT_custom_border_color = true, + .EXT_debug_marker = radv_thread_trace_enabled(), .EXT_depth_clip_enable = true, .EXT_depth_range_unrestricted = true, .EXT_descriptor_indexing = true, @@ -2636,34 +2665,6 @@ radv_device_init_gs_info(struct radv_device *device) device->physical_device->rad_info.family); } -int -radv_get_int_debug_option(const char *name, int default_value) -{ - const char *str; - int result; - - str = getenv(name); - if (!str) { - result = default_value; - } else { - char *endptr; - - result = strtol(str, &endptr, 0); - if (str == endptr) { - /* No digits founs. */ - result = default_value; - } - } - - return result; -} - -static bool radv_thread_trace_enabled() -{ - return radv_get_int_debug_option("RADV_THREAD_TRACE", -1) >= 0 || - getenv("RADV_THREAD_TRACE_TRIGGER"); -} - static VkResult check_physical_device_features(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceFeatures *features) -- 2.7.4