Skip to content

Commit 540cfe0

Browse files
committed
Carried changes over to all chapters.
1 parent 399bade commit 540cfe0

29 files changed

+890
-705
lines changed

attachments/07_image_views.cpp

Lines changed: 31 additions & 24 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 = {
@@ -246,19 +245,19 @@ class HelloTriangleApplication {
246245
}
247246

248247
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 };
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 };
262261

263262
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
264263
swapChainImages = swapChain.getImages();
@@ -276,22 +275,30 @@ class HelloTriangleApplication {
276275
}
277276
}
278277

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

288294
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
295+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
289296
return std::ranges::any_of(availablePresentModes,
290297
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
291298
}
292299

293300
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
294-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
301+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
295302
return capabilities.currentExtent;
296303
}
297304
int width, height;

attachments/08_graphics_pipeline.cpp

Lines changed: 31 additions & 24 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 = {
@@ -247,19 +246,19 @@ class HelloTriangleApplication {
247246
}
248247

249248
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 };
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 };
263262

264263
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
265264
swapChainImages = swapChain.getImages();
@@ -281,22 +280,30 @@ class HelloTriangleApplication {
281280

282281
}
283282

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

293299
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
300+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
294301
return std::ranges::any_of(availablePresentModes,
295302
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
296303
}
297304

298305
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
299-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
306+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
300307
return capabilities.currentExtent;
301308
}
302309
int width, height;

attachments/09_shader_modules.cpp

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ class HelloTriangleApplication {
5050
vk::raii::PhysicalDevice physicalDevice = nullptr;
5151
vk::raii::Device device = nullptr;
5252
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;
53+
vk::raii::SwapchainKHR swapChain = nullptr;
54+
std::vector<vk::Image> swapChainImages;
55+
vk::Format swapChainImageFormat = vk::Format::eUndefined;
56+
vk::Extent2D swapChainExtent;
5857
std::vector<vk::raii::ImageView> swapChainImageViews;
5958

6059
std::vector<const char*> requiredDeviceExtension = {
@@ -248,19 +247,19 @@ class HelloTriangleApplication {
248247
}
249248

250249
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 };
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 };
264263

265264
swapChain = vk::raii::SwapchainKHR( device, swapChainCreateInfo );
266265
swapChainImages = swapChain.getImages();
@@ -293,22 +292,30 @@ class HelloTriangleApplication {
293292
return shaderModule;
294293
}
295294

295+
static uint32_t chooseSwapMinImageCount(vk::SurfaceCapabilitiesKHR const & surfaceCapabilities) {
296+
auto minImageCount = std::max( 3u, surfaceCapabilities.minImageCount );
297+
if ((0 < surfaceCapabilities.maxImageCount) && (surfaceCapabilities.maxImageCount < minImageCount)) {
298+
minImageCount = surfaceCapabilities.maxImageCount;
299+
}
300+
return minImageCount;
301+
}
302+
296303
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-
});
304+
assert(!availableFormats.empty());
305+
const auto formatIt = std::ranges::find_if(
306+
availableFormats,
307+
[]( const auto & format ) { return format.format == vk::Format::eB8G8R8A8Srgb && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; } );
302308
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
303309
}
304310

305311
static vk::PresentModeKHR chooseSwapPresentMode(const std::vector<vk::PresentModeKHR>& availablePresentModes) {
312+
assert(std::ranges::any_of(availablePresentModes, [](auto presentMode){ return presentMode == vk::PresentMode::eFifo; }));
306313
return std::ranges::any_of(availablePresentModes,
307314
[](const vk::PresentModeKHR value) { return vk::PresentModeKHR::eMailbox == value; } ) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo;
308315
}
309316

310317
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities) {
311-
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
318+
if (capabilities.currentExtent.width != 0xFFFFFFFF) {
312319
return capabilities.currentExtent;
313320
}
314321
int width, height;

0 commit comments

Comments
 (0)