@@ -91,6 +91,16 @@ Names vsg::validateInstanceLayerNames(const Names& names)
9191 return validatedNames;
9292}
9393
94+ bool vsg::containsInstanceLayerName (const Names& names, const char * layerName)
95+ {
96+ if (!layerName) return false ;
97+
98+ auto cmpFunc = [&](const char * name) {
99+ return strcmp (name, layerName) == 0 ;
100+ };
101+ return std::find_if (names.begin (), names.end (), cmpFunc) != names.end ();
102+ }
103+
94104static VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback (
95105 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
96106 VkDebugUtilsMessageTypeFlagsEXT /* messageType*/ ,
@@ -143,7 +153,20 @@ Instance::Instance(Names instanceExtensions, Names layers, uint32_t vulkanApiVer
143153 createInfo.enabledLayerCount = static_cast <uint32_t >(layers.size ());
144154 createInfo.ppEnabledLayerNames = layers.empty () ? nullptr : layers.data ();
145155
146- createInfo.pNext = nullptr ;
156+ // enable synchronization validation feature if requested
157+ VkValidationFeatureEnableEXT validationFeature = VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT;
158+ VkValidationFeaturesEXT validationFeatures{};
159+ if (containsInstanceLayerName (layers, " VK_LAYER_KHRONOS_synchronization2" ))
160+ {
161+ validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
162+ validationFeatures.enabledValidationFeatureCount = 1 ;
163+ validationFeatures.pEnabledValidationFeatures = &validationFeature;
164+ createInfo.pNext = &validationFeatures;
165+ }
166+ else
167+ {
168+ createInfo.pNext = nullptr ;
169+ }
147170
148171 VkInstance instance;
149172 VkResult result = vkCreateInstance (&createInfo, allocator, &instance);
0 commit comments