From 341478a3dabcf597cfad52cfa5eebcddeca8fd3f Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 24 Aug 2021 15:43:58 +0100 Subject: [PATCH] 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. --- .../vulkan/wrappers/vk_device_funcs.cpp | 107 ++++++++++-------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index fe15cdac3..30d7dd433 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -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 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 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"); }