From ad887b1922eb33f20e8af67e6b3d3680d0fcf5b8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 24 Apr 2018 14:40:08 +0100 Subject: [PATCH] Allow for complex extension dependencies (i.e. two exts needed for func) * This is fairly common with extension overlaps/interactions. Instead of having just one extension condition for a function, allow &&. --- renderdoc/driver/vulkan/vk_dispatchtables.cpp | 25 ++- renderdoc/driver/vulkan/vk_hookset_defs.h | 185 +++++++++--------- renderdoc/driver/vulkan/vk_layer.cpp | 16 +- .../vulkan/wrappers/vk_device_funcs.cpp | 39 ++-- 4 files changed, 142 insertions(+), 123 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_dispatchtables.cpp b/renderdoc/driver/vulkan/vk_dispatchtables.cpp index d1ad9270c..83cdeb9b9 100644 --- a/renderdoc/driver/vulkan/vk_dispatchtables.cpp +++ b/renderdoc/driver/vulkan/vk_dispatchtables.cpp @@ -74,13 +74,20 @@ void InitInstanceExtensionTables(VkInstance instance, InstanceDeviceInfo *info) instance = Unwrap(instance); +#undef CheckExt +#define CheckExt(name, ver) \ + bool name = info->ext_##name; \ + (void)name; + #undef HookInitExtension -#define HookInitExtension(ext, func) \ - if(info->ext_##ext) \ - { \ - InstanceGPA(func); \ +#define HookInitExtension(cond, func) \ + if(cond) \ + { \ + InstanceGPA(func); \ } + CheckInstanceExts(); + InstanceGPA(EnumerateDeviceExtensionProperties); InstanceGPA(EnumerateDeviceLayerProperties); @@ -100,12 +107,14 @@ void InitDeviceExtensionTables(VkDevice device, InstanceDeviceInfo *info) device = Unwrap(device); #undef HookInitExtension -#define HookInitExtension(ext, func) \ - if(info->ext_##ext) \ - { \ - DeviceGPA(func); \ +#define HookInitExtension(cond, func) \ + if(cond) \ + { \ + DeviceGPA(func); \ } + CheckDeviceExts(); + HookInitVulkanDeviceExts(); } diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index f05e4e51a..dc5047f86 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -274,103 +274,102 @@ // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines -#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 CheckInstanceExts() \ + CheckExt(KHR_xlib_surface, VKXX); \ + CheckExt(KHR_xcb_surface, VKXX); \ + CheckExt(KHR_win32_surface, VKXX); \ + CheckExt(KHR_android_surface, VKXX); \ + CheckExt(KHR_surface, VKXX); \ + CheckExt(EXT_debug_report, VKXX); \ + CheckExt(KHR_display, VKXX); \ + CheckExt(NV_external_memory_capabilities, VKXX); \ + CheckExt(KHR_get_physical_device_properties2, VK11); \ + CheckExt(EXT_display_surface_counter, VKXX); \ + CheckExt(EXT_direct_mode_display, VKXX); \ + CheckExt(EXT_acquire_xlib_display, VKXX); \ + CheckExt(KHR_external_memory_capabilities, VK11); \ + CheckExt(KHR_external_semaphore_capabilities, VK11); -#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 CheckDeviceExts() \ + CheckExt(EXT_debug_marker, VKXX); \ + CheckExt(KHR_swapchain, VKXX); \ + CheckExt(KHR_display_swapchain, VKXX); \ + CheckExt(NV_external_memory, VKXX); \ + CheckExt(NV_external_memory_win32, VKXX); \ + CheckExt(NV_win32_keyed_mutex, VKXX); \ + CheckExt(KHR_maintenance1, VK11); \ + CheckExt(EXT_display_control, VKXX); \ + CheckExt(KHR_external_memory, VK11); \ + CheckExt(KHR_external_memory_win32, VKXX); \ + CheckExt(KHR_external_memory_fd, VKXX); \ + CheckExt(KHR_external_semaphore, VK11); \ + CheckExt(KHR_external_semaphore_win32, VKXX); \ + CheckExt(KHR_external_semaphore_fd, VKXX); \ + CheckExt(KHR_get_memory_requirements2, VK11); \ + CheckExt(AMD_shader_info, VKXX); \ + CheckExt(KHR_push_descriptor, VKXX); -#define HookInitVulkanInstanceExts() \ - HookInitExtension(VK_KHR_surface, DestroySurfaceKHR); \ - HookInitExtension(VK_KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ - HookInitExtension(VK_KHR_surface, GetPhysicalDeviceSurfaceCapabilitiesKHR); \ - HookInitExtension(VK_KHR_surface, GetPhysicalDeviceSurfaceFormatsKHR); \ - HookInitExtension(VK_KHR_surface, GetPhysicalDeviceSurfacePresentModesKHR); \ - HookInitExtension(VK_EXT_debug_report, CreateDebugReportCallbackEXT); \ - HookInitExtension(VK_EXT_debug_report, DestroyDebugReportCallbackEXT); \ - HookInitExtension(VK_EXT_debug_report, DebugReportMessageEXT); \ - HookInitExtension(VK_KHR_display, GetPhysicalDeviceDisplayPropertiesKHR); \ - HookInitExtension(VK_KHR_display, GetPhysicalDeviceDisplayPlanePropertiesKHR); \ - HookInitExtension(VK_KHR_display, GetDisplayPlaneSupportedDisplaysKHR); \ - HookInitExtension(VK_KHR_display, GetDisplayModePropertiesKHR); \ - HookInitExtension(VK_KHR_display, CreateDisplayModeKHR); \ - HookInitExtension(VK_KHR_display, GetDisplayPlaneCapabilitiesKHR); \ - HookInitExtension(VK_KHR_display, CreateDisplayPlaneSurfaceKHR); \ - HookInitExtension(VK_NV_external_memory_capabilities, \ - GetPhysicalDeviceExternalImageFormatPropertiesNV); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, GetPhysicalDeviceFeatures2KHR); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, GetPhysicalDeviceProperties2KHR); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, GetPhysicalDeviceFormatProperties2KHR); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, \ - GetPhysicalDeviceImageFormatProperties2KHR); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, \ - GetPhysicalDeviceQueueFamilyProperties2KHR); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, GetPhysicalDeviceMemoryProperties2KHR); \ - HookInitExtension(VK_KHR_get_physical_device_properties2, \ - GetPhysicalDeviceSparseImageFormatProperties2KHR); \ - HookInitExtension(VK_EXT_direct_mode_display, ReleaseDisplayEXT); \ - HookInitExtension(VK_EXT_display_surface_counter, GetPhysicalDeviceSurfaceCapabilities2EXT); \ - HookInitExtension(VK_KHR_external_memory_capabilities, \ - GetPhysicalDeviceExternalBufferPropertiesKHR); \ - HookInitExtension(VK_KHR_external_semaphore_capabilities, \ - GetPhysicalDeviceExternalSemaphorePropertiesKHR); \ +#define HookInitVulkanInstanceExts() \ + HookInitExtension(KHR_surface, DestroySurfaceKHR); \ + HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ + HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceCapabilitiesKHR); \ + HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceFormatsKHR); \ + HookInitExtension(KHR_surface, GetPhysicalDeviceSurfacePresentModesKHR); \ + HookInitExtension(EXT_debug_report, CreateDebugReportCallbackEXT); \ + HookInitExtension(EXT_debug_report, DestroyDebugReportCallbackEXT); \ + HookInitExtension(EXT_debug_report, DebugReportMessageEXT); \ + HookInitExtension(KHR_display, GetPhysicalDeviceDisplayPropertiesKHR); \ + HookInitExtension(KHR_display, GetPhysicalDeviceDisplayPlanePropertiesKHR); \ + HookInitExtension(KHR_display, GetDisplayPlaneSupportedDisplaysKHR); \ + HookInitExtension(KHR_display, GetDisplayModePropertiesKHR); \ + HookInitExtension(KHR_display, CreateDisplayModeKHR); \ + HookInitExtension(KHR_display, GetDisplayPlaneCapabilitiesKHR); \ + HookInitExtension(KHR_display, CreateDisplayPlaneSurfaceKHR); \ + HookInitExtension(NV_external_memory_capabilities, \ + GetPhysicalDeviceExternalImageFormatPropertiesNV); \ + HookInitExtension(KHR_get_physical_device_properties2, GetPhysicalDeviceFeatures2KHR); \ + HookInitExtension(KHR_get_physical_device_properties2, GetPhysicalDeviceProperties2KHR); \ + HookInitExtension(KHR_get_physical_device_properties2, GetPhysicalDeviceFormatProperties2KHR); \ + HookInitExtension(KHR_get_physical_device_properties2, \ + GetPhysicalDeviceImageFormatProperties2KHR); \ + HookInitExtension(KHR_get_physical_device_properties2, \ + GetPhysicalDeviceQueueFamilyProperties2KHR); \ + HookInitExtension(KHR_get_physical_device_properties2, GetPhysicalDeviceMemoryProperties2KHR); \ + HookInitExtension(KHR_get_physical_device_properties2, \ + GetPhysicalDeviceSparseImageFormatProperties2KHR); \ + HookInitExtension(EXT_direct_mode_display, ReleaseDisplayEXT); \ + HookInitExtension(EXT_display_surface_counter, GetPhysicalDeviceSurfaceCapabilities2EXT); \ + HookInitExtension(KHR_external_memory_capabilities, GetPhysicalDeviceExternalBufferPropertiesKHR); \ + HookInitExtension(KHR_external_semaphore_capabilities, \ + GetPhysicalDeviceExternalSemaphorePropertiesKHR); \ HookInitInstance_PlatformSpecific() -#define HookInitVulkanDeviceExts() \ - HookInitExtension(VK_EXT_debug_marker, DebugMarkerSetObjectTagEXT); \ - HookInitExtension(VK_EXT_debug_marker, DebugMarkerSetObjectNameEXT); \ - HookInitExtension(VK_EXT_debug_marker, CmdDebugMarkerBeginEXT); \ - HookInitExtension(VK_EXT_debug_marker, CmdDebugMarkerEndEXT); \ - HookInitExtension(VK_EXT_debug_marker, CmdDebugMarkerInsertEXT); \ - HookInitExtension(VK_KHR_swapchain, CreateSwapchainKHR); \ - HookInitExtension(VK_KHR_swapchain, DestroySwapchainKHR); \ - HookInitExtension(VK_KHR_swapchain, GetSwapchainImagesKHR); \ - HookInitExtension(VK_KHR_swapchain, AcquireNextImageKHR); \ - HookInitExtension(VK_KHR_swapchain, QueuePresentKHR); \ - HookInitExtension(VK_KHR_display_swapchain, CreateSharedSwapchainsKHR); \ - HookInitExtension(VK_KHR_maintenance1, TrimCommandPoolKHR); \ - HookInitExtension(VK_EXT_display_control, DisplayPowerControlEXT); \ - HookInitExtension(VK_EXT_display_control, RegisterDeviceEventEXT); \ - HookInitExtension(VK_EXT_display_control, RegisterDisplayEventEXT); \ - HookInitExtension(VK_EXT_display_control, GetSwapchainCounterEXT); \ - HookInitExtension(VK_KHR_external_memory_fd, GetMemoryFdKHR); \ - HookInitExtension(VK_KHR_external_memory_fd, GetMemoryFdPropertiesKHR); \ - HookInitExtension(VK_KHR_external_semaphore_fd, ImportSemaphoreFdKHR); \ - HookInitExtension(VK_KHR_external_semaphore_fd, GetSemaphoreFdKHR); \ - HookInitExtension(VK_KHR_get_memory_requirements2, GetBufferMemoryRequirements2KHR); \ - HookInitExtension(VK_KHR_get_memory_requirements2, GetImageMemoryRequirements2KHR); \ - HookInitExtension(VK_KHR_get_memory_requirements2, GetImageSparseMemoryRequirements2KHR); \ - HookInitExtension(VK_AMD_shader_info, GetShaderInfoAMD); \ - HookInitExtension(VK_KHR_push_descriptor, CmdPushDescriptorSetKHR); \ +#define HookInitVulkanDeviceExts() \ + HookInitExtension(EXT_debug_marker, DebugMarkerSetObjectTagEXT); \ + HookInitExtension(EXT_debug_marker, DebugMarkerSetObjectNameEXT); \ + HookInitExtension(EXT_debug_marker, CmdDebugMarkerBeginEXT); \ + HookInitExtension(EXT_debug_marker, CmdDebugMarkerEndEXT); \ + HookInitExtension(EXT_debug_marker, CmdDebugMarkerInsertEXT); \ + HookInitExtension(KHR_swapchain, CreateSwapchainKHR); \ + HookInitExtension(KHR_swapchain, DestroySwapchainKHR); \ + HookInitExtension(KHR_swapchain, GetSwapchainImagesKHR); \ + HookInitExtension(KHR_swapchain, AcquireNextImageKHR); \ + HookInitExtension(KHR_swapchain, QueuePresentKHR); \ + HookInitExtension(KHR_display_swapchain, CreateSharedSwapchainsKHR); \ + HookInitExtension(KHR_maintenance1, TrimCommandPoolKHR); \ + HookInitExtension(EXT_display_control, DisplayPowerControlEXT); \ + HookInitExtension(EXT_display_control, RegisterDeviceEventEXT); \ + HookInitExtension(EXT_display_control, RegisterDisplayEventEXT); \ + HookInitExtension(EXT_display_control, GetSwapchainCounterEXT); \ + HookInitExtension(KHR_external_memory_fd, GetMemoryFdKHR); \ + HookInitExtension(KHR_external_memory_fd, GetMemoryFdPropertiesKHR); \ + HookInitExtension(KHR_external_semaphore_fd, ImportSemaphoreFdKHR); \ + HookInitExtension(KHR_external_semaphore_fd, GetSemaphoreFdKHR); \ + HookInitExtension(KHR_get_memory_requirements2, GetBufferMemoryRequirements2KHR); \ + HookInitExtension(KHR_get_memory_requirements2, GetImageMemoryRequirements2KHR); \ + HookInitExtension(KHR_get_memory_requirements2, GetImageSparseMemoryRequirements2KHR); \ + HookInitExtension(AMD_shader_info, GetShaderInfoAMD); \ + HookInitExtension(KHR_push_descriptor, CmdPushDescriptorSetKHR); \ HookInitDevice_PlatformSpecific() #define DefineHooks() \ diff --git a/renderdoc/driver/vulkan/vk_layer.cpp b/renderdoc/driver/vulkan/vk_layer.cpp index 6216eb4c3..d385dceb6 100644 --- a/renderdoc/driver/vulkan/vk_layer.cpp +++ b/renderdoc/driver/vulkan/vk_layer.cpp @@ -256,16 +256,21 @@ VK_LAYER_EXPORT VkResult VKAPI_CALL VK_LAYER_RENDERDOC_CaptureEnumerateInstanceE pProperties); } +#undef CheckExt +#define CheckExt(name, ver) \ + bool name = instDevInfo->ext_##name; \ + (void)name; + #undef HookInit #define HookInit(function) \ if(!strcmp(pName, STRINGIZE(CONCAT(vk, function)))) \ return (PFN_vkVoidFunction)&CONCAT(hooked_vk, function); #undef HookInitExtension -#define HookInitExtension(ext, function) \ +#define HookInitExtension(cond, function) \ if(!strcmp(pName, STRINGIZE(CONCAT(vk, function)))) \ { \ - if(instDevInfo->ext_##ext) \ + if(cond) \ return (PFN_vkVoidFunction)&CONCAT(hooked_vk, function); \ } @@ -288,6 +293,8 @@ VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr(VkDevice device, const char *pName) InstanceDeviceInfo *instDevInfo = GetRecord(device)->instDevInfo; + CheckDeviceExts(); + HookInitVulkanDeviceExts(); if(GetDeviceDispatchTable(device)->GetDeviceProcAddr == NULL) @@ -320,12 +327,15 @@ VK_LAYER_RENDERDOC_CaptureGetInstanceProcAddr(VkInstance instance, const char *p InstanceDeviceInfo *instDevInfo = GetRecord(instance)->instDevInfo; + CheckInstanceExts(); + CheckDeviceExts(); + HookInitVulkanInstanceExts(); // GetInstanceProcAddr must also unconditionally return all device functions #undef HookInitExtension -#define HookInitExtension(ext, function) \ +#define HookInitExtension(cond, function) \ if(!strcmp(pName, STRINGIZE(CONCAT(vk, function)))) \ return (PFN_vkVoidFunction)&CONCAT(hooked_vk, function); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index b83fabab7..a4396d7cb 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -244,10 +244,11 @@ ReplayStatus WrappedVulkan::Initialise(VkInitParams ¶ms, uint64_t sectionVer InstanceDeviceInfo extInfo; #undef CheckExt -#define CheckExt(name, ver) \ - if(!strcmp(instinfo.ppEnabledExtensionNames[i], #name) || (int)renderdocAppInfo.apiVersion >= ver) \ - { \ - extInfo.ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(instinfo.ppEnabledExtensionNames[i], "VK_" #name) || \ + (int)renderdocAppInfo.apiVersion >= ver) \ + { \ + extInfo.ext_##name = true; \ } for(uint32_t i = 0; i < instinfo.enabledExtensionCount; i++) @@ -445,11 +446,11 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo record->instDevInfo->vulkanVersion = renderdocAppInfo.apiVersion; #undef CheckExt -#define CheckExt(name, ver) \ - if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], #name) || \ - record->instDevInfo->vulkanVersion >= ver) \ - { \ - record->instDevInfo->ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], "VK_" #name) || \ + record->instDevInfo->vulkanVersion >= ver) \ + { \ + record->instDevInfo->ext_##name = true; \ } for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++) @@ -1222,11 +1223,11 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi InstanceDeviceInfo extInfo; #undef CheckExt -#define CheckExt(name, ver) \ - if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name) || \ - (int)renderdocAppInfo.apiVersion >= ver) \ - { \ - extInfo.ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(createInfo.ppEnabledExtensionNames[i], "VK_" #name) || \ + (int)renderdocAppInfo.apiVersion >= ver) \ + { \ + extInfo.ext_##name = true; \ } for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++) @@ -1531,11 +1532,11 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, CheckInstanceExts(); #undef CheckExt -#define CheckExt(name, ver) \ - if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name) || \ - GetRecord(m_Instance)->instDevInfo->vulkanVersion >= ver) \ - { \ - record->instDevInfo->ext_##name = true; \ +#define CheckExt(name, ver) \ + if(!strcmp(createInfo.ppEnabledExtensionNames[i], "VK_" #name) || \ + GetRecord(m_Instance)->instDevInfo->vulkanVersion >= ver) \ + { \ + record->instDevInfo->ext_##name = true; \ } for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++)