Skip to content

Commit 5cd2086

Browse files
committed
Add checks in createInstance in 02_validation_layers.cpp
1 parent 7e5cd04 commit 5cd2086

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

attachments/02_validation_layers.cpp

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,26 +68,51 @@ class HelloTriangleApplication {
6868
}
6969

7070
void createInstance() {
71-
if (enableValidationLayers && !checkValidationLayerSupport()) {
72-
throw std::runtime_error("validation layers requested, but not available!");
73-
}
74-
7571
constexpr vk::ApplicationInfo appInfo{ .pApplicationName = "Hello Triangle",
7672
.applicationVersion = VK_MAKE_VERSION( 1, 0, 0 ),
7773
.pEngineName = "No Engine",
7874
.engineVersion = VK_MAKE_VERSION( 1, 0, 0 ),
7975
.apiVersion = vk::ApiVersion14 };
80-
auto extensions = getRequiredExtensions();
81-
std::vector<char const *> enabledLayers;
76+
77+
// Get the required layers
78+
std::vector<char const*> requiredLayers;
8279
if (enableValidationLayers) {
83-
enabledLayers.assign(validationLayers.begin(), validationLayers.end());
80+
requiredLayers.assign(validationLayers.begin(), validationLayers.end());
8481
}
82+
83+
// Check if the required layers are supported by the Vulkan implementation.
84+
auto layerProperties = context.enumerateInstanceLayerProperties();
85+
for (auto const& requiredLayer : requiredLayers)
86+
{
87+
if (std::ranges::none_of(layerProperties,
88+
[requiredLayer](auto const& layerProperty)
89+
{ return strcmp(layerProperty.layerName, requiredLayer) == 0; }))
90+
{
91+
throw std::runtime_error("Required layer not supported: " + std::string(requiredLayer));
92+
}
93+
}
94+
95+
// Get the required extensions.
96+
auto requiredExtensions = getRequiredExtensions();
97+
98+
// Check if the required extensions are supported by the Vulkan implementation.
99+
auto extensionProperties = context.enumerateInstanceExtensionProperties();
100+
for (auto const & requiredExtension : requiredExtensions)
101+
{
102+
if (std::ranges::none_of(extensionProperties,
103+
[requiredExtension](auto const& extensionProperty)
104+
{ return strcmp(extensionProperty.extensionName, requiredExtension) == 0; }))
105+
{
106+
throw std::runtime_error("Required extension not supported: " + std::string(requiredExtension));
107+
}
108+
}
109+
85110
vk::InstanceCreateInfo createInfo{
86111
.pApplicationInfo = &appInfo,
87-
.enabledLayerCount = static_cast<uint32_t>(enabledLayers.size()),
88-
.ppEnabledLayerNames = enabledLayers.data(),
89-
.enabledExtensionCount = static_cast<uint32_t>(extensions.size()),
90-
.ppEnabledExtensionNames = extensions.data() };
112+
.enabledLayerCount = static_cast<uint32_t>(requiredLayers.size()),
113+
.ppEnabledLayerNames = requiredLayers.data(),
114+
.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()),
115+
.ppEnabledExtensionNames = requiredExtensions.data() };
91116
instance = vk::raii::Instance(context, createInfo);
92117
}
93118

@@ -122,11 +147,6 @@ class HelloTriangleApplication {
122147
return extensions;
123148
}
124149

125-
bool checkValidationLayerSupport() {
126-
return (std::ranges::any_of(context.enumerateInstanceLayerProperties(),
127-
[]( vk::LayerProperties const & lp ) { return ( strcmp( "VK_LAYER_KHRONOS_validation", lp.layerName ) == 0 ); } ) );
128-
}
129-
130150
static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT* pCallbackData, void*) {
131151
if (severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError || severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
132152
std::cerr << "validation layer: type " << to_string(type) << " msg: " << pCallbackData->pMessage << std::endl;

0 commit comments

Comments
 (0)