Skip to content

Commit b685be4

Browse files
committed
Expose Synchronization Validation feature for APIConnection
1 parent 62a8b72 commit b685be4

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

include/nbl/video/IAPIConnection.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ class NBL_API2 IAPIConnection : public core::IReferenceCounted
2828

2929
// VK_LAYER_KHRONOS_validation (instance layer)
3030
bool validations = false;
31+
// VK_LAYER_KHRONOS_validation (instance extension)
32+
/* TODO: Possibly bring in all as Validation extensions enum
33+
typedef enum VkValidationFeatureEnableEXT {
34+
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,
35+
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,
36+
VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,
37+
VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT = 3,
38+
VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT = 4,
39+
} VkValidationFeatureEnableEXT;
40+
*/
41+
bool synchronizationValidation = false;
3142

3243
// VK_EXT_debug_utils
3344
// When combined with validation layers, even more detailed feedback on the application�s use of Vulkan will be provided.

src/nbl/video/CVulkanConnection.cpp

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ namespace nbl::video
138138
};
139139

140140

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)
142146
{
143147
insertToFeatureSetIfAvailable(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, "debugUtils");
144148
}
@@ -161,6 +165,31 @@ namespace nbl::video
161165
if(!allRequestedFeaturesSupported)
162166
return nullptr;
163167

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+
164193
std::unique_ptr<CVulkanDebugCallback> debugCallback = nullptr;
165194
VkDebugUtilsMessengerCreateInfoEXT debugMessengerCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
166195
if (logger && enabledFeatures.debugUtils)
@@ -175,6 +204,21 @@ namespace nbl::video
175204
debugMessengerCreateInfo.messageType = debugCallbackFlags.second;
176205
debugMessengerCreateInfo.pfnUserCallback = CVulkanDebugCallback::defaultCallback;
177206
debugMessengerCreateInfo.pUserData = debugCallback.get();
207+
208+
addStructToChain(&debugMessengerCreateInfo);
209+
}
210+
211+
VkValidationFeaturesEXT validationFeaturesEXT = { VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT };
212+
VkValidationFeatureEnableEXT validationsEnable[16u] = {};
213+
VkValidationFeatureDisableEXT validationsDisable[16u] = {};
214+
validationFeaturesEXT.pEnabledValidationFeatures = validationsEnable;
215+
216+
// TODO: Do the samefor other validation features as well(?)
217+
if (enabledFeatures.synchronizationValidation)
218+
{
219+
validationsEnable[validationFeaturesEXT.enabledValidationFeatureCount] = VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT;
220+
validationFeaturesEXT.enabledValidationFeatureCount += 1u;
221+
addStructToChain(&validationFeaturesEXT);
178222
}
179223

180224
uint32_t instanceApiVersion = MinimumVulkanApiVersion;
@@ -196,7 +240,7 @@ namespace nbl::video
196240
applicationInfo.engineVersion = NABLA_VERSION_INTEGER;
197241

198242
VkInstanceCreateInfo createInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
199-
createInfo.pNext = enabledFeatures.debugUtils ? (VkDebugUtilsMessengerCreateInfoEXT*)&debugMessengerCreateInfo : nullptr;
243+
createInfo.pNext = structsHead;
200244
createInfo.flags = static_cast<VkInstanceCreateFlags>(0);
201245
createInfo.pApplicationInfo = &applicationInfo;
202246
createInfo.enabledLayerCount = requiredLayerNameCount;

0 commit comments

Comments
 (0)