diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 2229c595c..1e9b4c7a2 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -257,6 +257,23 @@ struct VulkanActionCallback VkCommandBuffer cmd) = 0; }; +struct UserDebugReportCallbackData +{ + VkInstance wrappedInstance; + VkDebugReportCallbackCreateInfoEXT createInfo; + bool muteWarned; + + VkDebugReportCallbackEXT realObject; +}; + +struct UserDebugUtilsCallbackData +{ + VkDebugUtilsMessengerCreateInfoEXT createInfo; + bool muteWarned; + + VkDebugUtilsMessengerEXT realObject; +}; + class WrappedVulkan : public IFrameCapturer { private: @@ -313,6 +330,11 @@ private: Threading::CriticalSection m_ThreadSerialisersLock; rdcarray m_ThreadSerialisers; + Threading::CriticalSection m_CallbacksLock; + rdcarray m_ReportCallbacks; + rdcarray m_UtilsCallbacks; + void SendUserDebugMessage(const rdcstr &msg); + uint64_t tempMemoryTLSSlot; struct TempMem { diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 20d923b7b..320ab78ab 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -593,13 +593,14 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo VkDebugReportCallbackCreateInfoEXT *report = (VkDebugReportCallbackCreateInfoEXT *)pCreateInfo->pNext; + rdcstr msg = StringFormat::Fmt("RenderDoc does not support requested instance extension: %s.", + modifiedCreateInfo.ppEnabledExtensionNames[i]); + 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", - "RenderDoc does not support a requested instance extension.", - report->pUserData); + 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; } @@ -612,7 +613,7 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo messengerData.messageIdNumber = 1; messengerData.pMessageIdName = NULL; - messengerData.pMessage = "RenderDoc does not support a requested instance extension."; + messengerData.pMessage = msg.c_str(); messengerData.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT; while(messenger) @@ -1583,6 +1584,34 @@ bool WrappedVulkan::SelectGraphicsComputeQueue(const rdcarraycreateInfo.pfnCallback(VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, 1, 1, "RDOC", + msg.c_str(), cb->createInfo.pUserData); + } + + for(UserDebugUtilsCallbackData *cb : m_UtilsCallbacks) + { + cb->createInfo.pfnUserCallback(VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, + VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, &messengerData, + cb->createInfo.pUserData); + } + } +} + template bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, @@ -3678,10 +3707,20 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, "For KHR/EXT extensions file an issue on github to request support: " "https://github.com/baldurk/renderdoc"); + SendUserDebugMessage( + StringFormat::Fmt("RenderDoc does not support requested device extension: %s.", + createInfo.ppEnabledExtensionNames[i])); + return VK_ERROR_EXTENSION_NOT_PRESENT; } } + if(m_Device != VK_NULL_HANDLE) + { + SendUserDebugMessage("RenderDoc does not support multiple simultaneous logical devices."); + return VK_ERROR_INITIALIZATION_FAILED; + } + rdcarray Extensions(createInfo.ppEnabledExtensionNames, createInfo.enabledExtensionCount); diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 5d1bbbc17..027dde661 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -1757,15 +1757,6 @@ VkResult WrappedVulkan::vkCreateSamplerYcbcrConversion( return ret; } -struct UserDebugReportCallbackData -{ - VkInstance wrappedInstance; - VkDebugReportCallbackCreateInfoEXT createInfo; - bool muteWarned; - - VkDebugReportCallbackEXT realObject; -}; - VkBool32 VKAPI_PTR UserDebugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, @@ -1808,13 +1799,6 @@ VkBool32 VKAPI_PTR UserDebugReportCallback(VkDebugReportFlagsEXT flags, return user->createInfo.pfnCallback(flags, objectType, object, location, messageCode, pLayerPrefix, pMessage, user->createInfo.pUserData); } -struct UserDebugUtilsCallbackData -{ - VkDebugUtilsMessengerCreateInfoEXT createInfo; - bool muteWarned; - - VkDebugUtilsMessengerEXT realObject; -}; VkBool32 VKAPI_PTR UserDebugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, @@ -1891,6 +1875,11 @@ VkResult WrappedVulkan::vkCreateDebugReportCallbackEXT( return vkr; } + { + SCOPED_LOCK(m_CallbacksLock); + m_ReportCallbacks.push_back(user); + } + *pCallback = (VkDebugReportCallbackEXT)(uint64_t)user; return vkr; @@ -1908,6 +1897,11 @@ void WrappedVulkan::vkDestroyDebugReportCallbackEXT(VkInstance instance, ObjDisp(instance)->DestroyDebugReportCallbackEXT(Unwrap(instance), user->realObject, pAllocator); + { + SCOPED_LOCK(m_CallbacksLock); + m_ReportCallbacks.removeOne(user); + } + delete user; } @@ -2314,6 +2308,11 @@ VkResult WrappedVulkan::vkCreateDebugUtilsMessengerEXT( return vkr; } + { + SCOPED_LOCK(m_CallbacksLock); + m_UtilsCallbacks.push_back(user); + } + *pMessenger = (VkDebugUtilsMessengerEXT)(uint64_t)user; return vkr; @@ -2331,6 +2330,11 @@ void WrappedVulkan::vkDestroyDebugUtilsMessengerEXT(VkInstance instance, ObjDisp(instance)->DestroyDebugUtilsMessengerEXT(Unwrap(instance), user->realObject, pAllocator); + { + SCOPED_LOCK(m_CallbacksLock); + m_UtilsCallbacks.removeOne(user); + } + delete user; }