@@ -138,7 +138,11 @@ namespace nbl::video
138
138
};
139
139
140
140
141
- if (featuresToEnable.debugUtils )
141
+ if (featuresToEnable.synchronizationValidation /* || other flags taht require VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME */ )
142
+ {
143
+ insertToFeatureSetIfAvailable (VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME, " synchronizationValidation" );
144
+ }
145
+ if (featuresToEnable.debugUtils )
142
146
{
143
147
insertToFeatureSetIfAvailable (VK_EXT_DEBUG_UTILS_EXTENSION_NAME, " debugUtils" );
144
148
}
@@ -161,28 +165,67 @@ namespace nbl::video
161
165
if (!allRequestedFeaturesSupported)
162
166
return nullptr ;
163
167
168
+
169
+ VkBaseInStructure* structsTail = nullptr ;
170
+ VkBaseInStructure* structsHead = nullptr ;
171
+ // Vulkan has problems with having features in the feature chain that have all values set to false.
172
+ // For example having an empty "RayTracingPipelineFeaturesKHR" in the chain will lead to validation errors for RayQueryONLY applications.
173
+ auto addStructToChain = [&structsHead, &structsTail](void * feature) -> void
174
+ {
175
+ VkBaseInStructure* toAdd = reinterpret_cast <VkBaseInStructure*>(feature);
176
+
177
+ // For protecting against duplication of feature structures that may be requested to add to chain twice due to extension requirements
178
+ const bool alreadyAdded = (toAdd->pNext != nullptr || toAdd == structsTail);
179
+
180
+ if (structsHead == nullptr )
181
+ {
182
+ structsHead = toAdd;
183
+ structsTail = toAdd;
184
+ }
185
+ else if (!alreadyAdded)
186
+ {
187
+ structsTail->pNext = toAdd;
188
+ structsTail = toAdd;
189
+ }
190
+ };
191
+
192
+
193
+ VkValidationFeaturesEXT validationFeaturesEXT = { VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, nullptr };
194
+ VkValidationFeatureEnableEXT validationsEnable[16u ] = {};
195
+ VkValidationFeatureDisableEXT validationsDisable[16u ] = {};
196
+ validationFeaturesEXT.pEnabledValidationFeatures = validationsEnable;
197
+
198
+ // TODO: Do the samefor other validation features as well(?)
199
+ if (enabledFeatures.synchronizationValidation )
200
+ {
201
+ validationsEnable[validationFeaturesEXT.enabledValidationFeatureCount ] = VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT;
202
+ validationFeaturesEXT.enabledValidationFeatureCount += 1u ;
203
+ addStructToChain (&validationFeaturesEXT);
204
+ }
205
+
206
+ uint32_t instanceApiVersion = MinimumVulkanApiVersion;
207
+ vkEnumerateInstanceVersion (&instanceApiVersion); // Get Highest
208
+ if (instanceApiVersion < MinimumVulkanApiVersion)
209
+ {
210
+ assert (false );
211
+ return nullptr ;
212
+ }
213
+
164
214
std::unique_ptr<CVulkanDebugCallback> debugCallback = nullptr ;
165
- VkDebugUtilsMessengerCreateInfoEXT debugMessengerCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
215
+ VkDebugUtilsMessengerCreateInfoEXT debugMessengerCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, nullptr };
166
216
if (logger && enabledFeatures.debugUtils )
167
217
{
168
218
auto logLevelMask = logger->getLogLevelMask ();
169
219
debugCallback = std::make_unique<CVulkanDebugCallback>(std::move (logger));
170
220
171
- debugMessengerCreateInfo.pNext = nullptr ;
172
221
debugMessengerCreateInfo.flags = 0 ;
173
222
auto debugCallbackFlags = getDebugCallbackFlagsFromLogLevelMask (logLevelMask);
174
223
debugMessengerCreateInfo.messageSeverity = debugCallbackFlags.first ;
175
224
debugMessengerCreateInfo.messageType = debugCallbackFlags.second ;
176
225
debugMessengerCreateInfo.pfnUserCallback = CVulkanDebugCallback::defaultCallback;
177
226
debugMessengerCreateInfo.pUserData = debugCallback.get ();
178
- }
179
-
180
- uint32_t instanceApiVersion = MinimumVulkanApiVersion;
181
- vkEnumerateInstanceVersion (&instanceApiVersion); // Get Highest
182
- if (instanceApiVersion < MinimumVulkanApiVersion)
183
- {
184
- assert (false );
185
- return nullptr ;
227
+
228
+ addStructToChain (&debugMessengerCreateInfo);
186
229
}
187
230
188
231
VkInstance vk_instance;
@@ -196,7 +239,7 @@ namespace nbl::video
196
239
applicationInfo.engineVersion = NABLA_VERSION_INTEGER;
197
240
198
241
VkInstanceCreateInfo createInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
199
- createInfo.pNext = enabledFeatures. debugUtils ? (VkDebugUtilsMessengerCreateInfoEXT*)&debugMessengerCreateInfo : nullptr ;
242
+ createInfo.pNext = structsHead ;
200
243
createInfo.flags = static_cast <VkInstanceCreateFlags>(0 );
201
244
createInfo.pApplicationInfo = &applicationInfo;
202
245
createInfo.enabledLayerCount = requiredLayerNameCount;
0 commit comments