@@ -49,11 +49,10 @@ class HelloTriangleApplication {
4949 vk::raii::PhysicalDevice physicalDevice = nullptr ;
5050 vk::raii::Device device = nullptr ;
5151 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;
52+ vk::raii::SwapchainKHR swapChain = nullptr ;
53+ std::vector<vk::Image> swapChainImages;
54+ vk::Format swapChainImageFormat = vk::Format::eUndefined;
55+ vk::Extent2D swapChainExtent;
5756 std::vector<vk::raii::ImageView> swapChainImageViews;
5857
5958 std::vector<const char *> requiredDeviceExtension = {
@@ -246,19 +245,19 @@ class HelloTriangleApplication {
246245 }
247246
248247 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 };
248+ auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR ( surface );
249+ vk::SwapchainCreateInfoKHR swapChainCreateInfo{ . surface = surface,
250+ . minImageCount = chooseSwapMinImageCount ( surfaceCapabilities ),
251+ . imageFormat = chooseSwapSurfaceFormat ( physicalDevice. getSurfaceFormatsKHR ( surface ) ),
252+ . imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
253+ . imageExtent = chooseSwapExtent ( surfaceCapabilities ),
254+ . imageArrayLayers = 1 ,
255+ . imageUsage = vk::ImageUsageFlagBits::eColorAttachment ,
256+ . imageSharingMode = vk::SharingMode::eExclusive ,
257+ . preTransform = surfaceCapabilities. currentTransform ,
258+ .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
259+ .presentMode = chooseSwapPresentMode ( physicalDevice.getSurfacePresentModesKHR ( surface ) ),
260+ .clipped = true };
262261
263262 swapChain = vk::raii::SwapchainKHR ( device, swapChainCreateInfo );
264263 swapChainImages = swapChain.getImages ();
@@ -276,22 +275,30 @@ class HelloTriangleApplication {
276275 }
277276 }
278277
278+ static uint32_t chooseSwapMinImageCount (vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
279+ auto minImageCount = std::max ( 3u , surfaceCapabilities.minImageCount );
280+ if ((0 < surfaceCapabilities.maxImageCount ) && (surfaceCapabilities.maxImageCount < minImageCount)) {
281+ minImageCount = surfaceCapabilities.maxImageCount ;
282+ }
283+ return minImageCount;
284+ }
285+
279286 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- });
287+ assert (!availableFormats.empty ());
288+ const auto formatIt = std::ranges::find_if (
289+ availableFormats,
290+ []( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
285291 return formatIt != availableFormats.end () ? formatIt->format : availableFormats[0 ].format ;
286292 }
287293
288294 static vk::PresentModeKHR chooseSwapPresentMode (const std::vector<vk::PresentModeKHR>& availablePresentModes) {
295+ assert (std::ranges::any_of (availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
289296 return std::ranges::any_of (availablePresentModes,
290297 [](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291298 }
292299
293300 vk::Extent2D chooseSwapExtent (const vk::SurfaceCapabilitiesKHR& capabilities) {
294- if (capabilities.currentExtent .width != std::numeric_limits< uint32_t >:: max () ) {
301+ if (capabilities.currentExtent .width != 0xFFFFFFFF ) {
295302 return capabilities.currentExtent ;
296303 }
297304 int width, height;
0 commit comments