Skip to content

Commit a609649

Browse files
committed
Carried layer and extension handling on instance creation over to all sources.
1 parent 5cd2086 commit a609649

28 files changed

+971
-600
lines changed

attachments/02_validation_layers.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,6 @@ class HelloTriangleApplication {
133133
uint32_t glfwExtensionCount = 0;
134134
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
135135

136-
std::vector<vk::ExtensionProperties> props = context.enumerateInstanceExtensionProperties();
137-
if (const auto propsIterator = std::ranges::find_if(props, []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, vk::EXTDebugUtilsExtensionName ) == 0; } ); propsIterator == props.end() )
138-
{
139-
std::cout << "Something went very wrong, cannot find VK_EXT_debug_utils extension" << std::endl;
140-
exit( 1 );
141-
}
142136
std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
143137
if (enableValidationLayers) {
144138
extensions.push_back(vk::EXTDebugUtilsExtensionName );

attachments/03_physical_device_selection.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,51 @@ class HelloTriangleApplication {
7878
}
7979

8080
void createInstance() {
81-
if (enableValidationLayers && !checkValidationLayerSupport()) {
82-
throw std::runtime_error("validation layers requested, but not available!");
83-
}
84-
8581
constexpr vk::ApplicationInfo appInfo{ .pApplicationName = "Hello Triangle",
8682
.applicationVersion = VK_MAKE_VERSION( 1, 0, 0 ),
8783
.pEngineName = "No Engine",
8884
.engineVersion = VK_MAKE_VERSION( 1, 0, 0 ),
8985
.apiVersion = vk::ApiVersion14 };
90-
auto extensions = getRequiredExtensions();
91-
std::vector<char const *> enabledLayers;
86+
87+
// Get the required layers
88+
std::vector<char const*> requiredLayers;
9289
if (enableValidationLayers) {
93-
enabledLayers.assign(validationLayers.begin(), validationLayers.end());
90+
requiredLayers.assign(validationLayers.begin(), validationLayers.end());
91+
}
92+
93+
// Check if the required layers are supported by the Vulkan implementation.
94+
auto layerProperties = context.enumerateInstanceLayerProperties();
95+
for (auto const& requiredLayer : requiredLayers)
96+
{
97+
if (std::ranges::none_of(layerProperties,
98+
[requiredLayer](auto const& layerProperty)
99+
{ return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
100+
{
101+
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
102+
}
94103
}
104+
105+
// Get the required extensions.
106+
auto requiredExtensions = getRequiredExtensions();
107+
108+
// Check if the required extensions are supported by the Vulkan implementation.
109+
auto extensionProperties = context.enumerateInstanceExtensionProperties();
110+
for (auto const& requiredExtension : requiredExtensions)
111+
{
112+
if (std::ranges::none_of(extensionProperties,
113+
[requiredExtension](auto const& extensionProperty)
114+
{ return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
115+
{
116+
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
117+
}
118+
}
119+
95120
vk::InstanceCreateInfo createInfo{
96121
.pApplicationInfo = &appInfo,
97-
.enabledLayerCount = static_cast<uint32_t>(enabledLayers.size()),
98-
.ppEnabledLayerNames = enabledLayers.data(),
99-
.enabledExtensionCount = static_cast<uint32_t>(extensions.size()),
100-
.ppEnabledExtensionNames = extensions.data() };
122+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
123+
.ppEnabledLayerNames = requiredLayers.data(),
124+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
125+
.ppEnabledExtensionNames = requiredExtensions.data() };
101126
instance = vk::raii::Instance(context, createInfo);
102127
}
103128

@@ -159,12 +184,6 @@ class HelloTriangleApplication {
159184
uint32_t glfwExtensionCount = 0;
160185
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
161186

162-
std::vector<vk::ExtensionProperties> props = context.enumerateInstanceExtensionProperties();
163-
if (const auto propsIterator = std::ranges::find_if(props, []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, vk::EXTDebugUtilsExtensionName ) == 0; } ); propsIterator == props.end() )
164-
{
165-
std::cout << "Something went very wrong, cannot find VK_EXT_debug_utils extension" << std::endl;
166-
exit( 1 );
167-
}
168187
std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
169188
if (enableValidationLayers) {
170189
extensions.push_back(vk::EXTDebugUtilsExtensionName );
@@ -173,11 +192,6 @@ class HelloTriangleApplication {
173192
return extensions;
174193
}
175194

176-
bool checkValidationLayerSupport() {
177-
return (std::ranges::any_of(context.enumerateInstanceLayerProperties(),
178-
[]( vk::LayerProperties const & lp ) { return ( strcmp( "VK_LAYER_KHRONOS_validation", lp.layerName ) == 0 ); } ) );
179-
}
180-
181195
static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT* pCallbackData, void*) {
182196
if (severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError || severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
183197
std::cerr << "validation layer: type " << to_string(type) << " msg: " << pCallbackData->pMessage << std::endl;

attachments/04_logical_device.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -82,26 +82,51 @@ class HelloTriangleApplication {
8282
}
8383

8484
void createInstance() {
85-
if (enableValidationLayers && !checkValidationLayerSupport()) {
86-
throw std::runtime_error("validation layers requested, but not available!");
87-
}
88-
8985
constexpr vk::ApplicationInfo appInfo{ .pApplicationName = "Hello Triangle",
9086
.applicationVersion = VK_MAKE_VERSION( 1, 0, 0 ),
9187
.pEngineName = "No Engine",
9288
.engineVersion = VK_MAKE_VERSION( 1, 0, 0 ),
9389
.apiVersion = vk::ApiVersion14 };
94-
auto extensions = getRequiredExtensions();
95-
std::vector<char const *> enabledLayers;
90+
91+
// Get the required layers
92+
std::vector<char const*> requiredLayers;
9693
if (enableValidationLayers) {
97-
enabledLayers.assign(validationLayers.begin(), validationLayers.end());
94+
requiredLayers.assign(validationLayers.begin(), validationLayers.end());
95+
}
96+
97+
// Check if the required layers are supported by the Vulkan implementation.
98+
auto layerProperties = context.enumerateInstanceLayerProperties();
99+
for (auto const& requiredLayer : requiredLayers)
100+
{
101+
if (std::ranges::none_of(layerProperties,
102+
[requiredLayer](auto const& layerProperty)
103+
{ return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
104+
{
105+
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
106+
}
98107
}
108+
109+
// Get the required extensions.
110+
auto requiredExtensions = getRequiredExtensions();
111+
112+
// Check if the required extensions are supported by the Vulkan implementation.
113+
auto extensionProperties = context.enumerateInstanceExtensionProperties();
114+
for (auto const& requiredExtension : requiredExtensions)
115+
{
116+
if (std::ranges::none_of(extensionProperties,
117+
[requiredExtension](auto const& extensionProperty)
118+
{ return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
119+
{
120+
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
121+
}
122+
}
123+
99124
vk::InstanceCreateInfo createInfo{
100125
.pApplicationInfo = &appInfo,
101-
.enabledLayerCount = static_cast<uint32_t>(enabledLayers.size()),
102-
.ppEnabledLayerNames = enabledLayers.data(),
103-
.enabledExtensionCount = static_cast<uint32_t>(extensions.size()),
104-
.ppEnabledExtensionNames = extensions.data() };
126+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
127+
.ppEnabledLayerNames = requiredLayers.data(),
128+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
129+
.ppEnabledExtensionNames = requiredExtensions.data() };
105130
instance = vk::raii::Instance(context, createInfo);
106131
}
107132

@@ -192,12 +217,6 @@ class HelloTriangleApplication {
192217
uint32_t glfwExtensionCount = 0;
193218
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
194219

195-
std::vector<vk::ExtensionProperties> props = context.enumerateInstanceExtensionProperties();
196-
if (const auto propsIterator = std::ranges::find_if(props, []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, vk::EXTDebugUtilsExtensionName ) == 0; } ); propsIterator == props.end() )
197-
{
198-
std::cout << "Something went very wrong, cannot find VK_EXT_debug_utils extension" << std::endl;
199-
exit( 1 );
200-
}
201220
std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
202221
if (enableValidationLayers) {
203222
extensions.push_back(vk::EXTDebugUtilsExtensionName );
@@ -206,11 +225,6 @@ class HelloTriangleApplication {
206225
return extensions;
207226
}
208227

209-
bool checkValidationLayerSupport() {
210-
return (std::ranges::any_of(context.enumerateInstanceLayerProperties(),
211-
[]( vk::LayerProperties const & lp ) { return ( strcmp( "VK_LAYER_KHRONOS_validation", lp.layerName ) == 0 ); } ) );
212-
}
213-
214228
static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT* pCallbackData, void*) {
215229
if (severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError || severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
216230
std::cerr << "validation layer: type " << to_string(type) << " msg: " << pCallbackData->pMessage << std::endl;

attachments/05_window_surface.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,51 @@ class HelloTriangleApplication {
8585
}
8686

8787
void createInstance() {
88-
if (enableValidationLayers && !checkValidationLayerSupport()) {
89-
throw std::runtime_error("validation layers requested, but not available!");
90-
}
91-
9288
constexpr vk::ApplicationInfo appInfo{ .pApplicationName = "Hello Triangle",
9389
.applicationVersion = VK_MAKE_VERSION( 1, 0, 0 ),
9490
.pEngineName = "No Engine",
9591
.engineVersion = VK_MAKE_VERSION( 1, 0, 0 ),
9692
.apiVersion = vk::ApiVersion14 };
97-
auto extensions = getRequiredExtensions();
98-
std::vector<char const *> enabledLayers;
93+
94+
// Get the required layers
95+
std::vector<char const*> requiredLayers;
9996
if (enableValidationLayers) {
100-
enabledLayers.assign(validationLayers.begin(), validationLayers.end());
97+
requiredLayers.assign(validationLayers.begin(), validationLayers.end());
98+
}
99+
100+
// Check if the required layers are supported by the Vulkan implementation.
101+
auto layerProperties = context.enumerateInstanceLayerProperties();
102+
for (auto const& requiredLayer : requiredLayers)
103+
{
104+
if (std::ranges::none_of(layerProperties,
105+
[requiredLayer](auto const& layerProperty)
106+
{ return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
107+
{
108+
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
109+
}
101110
}
111+
112+
// Get the required extensions.
113+
auto requiredExtensions = getRequiredExtensions();
114+
115+
// Check if the required extensions are supported by the Vulkan implementation.
116+
auto extensionProperties = context.enumerateInstanceExtensionProperties();
117+
for (auto const& requiredExtension : requiredExtensions)
118+
{
119+
if (std::ranges::none_of(extensionProperties,
120+
[requiredExtension](auto const& extensionProperty)
121+
{ return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
122+
{
123+
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
124+
}
125+
}
126+
102127
vk::InstanceCreateInfo createInfo{
103128
.pApplicationInfo = &appInfo,
104-
.enabledLayerCount = static_cast<uint32_t>(enabledLayers.size()),
105-
.ppEnabledLayerNames = enabledLayers.data(),
106-
.enabledExtensionCount = static_cast<uint32_t>(extensions.size()),
107-
.ppEnabledExtensionNames = extensions.data() };
129+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
130+
.ppEnabledLayerNames = requiredLayers.data(),
131+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
132+
.ppEnabledExtensionNames = requiredExtensions.data() };
108133
instance = vk::raii::Instance(context, createInfo);
109134
}
110135

@@ -242,12 +267,6 @@ class HelloTriangleApplication {
242267
uint32_t glfwExtensionCount = 0;
243268
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
244269

245-
std::vector<vk::ExtensionProperties> props = context.enumerateInstanceExtensionProperties();
246-
if (const auto propsIterator = std::ranges::find_if(props, []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, vk::EXTDebugUtilsExtensionName ) == 0; } ); propsIterator == props.end() )
247-
{
248-
std::cout << "Something went very wrong, cannot find VK_EXT_debug_utils extension" << std::endl;
249-
exit( 1 );
250-
}
251270
std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
252271
if (enableValidationLayers) {
253272
extensions.push_back(vk::EXTDebugUtilsExtensionName );
@@ -256,11 +275,6 @@ class HelloTriangleApplication {
256275
return extensions;
257276
}
258277

259-
bool checkValidationLayerSupport() {
260-
return (std::ranges::any_of(context.enumerateInstanceLayerProperties(),
261-
[]( vk::LayerProperties const & lp ) { return ( strcmp( "VK_LAYER_KHRONOS_validation", lp.layerName ) == 0 ); } ) );
262-
}
263-
264278
static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT* pCallbackData, void*) {
265279
if (severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError || severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
266280
std::cerr << "validation layer: type " << to_string(type) << " msg: " << pCallbackData->pMessage << std::endl;

attachments/06_swap_chain_creation.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,26 +93,51 @@ class HelloTriangleApplication {
9393
}
9494

9595
void createInstance() {
96-
if (enableValidationLayers && !checkValidationLayerSupport()) {
97-
throw std::runtime_error("validation layers requested, but not available!");
98-
}
99-
10096
constexpr vk::ApplicationInfo appInfo{ .pApplicationName = "Hello Triangle",
10197
.applicationVersion = VK_MAKE_VERSION( 1, 0, 0 ),
10298
.pEngineName = "No Engine",
10399
.engineVersion = VK_MAKE_VERSION( 1, 0, 0 ),
104100
.apiVersion = vk::ApiVersion14 };
105-
auto extensions = getRequiredExtensions();
106-
std::vector<char const *> enabledLayers;
101+
102+
// Get the required layers
103+
std::vector<char const*> requiredLayers;
107104
if (enableValidationLayers) {
108-
enabledLayers.assign(validationLayers.begin(), validationLayers.end());
105+
requiredLayers.assign(validationLayers.begin(), validationLayers.end());
106+
}
107+
108+
// Check if the required layers are supported by the Vulkan implementation.
109+
auto layerProperties = context.enumerateInstanceLayerProperties();
110+
for (auto const& requiredLayer : requiredLayers)
111+
{
112+
if (std::ranges::none_of(layerProperties,
113+
[requiredLayer](auto const& layerProperty)
114+
{ return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
115+
{
116+
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
117+
}
109118
}
119+
120+
// Get the required extensions.
121+
auto requiredExtensions = getRequiredExtensions();
122+
123+
// Check if the required extensions are supported by the Vulkan implementation.
124+
auto extensionProperties = context.enumerateInstanceExtensionProperties();
125+
for (auto const& requiredExtension : requiredExtensions)
126+
{
127+
if (std::ranges::none_of(extensionProperties,
128+
[requiredExtension](auto const& extensionProperty)
129+
{ return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
130+
{
131+
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
132+
}
133+
}
134+
110135
vk::InstanceCreateInfo createInfo{
111136
.pApplicationInfo = &appInfo,
112-
.enabledLayerCount = static_cast<uint32_t>(enabledLayers.size()),
113-
.ppEnabledLayerNames = enabledLayers.data(),
114-
.enabledExtensionCount = static_cast<uint32_t>(extensions.size()),
115-
.ppEnabledExtensionNames = extensions.data() };
137+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
138+
.ppEnabledLayerNames = requiredLayers.data(),
139+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
140+
.ppEnabledExtensionNames = requiredExtensions.data() };
116141
instance = vk::raii::Instance(context, createInfo);
117142
}
118143

@@ -295,12 +320,6 @@ class HelloTriangleApplication {
295320
uint32_t glfwExtensionCount = 0;
296321
auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
297322

298-
std::vector<vk::ExtensionProperties> props = context.enumerateInstanceExtensionProperties();
299-
if (const auto propsIterator = std::ranges::find_if(props, []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, vk::EXTDebugUtilsExtensionName ) == 0; } ); propsIterator == props.end() )
300-
{
301-
std::cout << "Something went very wrong, cannot find VK_EXT_debug_utils extension" << std::endl;
302-
exit( 1 );
303-
}
304323
std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
305324
if (enableValidationLayers) {
306325
extensions.push_back(vk::EXTDebugUtilsExtensionName );
@@ -309,11 +328,6 @@ class HelloTriangleApplication {
309328
return extensions;
310329
}
311330

312-
bool checkValidationLayerSupport() {
313-
return (std::ranges::any_of(context.enumerateInstanceLayerProperties(),
314-
[]( vk::LayerProperties const & lp ) { return ( strcmp( "VK_LAYER_KHRONOS_validation", lp.layerName ) == 0 ); } ) );
315-
}
316-
317331
static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT* pCallbackData, void*) {
318332
if (severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError || severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
319333
std::cerr << "validation layer: type " << to_string(type) << " msg: " << pCallbackData->pMessage << std::endl;

0 commit comments

Comments
 (0)