66#include < memory>
77#include < algorithm>
88#include < limits>
9+ #include < assert.h>
910
1011#ifdef __INTELLISENSE__
1112#include < vulkan/vulkan_raii.hpp>
@@ -49,11 +50,10 @@ class HelloTriangleApplication {
4950 vk::raii::PhysicalDevice physicalDevice = nullptr ;
5051 vk::raii::Device device = nullptr ;
5152 vk::raii::Queue queue = nullptr ;
52-
53- vk::raii::SwapchainKHR swapChain = nullptr ;
54- std::vector<vk::Image> swapChainImages;
55- vk::Format swapChainImageFormat = vk::Format::eUndefined;
56- vk::Extent2D swapChainExtent;
53+ vk::raii::SwapchainKHR swapChain = nullptr ;
54+ std::vector<vk::Image> swapChainImages;
55+ vk::SurfaceFormatKHR swapChainSurfaceFormat;
56+ vk::Extent2D swapChainExtent;
5757 std::vector<vk::raii::ImageView> swapChainImageViews;
5858
5959 std::vector<const char *> requiredDeviceExtension = {
@@ -247,18 +247,20 @@ class HelloTriangleApplication {
247247
248248 void createSwapChain () {
249249 auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR ( surface );
250- swapChainImageFormat = chooseSwapSurfaceFormat (physicalDevice.getSurfaceFormatsKHR ( surface ));
251- swapChainExtent = chooseSwapExtent (surfaceCapabilities);
252- auto minImageCount = std::max ( 3u , surfaceCapabilities.minImageCount );
253- minImageCount = ( surfaceCapabilities.maxImageCount > 0 && minImageCount > surfaceCapabilities.maxImageCount ) ? surfaceCapabilities.maxImageCount : minImageCount;
254- vk::SwapchainCreateInfoKHR swapChainCreateInfo{
255- .surface = surface, .minImageCount = minImageCount,
256- .imageFormat = swapChainImageFormat, .imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
257- .imageExtent = swapChainExtent, .imageArrayLayers =1 ,
258- .imageUsage = vk::ImageUsageFlagBits::eColorAttachment, .imageSharingMode = vk::SharingMode::eExclusive,
259- .preTransform = surfaceCapabilities.currentTransform , .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
260- .presentMode = chooseSwapPresentMode (physicalDevice.getSurfacePresentModesKHR ( surface )),
261- .clipped = true };
250+ swapChainExtent = chooseSwapExtent ( surfaceCapabilities );
251+ swapChainSurfaceFormat = chooseSwapSurfaceFormat ( physicalDevice.getSurfaceFormatsKHR ( surface ) );
252+ vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = surface,
253+ .minImageCount = chooseSwapMinImageCount ( surfaceCapabilities ),
254+ .imageFormat = swapChainSurfaceFormat.format ,
255+ .imageColorSpace = swapChainSurfaceFormat.colorSpace ,
256+ .imageExtent = swapChainExtent,
257+ .imageArrayLayers = 1 ,
258+ .imageUsage = vk::ImageUsageFlagBits::eColorAttachment,
259+ .imageSharingMode = vk::SharingMode::eExclusive,
260+ .preTransform = surfaceCapabilities.currentTransform ,
261+ .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
262+ .presentMode = chooseSwapPresentMode ( physicalDevice.getSurfacePresentModesKHR ( surface ) ),
263+ .clipped = true };
262264
263265 swapChain = vk::raii::SwapchainKHR ( device, swapChainCreateInfo );
264266 swapChainImages = swapChain.getImages ();
@@ -267,7 +269,7 @@ class HelloTriangleApplication {
267269 void createImageViews () {
268270 swapChainImageViews.clear ();
269271
270- vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainImageFormat ,
272+ vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainSurfaceFormat. format ,
271273 .subresourceRange = { vk::ImageAspectFlagBits::eColor, 0 , 1 , 0 , 1 } };
272274 for ( auto image : swapChainImages )
273275 {
@@ -276,22 +278,30 @@ class HelloTriangleApplication {
276278 }
277279 }
278280
279- static vk::Format chooseSwapSurfaceFormat (const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
280- const auto formatIt = std::ranges::find_if (availableFormats,
281- [](const auto & format) {
282- return format.format == vk::Format::eB8G8R8A8Srgb &&
283- format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear;
284- });
285- return formatIt != availableFormats.end () ? formatIt->format : availableFormats[0 ].format ;
281+ static uint32_t chooseSwapMinImageCount (vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
282+ auto minImageCount = std::max ( 3u , surfaceCapabilities.minImageCount );
283+ if ((0 < surfaceCapabilities.maxImageCount ) && (surfaceCapabilities.maxImageCount < minImageCount)) {
284+ minImageCount = surfaceCapabilities.maxImageCount ;
285+ }
286+ return minImageCount;
287+ }
288+
289+ static vk::SurfaceFormatKHR chooseSwapSurfaceFormat (const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
290+ assert (!availableFormats.empty ());
291+ const auto formatIt = std::ranges::find_if (
292+ availableFormats,
293+ []( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
294+ return formatIt != availableFormats.end () ? *formatIt : availableFormats[0 ];
286295 }
287296
288297 static vk::PresentModeKHR chooseSwapPresentMode (const std::vector<vk::PresentModeKHR>& availablePresentModes) {
298+ assert (std::ranges::any_of (availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentModeKHR::eFifo; }));
289299 return std::ranges::any_of (availablePresentModes,
290300 [](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291301 }
292302
293303 vk::Extent2D chooseSwapExtent (const vk::SurfaceCapabilitiesKHR& capabilities) {
294- if (capabilities.currentExtent .width != std::numeric_limits< uint32_t >:: max () ) {
304+ if (capabilities.currentExtent .width != 0xFFFFFFFF ) {
295305 return capabilities.currentExtent ;
296306 }
297307 int width, height;
0 commit comments