|
| 1 | +#include <assert.h> |
1 | 2 | #include <iostream> |
2 | 3 | #include <stdexcept> |
3 | 4 | #include <vector> |
@@ -49,11 +50,10 @@ class HelloTriangleApplication { |
49 | 50 | vk::raii::PhysicalDevice physicalDevice = nullptr; |
50 | 51 | vk::raii::Device device = nullptr; |
51 | 52 | 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; |
57 | 57 | std::vector<vk::raii::ImageView> swapChainImageViews; |
58 | 58 |
|
59 | 59 | std::vector<const char*> requiredDeviceExtension = { |
@@ -245,40 +245,48 @@ class HelloTriangleApplication { |
245 | 245 | } |
246 | 246 |
|
247 | 247 | 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 }; |
| 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 }; |
261 | 261 |
|
262 | 262 | swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo ); |
263 | 263 | swapChainImages = swapChain.getImages(); |
264 | 264 | } |
265 | 265 |
|
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 | | - }); |
| 266 | + static uint32_t chooseSwapMinImageCount(vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) { |
| 267 | + auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount ); |
| 268 | + if ((0 < surfaceCapabilities.maxImageCount) && (surfaceCapabilities.maxImageCount < minImageCount)) { |
| 269 | + minImageCount = surfaceCapabilities.maxImageCount; |
| 270 | + } |
| 271 | + return minImageCount; |
| 272 | + } |
| 273 | + |
| 274 | + static vk::Format chooseSwapSurfaceFormat(std::vector<vk::SurfaceFormatKHR> const & availableFormats) { |
| 275 | + assert(!availableFormats.empty()); |
| 276 | + const auto formatIt = std::ranges::find_if( |
| 277 | + availableFormats, |
| 278 | + []( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } ); |
272 | 279 | return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format; |
273 | 280 | } |
274 | 281 |
|
275 | 282 | static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) { |
| 283 | + assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; })); |
276 | 284 | return std::ranges::any_of(availablePresentModes, |
277 | 285 | [](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo; |
278 | 286 | } |
279 | 287 |
|
280 | 288 | vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) { |
281 | | - if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) { |
| 289 | + if (capabilities.currentExtent.width != 0xFFFFFFFF) { |
282 | 290 | return capabilities.currentExtent; |
283 | 291 | } |
284 | 292 | int width, height; |
|
0 commit comments