Skip to content

Commit 52f7598

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

File tree

1 file changed

+32
-25
lines changed

1 file changed

+32
-25
lines changed

attachments/06_swap_chain_creation.cpp

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)