@@ -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 = {
@@ -245,40 +244,48 @@ class HelloTriangleApplication {
245244 }
246245
247246 void createSwapChain () {
248- auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR ( surface );
249- swapChainImageFormat = chooseSwapSurfaceFormat (physicalDevice. getSurfaceFormatsKHR ( surface ));
250- swapChainExtent = chooseSwapExtent ( surfaceCapabilities);
251- auto minImageCount = std::max ( 3u , surfaceCapabilities. minImageCount );
252- minImageCount = ( surfaceCapabilities. maxImageCount > 0 && minImageCount > surfaceCapabilities. maxImageCount ) ? surfaceCapabilities. maxImageCount : minImageCount;
253- vk::SwapchainCreateInfoKHR swapChainCreateInfo{
254- . surface = surface, . minImageCount = minImageCount ,
255- . imageFormat = swapChainImageFormat, . imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear ,
256- . imageExtent = swapChainExtent, . imageArrayLayers = 1 ,
257- . imageUsage = vk::ImageUsageFlagBits::eColorAttachment, . imageSharingMode = vk::SharingMode::eExclusive ,
258- . preTransform = surfaceCapabilities. currentTransform , .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
259- .presentMode = chooseSwapPresentMode (physicalDevice.getSurfacePresentModesKHR ( surface )),
260- .clipped = true };
247+ auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR ( surface );
248+ vk::SwapchainCreateInfoKHR swapChainCreateInfo{ . surface = surface,
249+ . minImageCount = chooseSwapMinImageCount ( surfaceCapabilities ),
250+ . imageFormat = chooseSwapSurfaceFormat ( physicalDevice. getSurfaceFormatsKHR ( surface ) ),
251+ . imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
252+ . imageExtent = chooseSwapExtent ( surfaceCapabilities ),
253+ . imageArrayLayers = 1 ,
254+ . imageUsage = vk::ImageUsageFlagBits::eColorAttachment ,
255+ . imageSharingMode = vk::SharingMode::eExclusive ,
256+ . preTransform = surfaceCapabilities. currentTransform ,
257+ .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
258+ .presentMode = chooseSwapPresentMode ( physicalDevice.getSurfacePresentModesKHR ( surface ) ),
259+ .clipped = true };
261260
262261 swapChain = vk::raii::SwapchainKHR ( device, swapChainCreateInfo );
263262 swapChainImages = swapChain.getImages ();
264263 }
265264
266- static vk::Format chooseSwapSurfaceFormat (const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
267- const auto formatIt = std::ranges::find_if (availableFormats,
268- [](const auto & format) {
269- return format.format == vk::Format::eB8G8R8A8Srgb &&
270- format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear;
271- });
265+ static uint32_t chooseSwapMinImageCount (vk::SurfaceCapabilitiesKHR const & capabilities) {
266+ auto minImageCount = std::max ( 3u , surfaceCapabilities.minImageCount );
267+ if ((0 < surfaceCapabilities.maxImageCount ) && (surfaceCapabilities.maxImageCount < minImageCount) {
268+ minImageCount = surfaceCapabilities.maxImageCount ;
269+ }
270+ return minImageCount;
271+ }
272+
273+ static vk::Format chooseSwapSurfaceFormat (std::vector<vk::SurfaceFormatKHR> const & availableFormats) {
274+ assert (!availableFormats.empty ());
275+ const auto formatIt = std::ranges::find_if (
276+ availableFormats,
277+ []( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
272278 return formatIt != availableFormats.end () ? formatIt->format : availableFormats[0 ].format ;
273279 }
274280
275281 static vk::PresentModeKHR chooseSwapPresentMode (const std::vector<vk::PresentModeKHR>& availablePresentModes) {
282+ assert (std::ranges::any_of (availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; });
276283 return std::ranges::any_of (availablePresentModes,
277284 [](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
278285 }
279286
280287 vk::Extent2D chooseSwapExtent (const vk::SurfaceCapabilitiesKHR& capabilities) {
281- if (capabilities.currentExtent .width != std::numeric_limits< uint32_t >:: max () ) {
288+ if (capabilities.currentExtent .width != 0xFFFFFFFF ) {
282289 return capabilities.currentExtent ;
283290 }
284291 int width, height;
0 commit comments