@@ -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 ());
81+ }
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+ }
8493 }
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
@@ -108,12 +133,6 @@ class HelloTriangleApplication {
108133 uint32_t glfwExtensionCount = 0 ;
109134 auto glfwExtensions = glfwGetRequiredInstanceExtensions (&glfwExtensionCount);
110135
111- std::vector<vk::ExtensionProperties> props = context.enumerateInstanceExtensionProperties ();
112- if (const auto propsIterator = std::ranges::find_if (props, []( vk::ExtensionProperties const & ep ) { return strcmp ( ep.extensionName , vk::EXTDebugUtilsExtensionName ) == 0 ; } ); propsIterator == props.end () )
113- {
114- std::cout << " Something went very wrong, cannot find VK_EXT_debug_utils extension" << std::endl;
115- exit ( 1 );
116- }
117136 std::vector extensions (glfwExtensions, glfwExtensions + glfwExtensionCount);
118137 if (enableValidationLayers) {
119138 extensions.push_back (vk::EXTDebugUtilsExtensionName );
@@ -122,11 +141,6 @@ class HelloTriangleApplication {
122141 return extensions;
123142 }
124143
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-
130144 static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback (vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT* pCallbackData, void *) {
131145 if (severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError || severity == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
132146 std::cerr << " validation layer: type " << to_string (type) << " msg: " << pCallbackData->pMessage << std::endl;
0 commit comments