Skip to content

Commit 0c554f3

Browse files
committed
Carried changes over to all chapters.
1 parent 399bade commit 0c554f3

30 files changed

+1076
-846
lines changed

attachments/06_swap_chain_creation.cpp

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class HelloTriangleApplication {
5252
vk::raii::Queue queue = nullptr;
5353
vk::raii::SwapchainKHR swapChain = nullptr;
5454
std::vector<vk::Image> swapChainImages;
55-
vk::Format swapChainImageFormat = vk::Format::eUndefined;
55+
vk::SurfaceFormatKHR swapChainSurfaceFormat;
5656
vk::Extent2D swapChainExtent;
5757
std::vector<vk::raii::ImageView> swapChainImageViews;
5858

@@ -245,19 +245,20 @@ class HelloTriangleApplication {
245245
}
246246

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

262263
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
263264
swapChainImages = swapChain.getImages();
@@ -271,12 +272,12 @@ class HelloTriangleApplication {
271272
return minImageCount;
272273
}
273274

274-
static vk::Format chooseSwapSurfaceFormat(std::vector<vk::SurfaceFormatKHR> const & availableFormats) {
275+
static vk::SurfaceFormatKHR chooseSwapSurfaceFormat(std::vector<vk::SurfaceFormatKHR> const & availableFormats) {
275276
assert(!availableFormats.empty());
276277
const auto formatIt = std::ranges::find_if(
277278
availableFormats,
278279
[]( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
279-
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
280+
return formatIt != availableFormats.end() ? *formatIt : availableFormats[0];
280281
}
281282

282283
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {

attachments/07_image_views.cpp

Lines changed: 35 additions & 26 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,20 @@ class HelloTriangleApplication {
246246
}
247247

248248
void createSwapChain() {
249+
swapChainSurfaceFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( surface ) );
249250
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 };
251+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = surface,
252+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
253+
.imageFormat = swapChainSurfaceFormat.format,
254+
.imageColorSpace = swapChainSurfaceFormat.colorSpace,
255+
.imageExtent = chooseSwapExtent( surfaceCapabilities ),
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 };
262263

263264
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
264265
swapChainImages = swapChain.getImages();
@@ -267,7 +268,7 @@ class HelloTriangleApplication {
267268
void createImageViews() {
268269
swapChainImageViews.clear();
269270

270-
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainImageFormat,
271+
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainSurfaceFormat.format,
271272
.subresourceRange = { vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 } };
272273
for ( auto image : swapChainImages )
273274
{
@@ -276,22 +277,30 @@ class HelloTriangleApplication {
276277
}
277278
}
278279

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

288296
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
297+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
289298
return std::ranges::any_of(availablePresentModes,
290299
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291300
}
292301

293302
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
294-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
303+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
295304
return capabilities.currentExtent;
296305
}
297306
int width, height;

attachments/08_graphics_pipeline.cpp

Lines changed: 35 additions & 26 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,20 @@ class HelloTriangleApplication {
247247
}
248248

249249
void createSwapChain() {
250+
swapChainSurfaceFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( surface ) );
250251
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 };
252+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = surface,
253+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
254+
.imageFormat = swapChainSurfaceFormat.format,
255+
.imageColorSpace = swapChainSurfaceFormat.colorSpace,
256+
.imageExtent = chooseSwapExtent( surfaceCapabilities ),
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 };
263264

264265
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
265266
swapChainImages = swapChain.getImages();
@@ -268,7 +269,7 @@ class HelloTriangleApplication {
268269
void createImageViews() {
269270
swapChainImageViews.clear();
270271

271-
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainImageFormat,
272+
vk::ImageViewCreateInfo imageViewCreateInfo{ .viewType = vk::ImageViewType::e2D, .format = swapChainSurfaceFormat.format,
272273
.subresourceRange = { vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 } };
273274
for ( auto image : swapChainImages )
274275
{
@@ -281,22 +282,30 @@ class HelloTriangleApplication {
281282

282283
}
283284

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

293301
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
302+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
294303
return std::ranges::any_of(availablePresentModes,
295304
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
296305
}
297306

298307
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
299-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
308+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
300309
return capabilities.currentExtent;
301310
}
302311
int width, height;

0 commit comments

Comments
 (0)