Skip to content

Commit 284e1ec

Browse files
authored
Merge branch 'main' into address-resize-issue-73
2 parents e37bb22 + afa478c commit 284e1ec

31 files changed

+1153
-887
lines changed

attachments/06_swap_chain_creation.cpp

Lines changed: 36 additions & 26 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::SurfaceFormatKHR swapChainSurfaceFormat;
56+
vk::Extent2D swapChainExtent;
5757
std::vector<vk::raii::ImageView> swapChainImageViews;
5858

5959
std::vector<const char*> requiredDeviceExtension = {
@@ -245,40 +245,50 @@ 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+
swapChainExtent = chooseSwapExtent( surfaceCapabilities );
250+
swapChainSurfaceFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( *surface ) );
251+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = *surface,
252+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
253+
.imageFormat = swapChainSurfaceFormat.format,
254+
.imageColorSpace = swapChainSurfaceFormat.colorSpace,
255+
.imageExtent = swapChainExtent,
256+
.imageArrayLayers = 1,
257+
.imageUsage = vk::ImageUsageFlagBits::eColorAttachment,
258+
.imageSharingMode = vk::SharingMode::eExclusive,
259+
.preTransform = surfaceCapabilities.currentTransform,
260+
.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
261+
.presentMode = chooseSwapPresentMode( physicalDevice.getSurfacePresentModesKHR( *surface ) ),
262+
.clipped = true };
261263

262264
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
263265
swapChainImages = swapChain.getImages();
264266
}
265267

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-
});
272-
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
268+
static uint32_t chooseSwapMinImageCount(vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
269+
auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount );
270+
if ((0 < surfaceCapabilities.maxImageCount) && (surfaceCapabilities.maxImageCount < minImageCount)) {
271+
minImageCount = surfaceCapabilities.maxImageCount;
272+
}
273+
return minImageCount;
274+
}
275+
276+
static vk::SurfaceFormatKHR chooseSwapSurfaceFormat(std::vector<vk::SurfaceFormatKHR> const & availableFormats) {
277+
assert(!availableFormats.empty());
278+
const auto formatIt = std::ranges::find_if(
279+
availableFormats,
280+
[]( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
281+
return formatIt != availableFormats.end() ? *formatIt : availableFormats[0];
273282
}
274283

275284
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
285+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentModeKHR::eFifo; }));
276286
return std::ranges::any_of(availablePresentModes,
277287
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
278288
}
279289

280290
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
281-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
291+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
282292
return capabilities.currentExtent;
283293
}
284294
int width, height;

attachments/07_image_views.cpp

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <memory>
77
#include <algorithm>
88
#include <limits>
9+
#include <assert.h>
910

1011
#ifdef __INTELLISENSE__
1112
#include <vulkan/vulkan_raii.hpp>
@@ -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::SurfaceFormatKHR swapChainSurfaceFormat;
56+
vk::Extent2D swapChainExtent;
5757
std::vector<vk::raii::ImageView> swapChainImageViews;
5858

5959
std::vector<const char*> requiredDeviceExtension = {
@@ -246,19 +246,21 @@ class HelloTriangleApplication {
246246
}
247247

248248
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 };
249+
auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR( *surface );
250+
swapChainExtent = chooseSwapExtent( surfaceCapabilities );
251+
swapChainSurfaceFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( *surface ) );
252+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = *surface,
253+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
254+
.imageFormat = swapChainSurfaceFormat.format,
255+
.imageColorSpace = swapChainSurfaceFormat.colorSpace,
256+
.imageExtent = swapChainExtent,
257+
.imageArrayLayers = 1,
258+
.imageUsage = vk::ImageUsageFlagBits::eColorAttachment,
259+
.imageSharingMode = vk::SharingMode::eExclusive,
260+
.preTransform = surfaceCapabilities.currentTransform,
261+
.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
262+
.presentMode = chooseSwapPresentMode( physicalDevice.getSurfacePresentModesKHR( *surface ) ),
263+
.clipped = true };
262264

263265
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
264266
swapChainImages = swapChain.getImages();
@@ -267,7 +269,7 @@ class HelloTriangleApplication {
267269
void createImageViews() {
268270
swapChainImageViews.clear();
269271

270-
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainImageFormat,
272+
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainSurfaceFormat.format,
271273
.subresourceRange = { vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 } };
272274
for ( auto image : swapChainImages )
273275
{
@@ -276,22 +278,30 @@ class HelloTriangleApplication {
276278
}
277279
}
278280

279-
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-
});
285-
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
281+
static uint32_t chooseSwapMinImageCount(vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
282+
auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount );
283+
if ((0 < surfaceCapabilities.maxImageCount) && (surfaceCapabilities.maxImageCount < minImageCount)) {
284+
minImageCount = surfaceCapabilities.maxImageCount;
285+
}
286+
return minImageCount;
287+
}
288+
289+
static vk::SurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
290+
assert(!availableFormats.empty());
291+
const auto formatIt = std::ranges::find_if(
292+
availableFormats,
293+
[]( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
294+
return formatIt != availableFormats.end() ? *formatIt : availableFormats[0];
286295
}
287296

288297
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
298+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentModeKHR::eFifo; }));
289299
return std::ranges::any_of(availablePresentModes,
290300
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291301
}
292302

