mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-08 23:05:46 +00:00
Return explicit error on creating multiple logical devices. Closes #2727
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user