From 8b2d943556c3a997e1b44068bbd507b12f831ee4 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 23 Apr 2018 18:36:15 +0100 Subject: [PATCH] Handle extension promotion to core when detecting enabled extensions --- renderdoc/driver/vulkan/vk_dispatchtables.h | 6 +- renderdoc/driver/vulkan/vk_hookset_defs.h | 72 ++++++++++--------- .../vulkan/wrappers/vk_device_funcs.cpp | 51 ++++++++----- 3 files changed, 77 insertions(+), 52 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_dispatchtables.h b/renderdoc/driver/vulkan/vk_dispatchtables.h index 31d72ce3f..9b8892cdc 100644 --- a/renderdoc/driver/vulkan/vk_dispatchtables.h +++ b/renderdoc/driver/vulkan/vk_dispatchtables.h @@ -39,7 +39,7 @@ void InitReplayTables(void *vulkanModule); struct InstanceDeviceInfo { #undef CheckExt -#define CheckExt(name) ext_##name = false; +#define CheckExt(name, ver) ext_##name = false; InstanceDeviceInfo() { CheckDeviceExts(); @@ -47,7 +47,9 @@ struct InstanceDeviceInfo } #undef CheckExt -#define CheckExt(name) bool ext_##name; +#define CheckExt(name, ver) bool ext_##name; + + int vulkanVersion = VK_API_VERSION_1_0; CheckDeviceExts(); CheckInstanceExts(); diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index d348c8f0d..f05e4e51a 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -26,6 +26,12 @@ #include "official/vk_layer.h" +// extensions made core in 1.1 +#define VK11 VK_MAKE_VERSION(1, 1, 0) + +// extensions that are not core in any version +#define VKXX VK_MAKE_VERSION(999, 999, 0) + #if defined(VK_USE_PLATFORM_WIN32_KHR) #define HookInitInstance_PlatformSpecific() \ @@ -268,40 +274,40 @@ // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines -#define CheckInstanceExts() \ - CheckExt(VK_KHR_xlib_surface); \ - CheckExt(VK_KHR_xcb_surface); \ - CheckExt(VK_KHR_win32_surface); \ - CheckExt(VK_KHR_android_surface); \ - CheckExt(VK_KHR_surface); \ - CheckExt(VK_EXT_debug_report); \ - CheckExt(VK_KHR_display); \ - CheckExt(VK_NV_external_memory_capabilities); \ - CheckExt(VK_KHR_get_physical_device_properties2); \ - CheckExt(VK_EXT_display_surface_counter); \ - CheckExt(VK_EXT_direct_mode_display); \ - CheckExt(VK_EXT_acquire_xlib_display); \ - CheckExt(VK_KHR_external_memory_capabilities); \ - CheckExt(VK_KHR_external_semaphore_capabilities); +#define CheckInstanceExts() \ + CheckExt(VK_KHR_xlib_surface, VKXX); \ + CheckExt(VK_KHR_xcb_surface, VKXX); \ + CheckExt(VK_KHR_win32_surface, VKXX); \ + CheckExt(VK_KHR_android_surface, VKXX); \ + CheckExt(VK_KHR_surface, VKXX); \ + CheckExt(VK_EXT_debug_report, VKXX); \ + CheckExt(VK_KHR_display, VKXX); \ + CheckExt(VK_NV_external_memory_capabilities, VKXX); \ + CheckExt(VK_KHR_get_physical_device_properties2, VK11); \ + CheckExt(VK_EXT_display_surface_counter, VKXX); \ + CheckExt(VK_EXT_direct_mode_display, VKXX); \ + CheckExt(VK_EXT_acquire_xlib_display, VKXX); \ + CheckExt(VK_KHR_external_memory_capabilities, VK11); \ + CheckExt(VK_KHR_external_semaphore_capabilities, VK11); -#define CheckDeviceExts() \ - CheckExt(VK_EXT_debug_marker); \ - CheckExt(VK_KHR_swapchain); \ - CheckExt(VK_KHR_display_swapchain); \ - CheckExt(VK_NV_external_memory); \ - CheckExt(VK_NV_external_memory_win32); \ - CheckExt(VK_NV_win32_keyed_mutex); \ - CheckExt(VK_KHR_maintenance1); \ - CheckExt(VK_EXT_display_control); \ - CheckExt(VK_KHR_external_memory); \ - CheckExt(VK_KHR_external_memory_win32); \ - CheckExt(VK_KHR_external_memory_fd); \ - CheckExt(VK_KHR_external_semaphore); \ - CheckExt(VK_KHR_external_semaphore_win32); \ - CheckExt(VK_KHR_external_semaphore_fd); \ - CheckExt(VK_KHR_get_memory_requirements2); \ - CheckExt(VK_AMD_shader_info); \ - CheckExt(VK_KHR_push_descriptor); +#define CheckDeviceExts() \ + CheckExt(VK_EXT_debug_marker, VKXX); \ + CheckExt(VK_KHR_swapchain, VKXX); \ + CheckExt(VK_KHR_display_swapchain, VKXX); \ + CheckExt(VK_NV_external_memory, VKXX); \ + CheckExt(VK_NV_external_memory_win32, VKXX); \ + CheckExt(VK_NV_win32_keyed_mutex, VKXX); \ + CheckExt(VK_KHR_maintenance1, VK11); \ + CheckExt(VK_EXT_display_control, VKXX); \ + CheckExt(VK_KHR_external_memory, VK11); \ + CheckExt(VK_KHR_external_memory_win32, VKXX); \ + CheckExt(VK_KHR_external_memory_fd, VKXX); \ + CheckExt(VK_KHR_external_semaphore, VK11); \ + CheckExt(VK_KHR_external_semaphore_win32, VKXX); \ + CheckExt(VK_KHR_external_semaphore_fd, VKXX); \ + CheckExt(VK_KHR_get_memory_requirements2, VK11); \ + CheckExt(VK_AMD_shader_info, VKXX); \ + CheckExt(VK_KHR_push_descriptor, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(VK_KHR_surface, DestroySurfaceKHR); \ diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index f20947dd9..b83fabab7 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -234,6 +234,9 @@ ReplayStatus WrappedVulkan::Initialise(VkInitParams ¶ms, uint64_t sectionVer extscstr, }; + if(params.APIVersion >= VK_API_VERSION_1_0) + renderdocAppInfo.apiVersion = params.APIVersion; + m_Instance = VK_NULL_HANDLE; VkResult ret = GetInstanceDispatchTable(NULL)->CreateInstance(&instinfo, NULL, &m_Instance); @@ -241,10 +244,10 @@ ReplayStatus WrappedVulkan::Initialise(VkInitParams ¶ms, uint64_t sectionVer InstanceDeviceInfo extInfo; #undef CheckExt -#define CheckExt(name) \ - if(!strcmp(instinfo.ppEnabledExtensionNames[i], #name)) \ - { \ - extInfo.ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(instinfo.ppEnabledExtensionNames[i], #name) || (int)renderdocAppInfo.apiVersion >= ver) \ + { \ + extInfo.ext_##name = true; \ } for(uint32_t i = 0; i < instinfo.enabledExtensionCount; i++) @@ -409,9 +412,15 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo modifiedCreateInfo.ppEnabledExtensionNames = addedExts; + // override applicationInfo with RenderDoc's, but preserve apiVersion if(modifiedCreateInfo.pApplicationInfo) + { modifiedCreateInfo.pApplicationInfo = &renderdocAppInfo; + if(modifiedCreateInfo.pApplicationInfo->apiVersion >= VK_API_VERSION_1_0) + renderdocAppInfo.apiVersion = modifiedCreateInfo.pApplicationInfo->apiVersion; + } + VkResult ret = createFunc(&modifiedCreateInfo, pAllocator, pInstance); m_Instance = *pInstance; @@ -430,11 +439,17 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo record->instDevInfo = new InstanceDeviceInfo(); + record->instDevInfo->vulkanVersion = VK_API_VERSION_1_0; + + if(renderdocAppInfo.apiVersion > VK_API_VERSION_1_0) + record->instDevInfo->vulkanVersion = renderdocAppInfo.apiVersion; + #undef CheckExt -#define CheckExt(name) \ - if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], #name)) \ - { \ - record->instDevInfo->ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], #name) || \ + record->instDevInfo->vulkanVersion >= ver) \ + { \ + record->instDevInfo->ext_##name = true; \ } for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++) @@ -1207,10 +1222,11 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi InstanceDeviceInfo extInfo; #undef CheckExt -#define CheckExt(name) \ - if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name)) \ - { \ - extInfo.ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name) || \ + (int)renderdocAppInfo.apiVersion >= ver) \ + { \ + extInfo.ext_##name = true; \ } for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++) @@ -1507,7 +1523,7 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, record->instDevInfo = new InstanceDeviceInfo(); #undef CheckExt -#define CheckExt(name) \ +#define CheckExt(name, ver) \ record->instDevInfo->ext_##name = GetRecord(m_Instance)->instDevInfo->ext_##name; // inherit extension enablement from instance, that way GetDeviceProcAddress can check @@ -1515,10 +1531,11 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, CheckInstanceExts(); #undef CheckExt -#define CheckExt(name) \ - if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name)) \ - { \ - record->instDevInfo->ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name) || \ + GetRecord(m_Instance)->instDevInfo->vulkanVersion >= ver) \ + { \ + record->instDevInfo->ext_##name = true; \ } for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++)