293303
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
294-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
304+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
295305
return capabilities.currentExtent;
296306
}
297307
int width, height;

attachments/08_graphics_pipeline.cpp

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <memory>
77
#include <algorithm>
88
#include <limits>
9+
#include <assert.h>
910

1011
#ifdef __INTELLISENSE__
1112
#include <vulkan/vulkan_raii.hpp>
@@ -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::SurfaceFormatKHR swapChainSurfaceFormat;
56+
vk::Extent2D swapChainExtent;
5757
std::vector<vk::raii::ImageView> swapChainImageViews;
5858

5959
std::vector<const char*> requiredDeviceExtension = {
@@ -247,19 +247,21 @@ class HelloTriangleApplication {
247247
}
248248

249249
void createSwapChain() {
250-
auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR( surface );
251-
swapChainImageFormat = chooseSwapSurfaceFormat(physicalDevice.getSurfaceFormatsKHR( surface ));
252-
swapChainExtent = chooseSwapExtent(surfaceCapabilities);
253-
auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount );
254-
minImageCount = ( surfaceCapabilities.maxImageCount > 0 && minImageCount > surfaceCapabilities.maxImageCount ) ? surfaceCapabilities.maxImageCount : minImageCount;
255-
vk::SwapchainCreateInfoKHR swapChainCreateInfo{
256-
.surface = surface, .minImageCount = minImageCount,
257-
.imageFormat = swapChainImageFormat, .imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
258-
.imageExtent = swapChainExtent, .imageArrayLayers =1,
259-
.imageUsage = vk::ImageUsageFlagBits::eColorAttachment, .imageSharingMode = vk::SharingMode::eExclusive,
260-
.preTransform = surfaceCapabilities.currentTransform, .compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
261-
.presentMode = chooseSwapPresentMode(physicalDevice.getSurfacePresentModesKHR( surface )),
262-
.clipped = true };
250+
auto surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR( *surface );
251+
swapChainExtent = chooseSwapExtent( surfaceCapabilities );
252+
swapChainSurfaceFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( *surface ) );
253+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = *surface,
254+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
255+
.imageFormat = swapChainSurfaceFormat.format,
256+
.imageColorSpace = swapChainSurfaceFormat.colorSpace,
257+
.imageExtent = swapChainExtent,
258+
.imageArrayLayers = 1,
259+
.imageUsage = vk::ImageUsageFlagBits::eColorAttachment,
260+
.imageSharingMode = vk::SharingMode::eExclusive,
261+
.preTransform = surfaceCapabilities.currentTransform,
262+
.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque,
263+
.presentMode = chooseSwapPresentMode( physicalDevice.getSurfacePresentModesKHR( *surface ) ),
264+
.clipped = true };
263265

264266
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
265267
swapChainImages = swapChain.getImages();
@@ -268,7 +270,7 @@ class HelloTriangleApplication {
268270
void createImageViews() {
269271
swapChainImageViews.clear();
270272

271-
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainImageFormat,
273+
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainSurfaceFormat.format,
272274
.subresourceRange = { vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 } };
273275
for ( auto image : swapChainImages )
274276
{
@@ -281,22 +283,30 @@ class HelloTriangleApplication {
281283

282284
}
283285

284-
static vk::Format chooseSwapSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
285-
const auto formatIt = std::ranges::find_if(availableFormats,
286-
[](const auto& format) {
287-
return format.format == vk::Format::eB8G8R8A8Srgb &&
288-
format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear;
289-
});
290-
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
286+
static uint32_t chooseSwapMinImageCount(vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
287+
auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount );
288+
if ((0 < surfaceCapabilities.maxImageCount) && (surfaceCapabilities.maxImageCount < minImageCount)) {
289+
minImageCount = surfaceCapabilities.maxImageCount;
290+
}
291+
return minImageCount;
292+
}
293+
294+
static vk::SurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
295+
assert(!availableFormats.empty());
296+
const auto formatIt = std::ranges::find_if(
297+
availableFormats,
298+
[]( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
299+
return formatIt != availableFormats.end() ? *formatIt : availableFormats[0];
291300
}
292301

293302
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
303+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentModeKHR::eFifo; }));
294304
return std::ranges::any_of(availablePresentModes,
295305
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
296306
}
297307

298308
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
299-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
309+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
300310
return capabilities.currentExtent;
301311
}
302312
int width, height;

0 commit comments

Comments
 (0)