1+ #include < assert>
12#include < iostream>
23#include < stdexcept>
34#include < vector>
@@ -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,19 @@ class HelloTriangleApplication {
246246 }
247247
248248 void createSwapChain () {
249- 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 };
249+ auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR ( surface );
250+ vk::SwapchainCreateInfoKHR swapChainCreateInfo{ . surface = surface,
251+ . minImageCount = chooseSwapMinImageCount ( surfaceCapabilities ),
252+ . imageFormat = chooseSwapSurfaceFormat ( physicalDevice. getSurfaceFormatsKHR ( surface ) ),
253+ . imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
254+ . imageExtent = chooseSwapExtent ( surfaceCapabilities ),
255+ . imageArrayLayers = 1 ,
256+ . imageUsage = vk::ImageUsageFlagBits::eColorAttachment ,
257+ . imageSharingMode = vk::SharingMode::eExclusive ,
258+ . preTransform = surfaceCapabilities. currentTransform ,
259+ .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
260+ .presentMode = chooseSwapPresentMode ( physicalDevice.getSurfacePresentModesKHR ( surface ) ),
261+ .clipped = true };
262262
263263 swapChain = vk::raii::SwapchainKHR ( device, swapChainCreateInfo );
264264 swapChainImages = swapChain.getImages ();
@@ -276,22 +276,30 @@ class HelloTriangleApplication {
276276 }
277277 }
278278
279+ static uint32_t chooseSwapMinImageCount (vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
280+ auto minImageCount = std::max ( 3u , surfaceCapabilities.minImageCount );
281+ if ((0 < surfaceCapabilities.maxImageCount ) && (surfaceCapabilities.maxImageCount < minImageCount)) {
282+ minImageCount = surfaceCapabilities.maxImageCount ;
283+ }
284+ return minImageCount;
285+ }
286+
279287 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- });
288+ assert (!availableFormats.empty ());
289+ const auto formatIt = std::ranges::find_if (
290+ availableFormats,
291+ []( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
285292 return formatIt != availableFormats.end () ? formatIt->format : availableFormats[0 ].format ;
286293 }
287294
288295 static vk::PresentModeKHR chooseSwapPresentMode (const std::vector<vk::PresentModeKHR>& availablePresentModes) {
296+ assert (std::ranges::any_of (availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
289297 return std::ranges::any_of (availablePresentModes,
290298 [](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291299 }
292300
293301 vk::Extent2D chooseSwapExtent (const vk::SurfaceCapabilitiesKHR& capabilities) {
294- if (capabilities.currentExtent .width != std::numeric_limits< uint32_t >:: max () ) {
302+ if (capabilities.currentExtent .width != 0xFFFFFFFF ) {
295303 return capabilities.currentExtent ;
296304 }
297305 int width, height;
0 commit comments