diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 09caffc10..ebcf361a9 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -831,7 +831,7 @@ VkAccessFlags MakeAccessMask(VkImageLayout layout) void ReplacePresentableImageLayout(VkImageLayout &layout) { - if(layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) + if(layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR || layout == VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR) layout = VK_IMAGE_LAYOUT_GENERAL; } diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 339aacc4a..2fa2cf0fa 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -824,6 +824,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION, }, + { + VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION, + }, { VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION, @@ -1410,6 +1413,9 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}, }; + if(swapInfo.shared) + bbBarrier.oldLayout = VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR; + DoPipelineBarrier(cmd, 1, &bbBarrier); if(swapQueueIndex != m_QueueFamilyIdx) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 3eef44315..cd6b4df1d 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1912,4 +1912,7 @@ public: VkResult vkGetValidationCacheDataEXT(VkDevice device, VkValidationCacheEXT validationCache, size_t *pDataSize, void *pData); + + // VK_KHR_shared_presentable_image + VkResult vkGetSwapchainStatusKHR(VkDevice device, VkSwapchainKHR swapchain); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 3d0c1b6f0..6f42e0d6e 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -350,7 +350,8 @@ CheckExt(KHR_device_group, VK11); \ CheckExt(MVK_moltenvk, VKXX); \ CheckExt(KHR_draw_indirect_count, VKXX); \ - CheckExt(EXT_validation_cache, VKXX); + CheckExt(EXT_validation_cache, VKXX); \ + CheckExt(KHR_shared_presentable_image, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(KHR_surface, DestroySurfaceKHR); \ @@ -466,6 +467,7 @@ HookInitExtension(EXT_validation_cache, DestroyValidationCacheEXT); \ HookInitExtension(EXT_validation_cache, MergeValidationCachesEXT); \ HookInitExtension(EXT_validation_cache, GetValidationCacheDataEXT); \ + HookInitExtension(KHR_shared_presentable_image, GetSwapchainStatusKHR); \ HookInitDevice_PlatformSpecific() #define DefineHooks() \ @@ -991,6 +993,7 @@ dstCache, uint32_t, srcCacheCount, const VkValidationCacheEXT *, pSrcCaches); \ HookDefine4(VkResult, vkGetValidationCacheDataEXT, VkDevice, device, VkValidationCacheEXT, \ validationCache, size_t *, pDataSize, void *, pData); \ + HookDefine2(VkResult, vkGetSwapchainStatusKHR, VkDevice, device, VkSwapchainKHR, swapchain); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 918dfd0b8..2876d91db 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -860,6 +860,8 @@ struct SwapchainInfo VkExtent2D extent; int arraySize; + bool shared; + VkRenderPass rp; RENDERDOC_WindowHandle wndHandle; diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index d557c60eb..f0faccfdd 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -322,6 +322,9 @@ bool WrappedVulkan::Serialise_vkCreateSwapchainKHR(SerialiserType &ser, VkDevice swapinfo.extent = CreateInfo.imageExtent; swapinfo.arraySize = CreateInfo.imageArrayLayers; + swapinfo.shared = (CreateInfo.presentMode == VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR || + CreateInfo.presentMode == VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR); + swapinfo.images.resize(NumImages); const VkImageCreateInfo imInfo = { @@ -719,6 +722,9 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}, }; + if(swapInfo.shared) + bbBarrier.oldLayout = VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR; + bbBarrier.srcAccessMask = VK_ACCESS_ALL_READ_BITS; bbBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; @@ -1043,6 +1049,11 @@ VkResult WrappedVulkan::vkGetDisplayPlaneCapabilities2KHR( ->GetDisplayPlaneCapabilities2KHR(Unwrap(physicalDevice), pDisplayPlaneInfo, pCapabilities); } +VkResult WrappedVulkan::vkGetSwapchainStatusKHR(VkDevice device, VkSwapchainKHR swapchain) +{ + return ObjDisp(device)->GetSwapchainStatusKHR(Unwrap(device), Unwrap(swapchain)); +} + INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateSwapchainKHR, VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain);