Skip to content

Commit 744c6a4

Browse files
committed
Merge branch 'upstream-main' into intellisense
2 parents bf8ea12 + 7b45d30 commit 744c6a4

File tree

107 files changed

+16095
-593
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+16095
-593
lines changed

.github/workflows/workflow.yml

Lines changed: 333 additions & 60 deletions
Large diffs are not rendered by default.

README.adoc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ The Khronos Vulkan^®^ Tutorial is based on the "link:https://vulkan-tutorial.co
88

99
This repository hosts the contents of the link:https://docs.vulkan.org/tutorial/latest[Khronos Vulkan Tutorial]. The tutorial is part of the link:https://github.com/KhronosGroup/Vulkan-Site[Vulkan Documentation Project].
1010

11+
== Differences
12+
13+
Compared to the original tutorial, this version of the tutorial is teaching up-to-date concepts:
14+
15+
* Vulkan 1.4 as a baseline
16+
* Dynamic rendering instead of render passes
17+
* Timeline semaphores
18+
* link:https://shader-slang.org/[Slang] as the primary shading language
19+
* Modern C++ (20) with modules
20+
* link:https://github.com/KhronosGroup/Vulkan-Hpp[Vulkan-Hpp] with link:https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization[RAII]
21+
22+
It also contains Vulkan usage clarifications, improved synchronization and new content.
23+
1124
== Project Structure
1225

1326
The repository is organized into several important directories:

antora/modules/ROOT/nav.adoc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,10 @@
4646
* xref:09_Generating_Mipmaps.adoc[Generating Mipmaps]
4747
* xref:10_Multisampling.adoc[Multisampling]
4848
* xref:11_Compute_Shader.adoc[Compute Shader]
49-
* xref:90_FAQ.adoc[FAQ]
49+
* xref:12_Ecosystem_Utilities_and_Compatibility.adoc[Ecosystem Utilities and GPU Compatibility]
50+
* xref:13_Vulkan_Profiles.adoc[Vulkan Profiles]
51+
* xref:14_Android.adoc[Android]
52+
* xref:15_GLTF_KTX2_Migration.adoc[Migrating to Modern Asset Formats: glTF and KTX2]
53+
* xref:16_Multiple_Objects.adoc[Rendering Multiple Objects]
54+
* xref:17_Multithreading.adoc[Multithreading]
55+
* xref:90_FAQ.adoc[FAQ]

attachments/00_base_code.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ class HelloTriangleApplication {
5353
};
5454

5555
int main() {
56-
HelloTriangleApplication app{};
57-
5856
try {
57+
HelloTriangleApplication app;
5958
app.run();
6059
} catch (const std::exception& e) {
6160
std::cerr << e.what() << std::endl;

attachments/03_physical_device_selection.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class HelloTriangleApplication {
171171

172172
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
173173
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
174-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
174+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
175175

176176
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
177177
} );

attachments/04_logical_device.cpp

Lines changed: 17 additions & 14 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>
@@ -175,7 +176,7 @@ class HelloTriangleApplication {
175176

176177
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
177178
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
178-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
179+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
179180

180181
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
181182
} );
@@ -196,25 +197,27 @@ class HelloTriangleApplication {
196197
// get the first index into queueFamilyProperties which supports graphics
197198
auto graphicsQueueFamilyProperty = std::ranges::find_if( queueFamilyProperties, []( auto const & qfp )
198199
{ return (qfp.queueFlags & vk::QueueFlagBits::eGraphics) != static_cast<vk::QueueFlags>(0); } );
200+
assert(graphicsQueueFamilyProperty != queueFamilyProperties.end() && "No graphics queue family found!");
199201

200202
auto graphicsIndex = static_cast<uint32_t>( std::distance( queueFamilyProperties.begin(), graphicsQueueFamilyProperty ) );
201203

202204
// query for Vulkan 1.3 features
203-
auto features = physicalDevice.getFeatures2();
204-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
205-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
206-
vulkan13Features.dynamicRendering = vk::True;
207-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
208-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
209-
features.pNext = &vulkan13Features;
205+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
206+
{}, // vk::PhysicalDeviceFeatures2
207+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
208+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
209+
};
210+
210211
// create a Device
211212
float queuePriority = 0.0f;
212-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
213-
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &deviceQueueCreateInfo };
214-
deviceCreateInfo.enabledExtensionCount = requiredDeviceExtension.size();
215-
deviceCreateInfo.ppEnabledExtensionNames = requiredDeviceExtension.data();
216-
217-
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
213+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
214+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
215+
.queueCreateInfoCount = 1,
216+
.pQueueCreateInfos = &deviceQueueCreateInfo,
217+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
218+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
219+
220+
device = vk::raii::Device(physicalDevice, deviceCreateInfo);
218221
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );
219222
}
220223

