mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-23 15:06:32 +00:00
Don't try to enable debug exts for internal android vulkan instance
* We create an instance during early android startup to force our library to stay loaded, but we shouldn't try to enable any debug extensions because on some android devices that can cause problems.
This commit is contained in:
@@ -540,6 +540,10 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo
|
||||
// don't support any extensions for this createinfo
|
||||
RDCASSERT(pCreateInfo->pApplicationInfo == NULL || pCreateInfo->pApplicationInfo->pNext == NULL);
|
||||
|
||||
const bool internalInstance =
|
||||
(pCreateInfo->pApplicationInfo && pCreateInfo->pApplicationInfo->pApplicationName &&
|
||||
rdcstr(pCreateInfo->pApplicationInfo->pApplicationName) == "RenderDoc forced instance");
|
||||
|
||||
VkLayerInstanceCreateInfo *layerCreateInfo = (VkLayerInstanceCreateInfo *)pCreateInfo->pNext;
|
||||
|
||||
// step through the chain of pNext until we get to the link info
|
||||
@@ -615,69 +619,73 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo
|
||||
}
|
||||
}
|
||||
|
||||
const char **addedExts = new const char *[modifiedCreateInfo.enabledExtensionCount + 1];
|
||||
const char **addedExts = NULL;
|
||||
|
||||
bool hasDebugReport = false, hasDebugUtils = false;
|
||||
|
||||
for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++)
|
||||
if(!internalInstance)
|
||||
{
|
||||
addedExts[i] = modifiedCreateInfo.ppEnabledExtensionNames[i];
|
||||
if(!strcmp(addedExts[i], VK_EXT_DEBUG_REPORT_EXTENSION_NAME))
|
||||
hasDebugReport = true;
|
||||
if(!strcmp(addedExts[i], VK_EXT_DEBUG_UTILS_EXTENSION_NAME))
|
||||
hasDebugUtils = true;
|
||||
}
|
||||
addedExts = new const char *[modifiedCreateInfo.enabledExtensionCount + 1];
|
||||
|
||||
rdcarray<VkExtensionProperties> supportedExts;
|
||||
|
||||
// enumerate what instance extensions are available
|
||||
void *module = LoadVulkanLibrary();
|
||||
if(module)
|
||||
{
|
||||
PFN_vkEnumerateInstanceExtensionProperties enumInstExts =
|
||||
(PFN_vkEnumerateInstanceExtensionProperties)Process::GetFunctionAddress(
|
||||
module, "vkEnumerateInstanceExtensionProperties");
|
||||
|
||||
if(enumInstExts)
|
||||
bool hasDebugReport = false, hasDebugUtils = false;
|
||||
for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++)
|
||||
{
|
||||
uint32_t numSupportedExts = 0;
|
||||
enumInstExts(NULL, &numSupportedExts, NULL);
|
||||
|
||||
supportedExts.resize(numSupportedExts);
|
||||
enumInstExts(NULL, &numSupportedExts, &supportedExts[0]);
|
||||
addedExts[i] = modifiedCreateInfo.ppEnabledExtensionNames[i];
|
||||
if(!strcmp(addedExts[i], VK_EXT_DEBUG_REPORT_EXTENSION_NAME))
|
||||
hasDebugReport = true;
|
||||
if(!strcmp(addedExts[i], VK_EXT_DEBUG_UTILS_EXTENSION_NAME))
|
||||
hasDebugUtils = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(supportedExts.empty())
|
||||
RDCWARN(
|
||||
"Couldn't load vkEnumerateInstanceExtensionProperties in vkCreateInstance to enumerate "
|
||||
"instance extensions");
|
||||
rdcarray<VkExtensionProperties> supportedExts;
|
||||
|
||||
// always enable debug report/utils, if it's available
|
||||
if(!hasDebugUtils)
|
||||
{
|
||||
for(const VkExtensionProperties &ext : supportedExts)
|
||||
// enumerate what instance extensions are available
|
||||
void *module = LoadVulkanLibrary();
|
||||
if(module)
|
||||
{
|
||||
if(!strcmp(ext.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME))
|
||||
PFN_vkEnumerateInstanceExtensionProperties enumInstExts =
|
||||
(PFN_vkEnumerateInstanceExtensionProperties)Process::GetFunctionAddress(
|
||||
module, "vkEnumerateInstanceExtensionProperties");
|
||||
|
||||
if(enumInstExts)
|
||||
{
|
||||
addedExts[modifiedCreateInfo.enabledExtensionCount++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
|
||||
break;
|
||||
uint32_t numSupportedExts = 0;
|
||||
enumInstExts(NULL, &numSupportedExts, NULL);
|
||||
|
||||
supportedExts.resize(numSupportedExts);
|
||||
enumInstExts(NULL, &numSupportedExts, &supportedExts[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(!hasDebugReport)
|
||||
{
|
||||
for(const VkExtensionProperties &ext : supportedExts)
|
||||
|
||||
if(supportedExts.empty())
|
||||
RDCWARN(
|
||||
"Couldn't load vkEnumerateInstanceExtensionProperties in vkCreateInstance to enumerate "
|
||||
"instance extensions");
|
||||
|
||||
// always enable debug report/utils, if it's available
|
||||
if(!hasDebugUtils)
|
||||
{
|
||||
if(!strcmp(ext.extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME))
|
||||
for(const VkExtensionProperties &ext : supportedExts)
|
||||
{
|
||||
addedExts[modifiedCreateInfo.enabledExtensionCount++] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
|
||||
break;
|
||||
if(!strcmp(ext.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME))
|
||||
{
|
||||
addedExts[modifiedCreateInfo.enabledExtensionCount++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(!hasDebugReport)
|
||||
{
|
||||
for(const VkExtensionProperties &ext : supportedExts)
|
||||
{
|
||||
if(!strcmp(ext.extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME))
|
||||
{
|
||||
addedExts[modifiedCreateInfo.enabledExtensionCount++] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
modifiedCreateInfo.ppEnabledExtensionNames = addedExts;
|
||||
modifiedCreateInfo.ppEnabledExtensionNames = addedExts;
|
||||
}
|
||||
|
||||
bool brokenGetDeviceProcAddr = false;
|
||||
|
||||
@@ -779,13 +787,12 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo
|
||||
CheckInstanceExts();
|
||||
}
|
||||
|
||||
delete[] addedExts;
|
||||
SAFE_DELETE_ARRAY(addedExts);
|
||||
|
||||
InitInstanceExtensionTables(m_Instance, record->instDevInfo);
|
||||
|
||||
// don't register a frame capturer for our internal instance on android
|
||||
if(pCreateInfo->pApplicationInfo && pCreateInfo->pApplicationInfo->pApplicationName &&
|
||||
rdcstr(pCreateInfo->pApplicationInfo->pApplicationName) == "RenderDoc forced instance")
|
||||
if(internalInstance)
|
||||
{
|
||||
RDCDEBUG("Not registering internal instance as frame capturer");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user