diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 5250d5dce..5fa93956b 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -720,6 +720,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION, }, + { + VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, + VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION, + }, { VK_KHR_MAINTENANCE1_EXTENSION_NAME, VK_KHR_MAINTENANCE1_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index cf400d668..c5b131681 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1809,4 +1809,15 @@ public: IMPLEMENT_FUNCTION_SERIALISED(void, vkGetDeviceQueue2, VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue); + + // VK_KHR_get_surface_capabilities2 + + VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR( + VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, + VkSurfaceCapabilities2KHR *pSurfaceCapabilities); + + VkResult vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, + uint32_t *pSurfaceFormatCount, + VkSurfaceFormat2KHR *pSurfaceFormats); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 090c46b0a..4d60ebb36 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -298,7 +298,8 @@ CheckExt(KHR_external_fence_capabilities, VK11); \ CheckExt(EXT_debug_utils, VKXX); \ CheckExt(KHR_device_group_creation, VK11); \ - CheckExt(protected_memory, VK11); + CheckExt(protected_memory, VK11); \ + CheckExt(KHR_get_surface_capabilities2, VKXX); #define CheckDeviceExts() \ CheckExt(EXT_debug_marker, VKXX); \ @@ -379,6 +380,8 @@ /* should always be present/not present together. Keying from the instance extension ensures */ \ /* we'll load this function correctly when populating dispatch tables. */ \ HookInitExtension(KHR_device_group_creation &&KHR_surface, GetPhysicalDevicePresentRectanglesKHR); \ + HookInitExtension(KHR_get_surface_capabilities2, GetPhysicalDeviceSurfaceFormats2KHR); \ + HookInitExtension(KHR_get_surface_capabilities2, GetPhysicalDeviceSurfaceCapabilities2KHR); \ HookInitInstance_PlatformSpecific() #define HookInitVulkanDeviceExts() \ @@ -928,6 +931,12 @@ const VkAcquireNextImageInfoKHR *, pAcquireInfo, uint32_t *, pImageIndex); \ HookDefine3(void, vkGetDeviceQueue2, VkDevice, device, const VkDeviceQueueInfo2 *, pQueueInfo, \ VkQueue *, pQueue); \ + HookDefine3(VkResult, vkGetPhysicalDeviceSurfaceCapabilities2KHR, VkPhysicalDevice, \ + physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, pSurfaceInfo, \ + VkSurfaceCapabilities2KHR *, pSurfaceCapabilities); \ + HookDefine4(VkResult, vkGetPhysicalDeviceSurfaceFormats2KHR, VkPhysicalDevice, physicalDevice, \ + const VkPhysicalDeviceSurfaceInfo2KHR *, pSurfaceInfo, uint32_t *, \ + pSurfaceFormatCount, VkSurfaceFormat2KHR *, pSurfaceFormats); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index b627d1533..d633c832b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -975,10 +975,34 @@ VkResult WrappedVulkan::vkAcquireNextImage2KHR(VkDevice device, return ObjDisp(device)->AcquireNextImage2KHR(Unwrap(device), &unwrapped, pImageIndex); } +VkResult WrappedVulkan::vkGetPhysicalDeviceSurfaceCapabilities2KHR( + VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, + VkSurfaceCapabilities2KHR *pSurfaceCapabilities) +{ + VkPhysicalDeviceSurfaceInfo2KHR unwrapped = *pSurfaceInfo; + unwrapped.surface = Unwrap(unwrapped.surface); + + return ObjDisp(physicalDevice) + ->GetPhysicalDeviceSurfaceCapabilities2KHR(Unwrap(physicalDevice), &unwrapped, + pSurfaceCapabilities); +} + +VkResult WrappedVulkan::vkGetPhysicalDeviceSurfaceFormats2KHR( + VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, + uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) +{ + VkPhysicalDeviceSurfaceInfo2KHR unwrapped = *pSurfaceInfo; + unwrapped.surface = Unwrap(unwrapped.surface); + + return ObjDisp(physicalDevice) + ->GetPhysicalDeviceSurfaceFormats2KHR(Unwrap(physicalDevice), &unwrapped, pSurfaceFormatCount, + pSurfaceFormats); +} + INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateSwapchainKHR, VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain); INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkGetSwapchainImagesKHR, VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, - VkImage *pSwapchainImages); \ No newline at end of file + VkImage *pSwapchainImages);