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::Format swapChainImageFormat = vk::Format::eUndefined;
56+ vk::Extent2D swapChainExtent;
5757 std::vector<vk::raii::ImageView> swapChainImageViews;
5858
5959 std::vector<const char *> requiredDeviceExtension = {
@@ -246,19 +246,20 @@ class HelloTriangleApplication {
246246 }
247247
248248 void createSwapChain () {
249+ swapChainImageFormat = chooseSwapSurfaceFormat ( physicalDevice.getSurfaceFormatsKHR ( surface ) );
249250 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 };
251+ vk::SwapchainCreateInfoKHR swapChainCreateInfo{ . surface = surface,
252+ . minImageCount = chooseSwapMinImageCount ( surfaceCapabilities ),
253+ . imageFormat = swapChainImageFormat,
254+ . imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
255+ . imageExtent = chooseSwapExtent ( surfaceCapabilities ),
256+ . imageArrayLayers = 1 ,
257+ . imageUsage = vk::ImageUsageFlagBits::eColorAttachment ,
258+ . imageSharingMode = vk::SharingMode::eExclusive ,
259+ . preTransform = surfaceCapabilities. currentTransform ,
260+ .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
261+ .presentMode = chooseSwapPresentMode ( physicalDevice.getSurfacePresentModesKHR ( surface ) ),
262+ .clipped = true };
262263
263264 swapChain = vk::raii::SwapchainKHR ( device, swapChainCreateInfo );
264265 swapChainImages = swapChain.getImages ();
@@ -276,22 +277,30 @@ class HelloTriangleApplication {
276277 }
277278 }
278279
280+ static uint32_t chooseSwapMinImageCount (vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
281+ auto minImageCount = std::max ( 3u , surfaceCapabilities.minImageCount );
282+ if ((0 < surfaceCapabilities.maxImageCount ) && (surfaceCapabilities.maxImageCount < minImageCount)) {
283+ minImageCount = surfaceCapabilities.maxImageCount ;
284+ }
285+ return minImageCount;
286+ }
287+
279288 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- });
289+ assert (!availableFormats.empty ());
290+ const auto formatIt = std::ranges::find_if (
291+ availableFormats,
292+ []( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
285293 return formatIt != availableFormats.end () ? formatIt->format : availableFormats[0 ].format ;
286294 }
287295
288296 static vk::PresentModeKHR chooseSwapPresentMode (const std::vector<vk::PresentModeKHR>& availablePresentModes) {
297+ assert (std::ranges::any_of (availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
289298 return std::ranges::any_of (availablePresentModes,
290299 [](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291300 }
292301
293302 vk::Extent2D chooseSwapExtent (const vk::SurfaceCapabilitiesKHR& capabilities) {
294- if (capabilities.currentExtent .width != std::numeric_limits< uint32_t >:: max () ) {
303+ if (capabilities.currentExtent .width != 0xFFFFFFFF ) {
295304 return capabilities.currentExtent ;
296305 }
297306 int width, height;
0 commit comments