Skip to content

Commit ec63815

Browse files
committed
Minor cleanup on swapchain creation
1 parent 01ab96a commit ec63815

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

attachments/06_swap_chain_creation.cpp

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <assert.h>
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 = {
@@ -245,40 +245,48 @@ class HelloTriangleApplication {
245245
}
246246

247247
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 };
261261

262262
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
263263
swapChainImages = swapChain.getImages();
264264
}
265265

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; } );
272279
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
273280
}
274281

275282
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
283+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
276284
return std::ranges::any_of(availablePresentModes,
277285
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
278286
}
279287

280288
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
281-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
289+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
282290
return capabilities.currentExtent;
283291
}
284292
int width, height;

0 commit comments

Comments
 (0)