Skip to content

Commit 5ab06c8

Browse files
committed
Cherry pick some of Erfan's work from master
1 parent e2e3adc commit 5ab06c8

File tree

3 files changed

+68
-12
lines changed

3 files changed

+68
-12
lines changed

include/nbl/asset/ECommonEnums.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ enum E_PIPELINE_STAGE_FLAGS : uint32_t
6363
EPSF_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000,
6464
EPSF_COMMAND_PREPROCESS_BIT_NV = 0x00020000
6565
};
66+
NBL_ENUM_ADD_BITWISE_OPERATORS(E_PIPELINE_STAGE_FLAGS)
6667

6768
enum E_ACCESS_FLAGS : uint32_t
6869
{
@@ -99,6 +100,7 @@ enum E_ACCESS_FLAGS : uint32_t
99100
EAF_ALL_ACCESSES_BIT_DEVSH = 0x0004ffff,
100101
EAF_ALL_BUFFER_ACCESSES_DEVSH = EAF_ALL_ACCESSES_BIT_DEVSH^(EAF_INPUT_ATTACHMENT_READ_BIT|EAF_COLOR_ATTACHMENT_READ_BIT|EAF_COLOR_ATTACHMENT_WRITE_BIT|EAF_DEPTH_STENCIL_ATTACHMENT_READ_BIT|EAF_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT|EAF_MEMORY_READ_BIT|EAF_MEMORY_WRITE_BIT|EAF_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT|EAF_SHADING_RATE_IMAGE_READ_BIT_NV|EAF_FRAGMENT_DENSITY_MAP_READ_BIT_EXT)
101102
};
103+
NBL_ENUM_ADD_BITWISE_OPERATORS(E_ACCESS_FLAGS)
102104

103105
enum E_DEPENDENCY_FLAGS
104106
{

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: 55 additions & 12 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,28 +165,67 @@ 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+
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+
164214
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 };
166216
if (logger && enabledFeatures.debugUtils)
167217
{
168218
auto logLevelMask = logger->getLogLevelMask();
169219
debugCallback = std::make_unique<CVulkanDebugCallback>(std::move(logger));
170220

171-
debugMessengerCreateInfo.pNext = nullptr;
172221
debugMessengerCreateInfo.flags = 0;
173222
auto debugCallbackFlags = getDebugCallbackFlagsFromLogLevelMask(logLevelMask);
174223
debugMessengerCreateInfo.messageSeverity = debugCallbackFlags.first;
175224
debugMessengerCreateInfo.messageType = debugCallbackFlags.second;
176225
debugMessengerCreateInfo.pfnUserCallback = CVulkanDebugCallback::defaultCallback;
177226
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);
186229
}
187230

188231
VkInstance vk_instance;
@@ -196,7 +239,7 @@ namespace nbl::video
196239
applicationInfo.engineVersion = NABLA_VERSION_INTEGER;
197240

198241
VkInstanceCreateInfo createInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
199-
createInfo.pNext = enabledFeatures.debugUtils ? (VkDebugUtilsMessengerCreateInfoEXT*)&debugMessengerCreateInfo : nullptr;
242+
createInfo.pNext = structsHead;
200243
createInfo.flags = static_cast<VkInstanceCreateFlags>(0);
201244
createInfo.pApplicationInfo = &applicationInfo;
202245
createInfo.enabledLayerCount = requiredLayerNameCount;

0 commit comments

Comments
 (0)