@@ -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;
0 commit comments