Skip to content

Commit d234790

Browse files
committed
Carry code adjustments from 02_validation_layers.cpp to all subsequent chapters.
1 parent 6ba6891 commit d234790

33 files changed

Lines changed: 850 additions & 742 deletions

attachments/03_physical_device_selection.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -98,36 +98,38 @@ class HelloTriangleApplication
9898
}
9999

100100
// Check if the required layers are supported by the Vulkan implementation.
101-
auto layerProperties = context.enumerateInstanceLayerProperties();
102-
for (auto const &requiredLayer : requiredLayers)
101+
auto layerProperties = context.enumerateInstanceLayerProperties();
102+
auto unsupportedLayerIt = std::ranges::find_if(requiredLayers,
103+
[&layerProperties](auto const &requiredLayer) {
104+
return std::ranges::none_of(layerProperties,
105+
[requiredLayer](auto const &layerProperty) { return strcmp(layerProperty.layerName, requiredLayer) == 0; });
106+
});
107+
if (unsupportedLayerIt != requiredLayers.end())
103108
{
104-
if (std::ranges::none_of(layerProperties,
105-
[requiredLayer](auto const &layerProperty) { return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
106-
{
107-
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
108-
}
109+
throw std::runtime_error("Required layer not supported: " + std::string(*unsupportedLayerIt));
109110
}
110111

111112
// Get the required extensions.
112-
auto requiredExtensions = getRequiredExtensions();
113+
auto requiredExtensions = getRequiredInstanceExtensions();
113114

114115
// Check if the required extensions are supported by the Vulkan implementation.
115116
auto extensionProperties = context.enumerateInstanceExtensionProperties();
116-
for (auto const &requiredExtension : requiredExtensions)
117+
auto unsupportedPropertyIt =
118+
std::ranges::find_if(requiredExtensions,
119+
[&extensionProperties](auto const &requiredExtension) {
120+
return std::ranges::none_of(extensionProperties,
121+
[requiredExtension](auto const &extensionProperty) { return strcmp(extensionProperty.extensionName, requiredExtension) == 0; });
122+
});
123+
if (unsupportedPropertyIt != requiredExtensions.end())
117124
{
118-
if (std::ranges::none_of(extensionProperties,
119-
[requiredExtension](auto const &extensionProperty) { return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
120-
{
121-
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
122-
}
125+
throw std::runtime_error("Required extension not supported: " + std::string(*unsupportedPropertyIt));
123126
}
124127

125-
vk::InstanceCreateInfo createInfo{
126-
.pApplicationInfo = &appInfo,
127-
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
128-
.ppEnabledLayerNames = requiredLayers.data(),
129-
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
130-
.ppEnabledExtensionNames = requiredExtensions.data()};
128+
vk::InstanceCreateInfo createInfo{.pApplicationInfo = &appInfo,
129+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
130+
.ppEnabledLayerNames = requiredLayers.data(),
131+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
132+
.ppEnabledExtensionNames = requiredExtensions.data()};
131133
instance = vk::raii::Instance(context, createInfo);
132134
}
133135

@@ -136,12 +138,14 @@ class HelloTriangleApplication
136138
if (!enableValidationLayers)
137139
return;
138140

139-
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
140-
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
141-
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{
142-
.messageSeverity = severityFlags,
143-
.messageType = messageTypeFlags,
144-
.pfnUserCallback = &debugCallback};
141+
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose |
142+
vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
143+
vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
144+
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
145+
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
146+
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{.messageSeverity = severityFlags,
147+
.messageType = messageTypeFlags,
148+
.pfnUserCallback = &debugCallback};
145149
debugMessenger = instance.createDebugUtilsMessengerEXT(debugUtilsMessengerCreateInfoEXT);
146150
}
147151

@@ -184,7 +188,7 @@ class HelloTriangleApplication
184188
}
185189
}
186190

187-
std::vector<const char *> getRequiredExtensions()
191+
std::vector<const char *> getRequiredInstanceExtensions()
188192
{
189193
uint32_t glfwExtensionCount = 0;
190194
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);

attachments/04_logical_device.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -103,36 +103,38 @@ class HelloTriangleApplication
103103
}
104104

105105
// Check if the required layers are supported by the Vulkan implementation.
106-
auto layerProperties = context.enumerateInstanceLayerProperties();
107-
for (auto const &requiredLayer : requiredLayers)
106+
auto layerProperties = context.enumerateInstanceLayerProperties();
107+
auto unsupportedLayerIt = std::ranges::find_if(requiredLayers,
108+
[&layerProperties](auto const &requiredLayer) {
109+
return std::ranges::none_of(layerProperties,
110+
[requiredLayer](auto const &layerProperty) { return strcmp(layerProperty.layerName, requiredLayer) == 0; });
111+
});
112+
if (unsupportedLayerIt != requiredLayers.end())
108113
{
109-
if (std::ranges::none_of(layerProperties,
110-
[requiredLayer](auto const &layerProperty) { return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
111-
{
112-
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
113-
}
114+
throw std::runtime_error("Required layer not supported: " + std::string(*unsupportedLayerIt));
114115
}
115116

116117
// Get the required extensions.
117-
auto requiredExtensions = getRequiredExtensions();
118+
auto requiredExtensions = getRequiredInstanceExtensions();
118119

119120
// Check if the required extensions are supported by the Vulkan implementation.
120121
auto extensionProperties = context.enumerateInstanceExtensionProperties();
121-
for (auto const &requiredExtension : requiredExtensions)
122+
auto unsupportedPropertyIt =
123+
std::ranges::find_if(requiredExtensions,
124+
[&extensionProperties](auto const &requiredExtension) {
125+
return std::ranges::none_of(extensionProperties,
126+
[requiredExtension](auto const &extensionProperty) { return strcmp(extensionProperty.extensionName, requiredExtension) == 0; });
127+
});
128+
if (unsupportedPropertyIt != requiredExtensions.end())
122129
{
123-
if (std::ranges::none_of(extensionProperties,
124-
[requiredExtension](auto const &extensionProperty) { return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
125-
{
126-
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
127-
}
130+
throw std::runtime_error("Required extension not supported: " + std::string(*unsupportedPropertyIt));
128131
}
129132

130-
vk::InstanceCreateInfo createInfo{
131-
.pApplicationInfo = &appInfo,
132-
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
133-
.ppEnabledLayerNames = requiredLayers.data(),
134-
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
135-
.ppEnabledExtensionNames = requiredExtensions.data()};
133+
vk::InstanceCreateInfo createInfo{.pApplicationInfo = &appInfo,
134+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
135+
.ppEnabledLayerNames = requiredLayers.data(),
136+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
137+
.ppEnabledExtensionNames = requiredExtensions.data()};
136138
instance = vk::raii::Instance(context, createInfo);
137139
}
138140

@@ -141,12 +143,14 @@ class HelloTriangleApplication
141143
if (!enableValidationLayers)
142144
return;
143145

144-
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
145-
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
146-
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{
147-
.messageSeverity = severityFlags,
148-
.messageType = messageTypeFlags,
149-
.pfnUserCallback = &debugCallback};
146+
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose |
147+
vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
148+
vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
149+
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
150+
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
151+
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{.messageSeverity = severityFlags,
152+
.messageType = messageTypeFlags,
153+
.pfnUserCallback = &debugCallback};
150154
debugMessenger = instance.createDebugUtilsMessengerEXT(debugUtilsMessengerCreateInfoEXT);
151155
}
152156

@@ -220,7 +224,7 @@ class HelloTriangleApplication
220224
graphicsQueue = vk::raii::Queue(device, graphicsIndex, 0);
221225
}
222226

223-
std::vector<const char *> getRequiredExtensions()
227+
std::vector<const char *> getRequiredInstanceExtensions()
224228
{
225229
uint32_t glfwExtensionCount = 0;
226230
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);

attachments/05_window_surface.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -101,36 +101,38 @@ class HelloTriangleApplication
101101
}
102102

103103
// Check if the required layers are supported by the Vulkan implementation.
104-
auto layerProperties = context.enumerateInstanceLayerProperties();
105-
for (auto const &requiredLayer : requiredLayers)
104+
auto layerProperties = context.enumerateInstanceLayerProperties();
105+
auto unsupportedLayerIt = std::ranges::find_if(requiredLayers,
106+
[&layerProperties](auto const &requiredLayer) {
107+
return std::ranges::none_of(layerProperties,
108+
[requiredLayer](auto const &layerProperty) { return strcmp(layerProperty.layerName, requiredLayer) == 0; });
109+
});
110+
if (unsupportedLayerIt != requiredLayers.end())
106111
{
107-
if (std::ranges::none_of(layerProperties,
108-
[requiredLayer](auto const &layerProperty) { return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
109-
{
110-
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
111-
}
112+
throw std::runtime_error("Required layer not supported: " + std::string(*unsupportedLayerIt));
112113
}
113114

114115
// Get the required extensions.
115-
auto requiredExtensions = getRequiredExtensions();
116+
auto requiredExtensions = getRequiredInstanceExtensions();
116117

117118
// Check if the required extensions are supported by the Vulkan implementation.
118119
auto extensionProperties = context.enumerateInstanceExtensionProperties();
119-
for (auto const &requiredExtension : requiredExtensions)
120+
auto unsupportedPropertyIt =
121+
std::ranges::find_if(requiredExtensions,
122+
[&extensionProperties](auto const &requiredExtension) {
123+
return std::ranges::none_of(extensionProperties,
124+
[requiredExtension](auto const &extensionProperty) { return strcmp(extensionProperty.extensionName, requiredExtension) == 0; });
125+
});
126+
if (unsupportedPropertyIt != requiredExtensions.end())
120127
{
121-
if (std::ranges::none_of(extensionProperties,
122-
[requiredExtension](auto const &extensionProperty) { return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
123-
{
124-
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
125-
}
128+
throw std::runtime_error("Required extension not supported: " + std::string(*unsupportedPropertyIt));
126129
}
127130

128-
vk::InstanceCreateInfo createInfo{
129-
.pApplicationInfo = &appInfo,
130-
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
131-
.ppEnabledLayerNames = requiredLayers.data(),
132-
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
133-
.ppEnabledExtensionNames = requiredExtensions.data()};
131+
vk::InstanceCreateInfo createInfo{.pApplicationInfo = &appInfo,
132+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
133+
.ppEnabledLayerNames = requiredLayers.data(),
134+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
135+
.ppEnabledExtensionNames = requiredExtensions.data()};
134136
instance = vk::raii::Instance(context, createInfo);
135137
}
136138

@@ -139,12 +141,14 @@ class HelloTriangleApplication
139141
if (!enableValidationLayers)
140142
return;
141143

142-
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
143-
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
144-
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{
145-
.messageSeverity = severityFlags,
146-
.messageType = messageTypeFlags,
147-
.pfnUserCallback = &debugCallback};
144+
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose |
145+
vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
146+
vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
147+
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
148+
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
149+
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{.messageSeverity = severityFlags,
150+
.messageType = messageTypeFlags,
151+
.pfnUserCallback = &debugCallback};
148152
debugMessenger = instance.createDebugUtilsMessengerEXT(debugUtilsMessengerCreateInfoEXT);
149153
}
150154

@@ -238,7 +242,7 @@ class HelloTriangleApplication
238242
queue = vk::raii::Queue(device, queueIndex, 0);
239243
}
240244

241-
std::vector<const char *> getRequiredExtensions()
245+
std::vector<const char *> getRequiredInstanceExtensions()
242246
{
243247
uint32_t glfwExtensionCount = 0;
244248
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);

0 commit comments

Comments
 (0)