Return explicit error on creating multiple logical devices. Closes #2727

This commit is contained in:
baldurk
2022-10-03 20:10:41 +01:00
parent 5aafda7202
commit bbc5bd74b9
3 changed files with 86 additions and 21 deletions
+22
View File
@@ -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<WriteSerialiser *> m_ThreadSerialisers;
Threading::CriticalSection m_CallbacksLock;
rdcarray<UserDebugReportCallbackData *> m_ReportCallbacks;
rdcarray<UserDebugUtilsCallbackData *> m_UtilsCallbacks;
void SendUserDebugMessage(const rdcstr &msg);
uint64_t tempMemoryTLSSlot;
struct TempMem
{
@@ -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 rdcarray<VkQueueFamilyPrope
return true;
}
void WrappedVulkan::SendUserDebugMessage(const rdcstr &msg)
{
VkDebugUtilsMessengerCallbackDataEXT messengerData = {};
messengerData.messageIdNumber = 1;
messengerData.pMessageIdName = NULL;
messengerData.pMessage = msg.c_str();
messengerData.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT;
{
SCOPED_LOCK(m_CallbacksLock);
for(UserDebugReportCallbackData *cb : m_ReportCallbacks)
{
cb->createInfo.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 <typename SerialiserType>
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<const char *> Extensions(createInfo.ppEnabledExtensionNames,
createInfo.enabledExtensionCount);
@@ -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;
}