From b71084d9463c93dabe90605da7b7f6a97fa30253 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 5 Dec 2023 11:21:17 +0000 Subject: [PATCH] Fail with error msg if RenderDoc layer is explicitly loaded in instance * This is not supported and users who are confused about how RenderDoc works or how layers function may try to enable it and get into problems with themselves. --- .../vulkan/wrappers/vk_device_funcs.cpp | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 712bf0635..b15f4c50d 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -590,6 +590,54 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo VkInstanceCreateInfo modifiedCreateInfo; modifiedCreateInfo = *pCreateInfo; + for(uint32_t i = 0; i < modifiedCreateInfo.enabledLayerCount; i++) + { + if(rdcstr(modifiedCreateInfo.ppEnabledLayerNames[i]) == RENDERDOC_VULKAN_LAYER_NAME) + { + // see if any debug report callbacks were passed in the pNext chain + VkDebugReportCallbackCreateInfoEXT *report = + (VkDebugReportCallbackCreateInfoEXT *)pCreateInfo->pNext; + + rdcstr msg = + "RenderDoc's layer should NEVER be activated manually. Do not include it in " + "vkCreateInstance's instance layers."; + + RDCERR("%s", msg.c_str()); + + while(report) + { + if(report->sType == VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT) + report->pfnCallback(VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, + 0, 1, 1, "RDOC", msg.c_str(), report->pUserData); + + report = (VkDebugReportCallbackCreateInfoEXT *)report->pNext; + } + + // or debug utils callbacks + VkDebugUtilsMessengerCreateInfoEXT *messenger = + (VkDebugUtilsMessengerCreateInfoEXT *)pCreateInfo->pNext; + + VkDebugUtilsMessengerCallbackDataEXT messengerData = {}; + + messengerData.messageIdNumber = 1; + messengerData.pMessageIdName = NULL; + messengerData.pMessage = msg.c_str(); + messengerData.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT; + + while(messenger) + { + if(messenger->sType == VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) + messenger->pfnUserCallback(VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, &messengerData, + messenger->pUserData); + + messenger = (VkDebugUtilsMessengerCreateInfoEXT *)messenger->pNext; + } + + return VK_ERROR_INITIALIZATION_FAILED; + } + } + for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++) { if(!IsSupportedExtension(modifiedCreateInfo.ppEnabledExtensionNames[i]))