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 <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9099>
This commit is contained in:
Samuel Pitoiset 2021-02-17 13:57:09 +01:00
parent 7c63be7ffc
commit 7a377708fd
2 changed files with 102 additions and 28 deletions

View file

@ -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

View file

@ -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)