attachments/05_window_surface.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ class HelloTriangleApplication {
186186

187187
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
188188
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
189-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
189+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
190190

191191
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
192192
} );
@@ -249,19 +249,20 @@ class HelloTriangleApplication {
249249
}
250250

251251
// query for Vulkan 1.3 features
252-
auto features = physicalDevice.getFeatures2();
253-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
254-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
255-
vulkan13Features.dynamicRendering = vk::True;
256-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
257-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
258-
features.pNext = &vulkan13Features;
252+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
253+
{}, // vk::PhysicalDeviceFeatures2
254+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
255+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
256+
};
257+
259258
// create a Device
260259
float queuePriority = 0.0f;
261-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
262-
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &deviceQueueCreateInfo };
263-
deviceCreateInfo.enabledExtensionCount = requiredDeviceExtension.size();
264-
deviceCreateInfo.ppEnabledExtensionNames = requiredDeviceExtension.data();
260+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
261+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
262+
.queueCreateInfoCount = 1,
263+
.pQueueCreateInfos = &deviceQueueCreateInfo,
264+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
265+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
265266

266267
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
267268
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );

attachments/06_swap_chain_creation.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ class HelloTriangleApplication {
194194

195195
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
196196
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
197-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
197+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
198198

199199
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
200200
} );
@@ -257,23 +257,20 @@ class HelloTriangleApplication {
257257
}
258258

259259
// query for Vulkan 1.3 features
260-
auto features = physicalDevice.getFeatures2();
261-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
262-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
263-
vulkan13Features.dynamicRendering = vk::True;
264-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
265-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
266-
features.pNext = &vulkan13Features;
260+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
261+
{}, // vk::PhysicalDeviceFeatures2
262+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
263+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
264+
};
265+
267266
// create a Device
268267
float queuePriority = 0.0f;
269-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
270-
vk::DeviceCreateInfo deviceCreateInfo{
271-
.pNext = &features,
272-
.queueCreateInfoCount = 1,
273-
.pQueueCreateInfos = &deviceQueueCreateInfo,
274-
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
275-
.ppEnabledExtensionNames = requiredDeviceExtension.data()
276-
};
268+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
269+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
270+
.queueCreateInfoCount = 1,
271+
.pQueueCreateInfos = &deviceQueueCreateInfo,
272+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
273+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
277274

278275
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
279276
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );
@@ -300,7 +297,12 @@ class HelloTriangleApplication {
300297
}
301298

302299
static vk::Format chooseSwapSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
303-
return ( availableFormats[0].format == vk::Format::eUndefined ) ? vk::Format::eB8G8R8A8Unorm : availableFormats[0].format;
300+
const auto formatIt = std::ranges::find_if(availableFormats,
301+
[](const auto& format) {
302+
return format.format == vk::Format::eB8G8R8A8Srgb &&
303+
format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear;
304+
});
305+
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
304306
}
305307

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

attachments/07_image_views.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ class HelloTriangleApplication {
195195

196196
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
197197
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
198-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
198+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
199199

200200
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
201201
} );
@@ -258,23 +258,20 @@ class HelloTriangleApplication {
258258
}
259259

260260
// query for Vulkan 1.3 features
261-
auto features = physicalDevice.getFeatures2();
262-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
263-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
264-
vulkan13Features.dynamicRendering = vk::True;
265-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
266-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
267-
features.pNext = &vulkan13Features;
261+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
262+
{}, // vk::PhysicalDeviceFeatures2
263+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
264+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
265+
};
266+
268267
// create a Device
269268
float queuePriority = 0.0f;
270-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
271-
vk::DeviceCreateInfo deviceCreateInfo{
272-
.pNext = &features,
273-
.queueCreateInfoCount = 1,
274-
.pQueueCreateInfos = &deviceQueueCreateInfo,
275-
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
276-
.ppEnabledExtensionNames = requiredDeviceExtension.data()
277-
};
269+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
270+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
271+
.queueCreateInfoCount = 1,
272+
.pQueueCreateInfos = &deviceQueueCreateInfo,
273+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
274+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
278275

279276
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
280277
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );
@@ -313,7 +310,12 @@ class HelloTriangleApplication {
313310
}
314311

315312
static vk::Format chooseSwapSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& availableFormats) {
316-
return ( availableFormats[0].format == vk::Format::eUndefined ) ? vk::Format::eB8G8R8A8Unorm : availableFormats[0].format;
313+
const auto formatIt = std::ranges::find_if(availableFormats,
314+
[](const auto& format) {
315+
return format.format == vk::Format::eB8G8R8A8Srgb &&
316+
format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear;
317+
});
318+
return formatIt != availableFormats.end() ? formatIt->format : availableFormats[0].format;
317319
}
318320

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

0 commit comments

Comments
 (0)