diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index a2ebf7c1054..70f297c51ba 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3018,6 +3018,31 @@ zink_context_is_resource_busy(struct pipe_screen *pscreen, struct pipe_resource return true; } +static void +zink_emit_string_marker(struct pipe_context *pctx, + const char *string, int len) +{ + struct zink_screen *screen = zink_screen(pctx->screen); + struct zink_batch *batch = &zink_context(pctx)->batch; + + /* make sure string is nul-terminated */ + char buf[512], *temp = NULL; + if (len < ARRAY_SIZE(buf)) { + memcpy(buf, string, len); + buf[len] = '\0'; + string = buf; + } else + string = temp = strndup(string, len); + + VkDebugUtilsLabelEXT label = { + VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, NULL, + string, + { 0 } + }; + screen->vk_CmdInsertDebugUtilsLabelEXT(batch->state->cmdbuf, &label); + free(temp); +} + struct pipe_context * zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) { @@ -3086,6 +3111,9 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.set_stream_output_targets = zink_set_stream_output_targets; ctx->base.flush_resource = zink_flush_resource; + + ctx->base.emit_string_marker = zink_emit_string_marker; + zink_context_surface_init(&ctx->base); zink_context_resource_init(&ctx->base); zink_context_query_init(&ctx->base); diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index ab1c4e590b0..385a9551f89 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -552,6 +552,9 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_POST_DEPTH_COVERAGE: return screen->info.have_EXT_post_depth_coverage; + case PIPE_CAP_STRING_MARKER: + return screen->instance_info.have_EXT_debug_utils; + default: return u_pipe_screen_get_param_defaults(pscreen, param); } @@ -1308,6 +1311,7 @@ create_debug(struct zink_screen *screen) { GET_PROC_ADDR_INSTANCE(CreateDebugUtilsMessengerEXT); GET_PROC_ADDR_INSTANCE(DestroyDebugUtilsMessengerEXT); + GET_PROC_ADDR_INSTANCE(CmdInsertDebugUtilsLabelEXT); VkDebugUtilsMessengerCreateInfoEXT vkDebugUtilsMessengerCreateInfoEXT = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index 52b65a2d3b7..802fc9a94e2 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -171,6 +171,7 @@ struct zink_screen { PFN_vkCreateDebugUtilsMessengerEXT vk_CreateDebugUtilsMessengerEXT; PFN_vkDestroyDebugUtilsMessengerEXT vk_DestroyDebugUtilsMessengerEXT; + PFN_vkCmdInsertDebugUtilsLabelEXT vk_CmdInsertDebugUtilsLabelEXT; #if defined(MVK_VERSION) PFN_vkGetMoltenVKConfigurationMVK vk_GetMoltenVKConfigurationMVK;