From e3642cf76422776d261410d1aa7fbefb87558eef Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 22 Aug 2023 22:25:41 -0400 Subject: [PATCH] [Vulkan] Support different swapchain compositeAlpha modes Not all systems support VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR. Add VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR support, and check capabilities.supportedCompositeAlpha. --- lib/ivis_opengl/gfx_api_vk.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/ivis_opengl/gfx_api_vk.cpp b/lib/ivis_opengl/gfx_api_vk.cpp index 69a97e10b59..2fa375bd2ef 100644 --- a/lib/ivis_opengl/gfx_api_vk.cpp +++ b/lib/ivis_opengl/gfx_api_vk.cpp @@ -3970,13 +3970,29 @@ bool VkRoot::createSwapchain() surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats); debug(LOG_3D, "Using surface format: %s - %s", to_string(surfaceFormat.format).c_str(), to_string(surfaceFormat.colorSpace).c_str()); + // pick compositeAlpha + vk::CompositeAlphaFlagBitsKHR compositeAlphaMode = vk::CompositeAlphaFlagBitsKHR::eOpaque; + if (swapChainSupport.capabilities.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::eOpaque) + { + compositeAlphaMode = vk::CompositeAlphaFlagBitsKHR::eOpaque; + } + else if (swapChainSupport.capabilities.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::eInherit) + { + compositeAlphaMode = vk::CompositeAlphaFlagBitsKHR::eInherit; + } + else + { + debug(LOG_INFO, "Unable to find expected supportedCompositeAlpha option (value is: %s) - will attempt opaque", to_string(swapChainSupport.capabilities.supportedCompositeAlpha).c_str()); + } + debug(LOG_3D, "Using supportedCompositeAlpha: %s", to_string(compositeAlphaMode).c_str()); + vk::SwapchainCreateInfoKHR createSwapchainInfo = vk::SwapchainCreateInfoKHR() .setSurface(surface) .setMinImageCount(swapchainDesiredImageCount) .setPresentMode(presentMode) .setImageUsage(vk::ImageUsageFlagBits::eColorAttachment) .setImageArrayLayers(1) - .setCompositeAlpha(vk::CompositeAlphaFlagBitsKHR::eOpaque) + .setCompositeAlpha(compositeAlphaMode) .setClipped(true) .setImageExtent(swapchainSize) .setImageFormat(surfaceFormat.format)