Skip to content

Commit 5fd9aa7

Browse files
committed
Carried changes over to all chapters.
1 parent 399bade commit 5fd9aa7

29 files changed

+919
-705
lines changed

attachments/07_image_views.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <assert>
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 = {
@@ -246,19 +246,19 @@ 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+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = surface,
251+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
252+
.imageFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( surface ) ),
253+
.imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
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 };
262262

263263
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
264264
swapChainImages = swapChain.getImages();
@@ -276,22 +276,30 @@ class HelloTriangleApplication {
276276
}
277277
}
278278

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

288295
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
296+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
289297
return std::ranges::any_of(availablePresentModes,
290298
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291299
}
292300

293301
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
294-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
302+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
295303
return capabilities.currentExtent;
296304
}
297305
int width, height;

attachments/08_graphics_pipeline.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <assert>
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 = {
@@ -247,19 +247,19 @@ 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+
vk::SwapchainCreateInfoKHR swapChainCreateInfo{ .surface = surface,
252+
.minImageCount = chooseSwapMinImageCount( surfaceCapabilities ),
253+
.imageFormat = chooseSwapSurfaceFormat( physicalDevice.getSurfaceFormatsKHR( surface ) ),
254+
.imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear,
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 };
263263

264264
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
265265
swapChainImages = swapChain.getImages();
@@ -281,22 +281,30 @@ class HelloTriangleApplication {
281281

282282
}
283283

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

293300
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
301+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
294302
return std::ranges::any_of(availablePresentModes,
295303
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
296304
}
297305

298306
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
299-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
307+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
300308
return capabilities.currentExtent;
301309
}
302310
int width, height;

attachments/09_shader_modules.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <assert>
12
#include <iostream>
23
#include <fstream>
34
#include <stdexcept>
@@ -50,11 +51,10 @@ class HelloTriangleApplication {
5051
vk::raii::PhysicalDevice physicalDevice = nullptr;
5152
vk::raii::Device device = nullptr;
5253
vk::raii::Queue queue = nullptr;
53-
54-
vk::raii::SwapchainKHR swapChain = nullptr;
55-
std::vector<vk::Image> swapChainImages;
56-
vk::Format swapChainImageFormat = vk::Format::eUndefined;
57-
vk::Extent2D swapChainExtent;
54+
vk::raii::SwapchainKHR swapChain = nullptr;
55+
std::vector<vk::Image> swapChainImages;
56+
vk::Format swapChainImageFormat = vk::Format::eUndefined;
57+
vk::Extent2D swapChainExtent;
5858
std::vector<vk::raii::ImageView> swapChainImageViews;
5959

6060
std::vector<const char*> requiredDeviceExtension = {
@@ -248,19 +248,19 @@ class HelloTriangleApplication {
248248
}
249249

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

265265
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
266266
swapChainImages = swapChain.getImages();
@@ -293,22 +293,30 @@ class HelloTriangleApplication {
293293
return shaderModule;
294294
}
295295

296+
static uint32_t chooseSwapMinImageCount(vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
297+
auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount );
298+
if ((0 < surfaceCapabilities.maxImageCount) && (surfaceCapabilities.maxImageCount < minImageCount)) {
299+
minImageCount = surfaceCapabilities.maxImageCount;
300+
}
301+
return minImageCount;
302+
}
303+
296304
static vk::Format chooseSwapSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
297-
const auto formatIt = std::ranges::find_if(availableFormats,
298-
[](const auto& format) {
299-
return format.format == vk::Format::eB8G8R8A8Srgb &&
300-
format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear;
301-
});
305+
assert(!availableFormats.empty());
306+
const auto formatIt = std::ranges::find_if(
307+
availableFormats,
308+
[]( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
302309
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
303310
}
304311

305312
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
313+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
306314
return std::ranges::any_of(availablePresentModes,
307315
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
308316
}
309317

310318
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
311-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
319+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
312320
return capabilities.currentExtent;
313321
}
314322
int width, height;

0 commit comments

Comments
 (0)