From b3d7d5f5fd3edceefc4ec9a7d3ce261ed3197601 Mon Sep 17 00:00:00 2001 From: Shahbaz Youssefi Date: Wed, 21 Sep 2022 15:01:10 -0400 Subject: [PATCH] Correctly mark promoted extensions as supported `WrappedVulkan::vkCreateInstance` sets instance extension support based on whether: - Extension is enabled - Instance version >= core version in which ext is promoted - etc However, the code that looped through the extensions was inside a loop over the enabled extensions. If there are no enabled extensions, this led to extensions promoted to core never being inspected. The code is split such that enabled extensions are checked within a loop, and promoted extensions are separately checked. --- .../vulkan/wrappers/vk_device_funcs.cpp | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 8be6d5807..20d923b7b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -785,13 +785,18 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo // * it's a device extension and available on at least one physical device #undef CheckExt #define CheckExt(name, ver) \ - if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], "VK_" #name) || \ - record->instDevInfo->vulkanVersion >= ver || \ + if(record->instDevInfo->vulkanVersion >= ver || \ availablePhysDeviceFunctions.find("VK_" #name) != availablePhysDeviceFunctions.end()) \ { \ record->instDevInfo->ext_##name = true; \ } - + CheckInstanceExts(); +#undef CheckExt +#define CheckExt(name, ver) \ + if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], "VK_" #name)) \ + { \ + record->instDevInfo->ext_##name = true; \ + } for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++) { CheckInstanceExts(); @@ -3468,12 +3473,19 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi uint32_t effectiveApiVersion = RDCMIN(m_EnabledExtensions.vulkanVersion, physProps.apiVersion); #undef CheckExt -#define CheckExt(name, ver) \ - if(!strcmp(createInfo.ppEnabledExtensionNames[i], "VK_" #name) || effectiveApiVersion >= ver) \ - { \ - m_EnabledExtensions.ext_##name = true; \ +#define CheckExt(name, ver) \ + if(effectiveApiVersion >= ver) \ + { \ + m_EnabledExtensions.ext_##name = true; \ } + CheckDeviceExts(); +#undef CheckExt +#define CheckExt(name, ver) \ + if(!strcmp(createInfo.ppEnabledExtensionNames[i], "VK_" #name)) \ + { \ + m_EnabledExtensions.ext_##name = true; \ + } for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++) { CheckDeviceExts();