Skip to content

Commit a8ac101

Browse files
committed
Fix VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280
1 parent b87b72e commit a8ac101

File tree

1 file changed

+46
-42
lines changed

1 file changed

+46
-42
lines changed

src/FlyCube/Swapchain/VKSwapchain.cpp

+46-42
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
#include <Windows.h>
1313
#elif defined(__APPLE__)
1414
#import <QuartzCore/QuartzCore.h>
15-
#elif !defined(__ANDROID__)
15+
#elif defined(__ANDROID__)
16+
#include <android/native_window.h>
17+
#else
1618
#include <X11/Xlib-xcb.h>
1719
#endif
1820

@@ -25,31 +27,31 @@ VKSwapchain::VKSwapchain(VKCommandQueue& command_queue,
2527
: m_command_queue(command_queue)
2628
, m_device(command_queue.GetDevice())
2729
{
28-
VKAdapter& adapter = m_device.GetAdapter();
29-
VKInstance& instance = adapter.GetInstance();
30+
auto vk_instance = m_device.GetAdapter().GetInstance().GetInstance();
31+
auto vk_physical_device = m_device.GetAdapter().GetPhysicalDevice();
3032

3133
#if defined(_WIN32)
32-
vk::Win32SurfaceCreateInfoKHR surface_desc = {};
33-
surface_desc.hinstance = GetModuleHandle(nullptr);
34-
surface_desc.hwnd = reinterpret_cast<HWND>(window);
35-
m_surface = instance.GetInstance().createWin32SurfaceKHRUnique(surface_desc);
34+
vk::Win32SurfaceCreateInfoKHR win32_surface_info = {};
35+
win32_surface_info.hinstance = GetModuleHandle(nullptr);
36+
win32_surface_info.hwnd = reinterpret_cast<HWND>(window);
37+
m_surface = vk_instance.createWin32SurfaceKHRUnique(win32_surface_info);
3638
#elif defined(__APPLE__)
37-
vk::MetalSurfaceCreateInfoEXT surface_desc = {};
38-
surface_desc.pLayer = (__bridge CAMetalLayer*)window;
39-
m_surface = instance.GetInstance().createMetalSurfaceEXTUnique(surface_desc);
39+
vk::MetalSurfaceCreateInfoEXT metal_surface_info = {};
40+
metal_surface_info.pLayer = (__bridge CAMetalLayer*)window;
41+
m_surface = vk_instance.createMetalSurfaceEXTUnique(metal_surface_info);
4042
#elif defined(__ANDROID__)
41-
vk::AndroidSurfaceCreateInfoKHR surface_desc = {};
42-
surface_desc.window = reinterpret_cast<struct ANativeWindow*>(window);
43-
m_surface = instance.GetInstance().createAndroidSurfaceKHRUnique(surface_desc);
43+
vk::AndroidSurfaceCreateInfoKHR android_surface_info = {};
44+
android_surface_info.window = reinterpret_cast<ANativeWindow*>(window);
45+
m_surface = vk_instance.createAndroidSurfaceKHRUnique(android_surface_info);
4446
#else
45-
vk::XcbSurfaceCreateInfoKHR surface_desc = {};
46-
surface_desc.setConnection(XGetXCBConnection(XOpenDisplay(nullptr)));
47-
surface_desc.setWindow((ptrdiff_t)window);
48-
m_surface = instance.GetInstance().createXcbSurfaceKHRUnique(surface_desc);
47+
vk::XcbSurfaceCreateInfoKHR xcb_surface_info = {};
48+
xcb_surface_info.connection = XGetXCBConnection(XOpenDisplay(nullptr));
49+
xcb_surface_info.window = reinterpret_cast<ptrdiff_t>(window);
50+
m_surface = vk_instance.createXcbSurfaceKHRUnique(xcb_surface_info);
4951
#endif
5052

5153
vk::ColorSpaceKHR color_space = {};
52-
auto surface_formats = adapter.GetPhysicalDevice().getSurfaceFormatsKHR(m_surface.get());
54+
auto surface_formats = vk_physical_device.getSurfaceFormatsKHR(m_surface.get());
5355
for (const auto& surface : surface_formats) {
5456
if (!gli::is_srgb(static_cast<gli::format>(surface.format))) {
5557
m_swapchain_color_format = surface.format;
@@ -60,45 +62,47 @@ VKSwapchain::VKSwapchain(VKCommandQueue& command_queue,
6062
assert(m_swapchain_color_format != vk::Format::eUndefined);
6163

6264
vk::SurfaceCapabilitiesKHR surface_capabilities = {};
63-
ASSERT_SUCCEEDED(adapter.GetPhysicalDevice().getSurfaceCapabilitiesKHR(m_surface.get(), &surface_capabilities));
64-
65+
ASSERT_SUCCEEDED(vk_physical_device.getSurfaceCapabilitiesKHR(m_surface.get(), &surface_capabilities));
6566
ASSERT(surface_capabilities.currentExtent.width == width);
6667
ASSERT(surface_capabilities.currentExtent.height == height);
6768

6869
vk::Bool32 is_supported_surface = VK_FALSE;
69-
std::ignore = adapter.GetPhysicalDevice().getSurfaceSupportKHR(command_queue.GetQueueFamilyIndex(), m_surface.get(),
70-
&is_supported_surface);
70+
std::ignore = vk_physical_device.getSurfaceSupportKHR(command_queue.GetQueueFamilyIndex(), m_surface.get(),
71+
&is_supported_surface);
7172
ASSERT(is_supported_surface);
7273

73-
auto modes = adapter.GetPhysicalDevice().getSurfacePresentModesKHR(m_surface.get());
74-
75-
vk::SwapchainCreateInfoKHR swap_chain_create_info = {};
76-
swap_chain_create_info.surface = m_surface.get();
77-
swap_chain_create_info.minImageCount = frame_count;
78-
swap_chain_create_info.imageFormat = m_swapchain_color_format;
79-
swap_chain_create_info.imageColorSpace = color_space;
80-
swap_chain_create_info.imageExtent = vk::Extent2D(width, height);
81-
swap_chain_create_info.imageArrayLayers = 1;
82-
swap_chain_create_info.imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferDst;
83-
swap_chain_create_info.imageSharingMode = vk::SharingMode::eExclusive;
84-
swap_chain_create_info.preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity;
85-
swap_chain_create_info.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque;
74+
auto modes = vk_physical_device.getSurfacePresentModesKHR(m_surface.get());
75+
76+
vk::SwapchainCreateInfoKHR swapchain_info = {};
77+
swapchain_info.surface = m_surface.get();
78+
swapchain_info.minImageCount = frame_count;
79+
swapchain_info.imageFormat = m_swapchain_color_format;
80+
swapchain_info.imageColorSpace = color_space;
81+
swapchain_info.imageExtent = vk::Extent2D(width, height);
82+
swapchain_info.imageArrayLayers = 1;
83+
swapchain_info.imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferDst;
84+
swapchain_info.imageSharingMode = vk::SharingMode::eExclusive;
85+
swapchain_info.preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity;
86+
if (surface_capabilities.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::eOpaque) {
87+
swapchain_info.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque;
88+
} else {
89+
swapchain_info.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eInherit;
90+
}
8691
if (vsync) {
8792
if (std::count(modes.begin(), modes.end(), vk::PresentModeKHR::eFifoRelaxed)) {
88-
swap_chain_create_info.presentMode = vk::PresentModeKHR::eFifoRelaxed;
93+
swapchain_info.presentMode = vk::PresentModeKHR::eFifoRelaxed;
8994
} else {
90-
swap_chain_create_info.presentMode = vk::PresentModeKHR::eFifo;
95+
swapchain_info.presentMode = vk::PresentModeKHR::eFifo;
9196
}
9297
} else {
9398
if (std::count(modes.begin(), modes.end(), vk::PresentModeKHR::eMailbox)) {
94-
swap_chain_create_info.presentMode = vk::PresentModeKHR::eMailbox;
99+
swapchain_info.presentMode = vk::PresentModeKHR::eMailbox;
95100
} else {
96-
swap_chain_create_info.presentMode = vk::PresentModeKHR::eImmediate;
101+
swapchain_info.presentMode = vk::PresentModeKHR::eImmediate;
97102
}
98103
}
99-
swap_chain_create_info.clipped = true;
100-
101-
m_swapchain = m_device.GetDevice().createSwapchainKHRUnique(swap_chain_create_info);
104+
swapchain_info.clipped = true;
105+
m_swapchain = m_device.GetDevice().createSwapchainKHRUnique(swapchain_info);
102106

103107
std::vector<vk::Image> m_images = m_device.GetDevice().getSwapchainImagesKHR(m_swapchain.get());
104108

0 commit comments

Comments
 (0)