12
12
#include < Windows.h>
13
13
#elif defined(__APPLE__)
14
14
#import < QuartzCore/QuartzCore.h>
15
- #elif !defined(__ANDROID__)
15
+ #elif defined(__ANDROID__)
16
+ #include < android/native_window.h>
17
+ #else
16
18
#include < X11/Xlib-xcb.h>
17
19
#endif
18
20
@@ -25,31 +27,31 @@ VKSwapchain::VKSwapchain(VKCommandQueue& command_queue,
25
27
: m_command_queue(command_queue)
26
28
, m_device(command_queue.GetDevice())
27
29
{
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 ();
30
32
31
33
#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 );
36
38
#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 );
40
42
#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 );
44
46
#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 );
49
51
#endif
50
52
51
53
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 ());
53
55
for (const auto & surface : surface_formats) {
54
56
if (!gli::is_srgb (static_cast <gli::format>(surface.format ))) {
55
57
m_swapchain_color_format = surface.format ;
@@ -60,45 +62,47 @@ VKSwapchain::VKSwapchain(VKCommandQueue& command_queue,
60
62
assert (m_swapchain_color_format != vk::Format::eUndefined);
61
63
62
64
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));
65
66
ASSERT (surface_capabilities.currentExtent .width == width);
66
67
ASSERT (surface_capabilities.currentExtent .height == height);
67
68
68
69
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);
71
72
ASSERT (is_supported_surface);
72
73
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
+ }
86
91
if (vsync) {
87
92
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;
89
94
} else {
90
- swap_chain_create_info .presentMode = vk::PresentModeKHR::eFifo;
95
+ swapchain_info .presentMode = vk::PresentModeKHR::eFifo;
91
96
}
92
97
} else {
93
98
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;
95
100
} else {
96
- swap_chain_create_info .presentMode = vk::PresentModeKHR::eImmediate;
101
+ swapchain_info .presentMode = vk::PresentModeKHR::eImmediate;
97
102
}
98
103
}
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);
102
106
103
107
std::vector<vk::Image> m_images = m_device.GetDevice ().getSwapchainImagesKHR (m_swapchain.get ());
104
108
0 commit comments