Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/vsg/vk/Instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ namespace vsg
/// return names of layers that are supported from the desired list.
extern VSG_DECLSPEC Names validateInstanceLayerNames(const Names& names);

/// return true if the specified layer name exists in the list.
extern VSG_DECLSPEC bool containsInstanceLayerName(const Names& names, const char* layerName);

/// Instance encapsulates the VkInstance.
class VSG_DECLSPEC Instance : public Inherit<Object, Instance>
{
Expand Down
41 changes: 41 additions & 0 deletions include/vsg/vk/vulkan.h
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,47 @@ typedef enum VkRayTracingShaderGroupTypeKHR

#endif


////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Definitions not provided prior to 1.2.150
//
#if VK_HEADER_VERSION < 150

#define VK_EXT_validation_features 1
#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 4
#define VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME "VK_EXT_validation_features"

typedef enum VkValidationFeatureEnableEXT {
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,
VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,
VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT = 3,
VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT = 4,
VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationFeatureEnableEXT;

typedef enum VkValidationFeatureDisableEXT {
VK_VALIDATION_FEATURE_DISABLE_ALL_EXT = 0,
VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT = 1,
VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT = 2,
VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT = 3,
VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT = 4,
VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT = 5,
VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT = 6,
VK_VALIDATION_FEATURE_DISABLE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationFeatureDisableEXT;
typedef struct VkValidationFeaturesEXT {
VkStructureType sType;
const void* pNext;
uint32_t enabledValidationFeatureCount;
const VkValidationFeatureEnableEXT* pEnabledValidationFeatures;
uint32_t disabledValidationFeatureCount;
const VkValidationFeatureDisableEXT* pDisabledValidationFeatures;
} VkValidationFeaturesEXT;

#endif

////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Definitions not provided prior to 1.2.162
Expand Down
34 changes: 33 additions & 1 deletion src/vsg/vk/Instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,16 @@ Names vsg::validateInstanceLayerNames(const Names& names)
return validatedNames;
}

bool vsg::containsInstanceLayerName(const Names& names, const char* layerName)
{
if (!layerName) return false;

auto cmpFunc = [&](const char* name) {
return strcmp(name, layerName) == 0;
};
return std::find_if(names.begin(), names.end(), cmpFunc) != names.end();
}

static VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT /*messageType*/,
Expand Down Expand Up @@ -143,7 +153,29 @@ Instance::Instance(Names instanceExtensions, Names layers, uint32_t vulkanApiVer
createInfo.enabledLayerCount = static_cast<uint32_t>(layers.size());
createInfo.ppEnabledLayerNames = layers.empty() ? nullptr : layers.data();

createInfo.pNext = nullptr;
std::vector<VkValidationFeatureEnableEXT> enabledValidationFeatures;
std::vector<VkValidationFeatureDisableEXT> disabledValidationFeatures;

// syncronization validation requires VkValidationFeaturesEXT
if (containsInstanceLayerName(layers, "VK_LAYER_KHRONOS_synchronization2")) enabledValidationFeatures.push_back(VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT);

// set up the VkValidationFeaturesEXT if required
VkValidationFeaturesEXT validationFeatures{};
if (!enabledValidationFeatures.empty() || !disabledValidationFeatures.empty())
{
validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
validationFeatures.enabledValidationFeatureCount = static_cast<uint32_t>(enabledValidationFeatures.size());
validationFeatures.pEnabledValidationFeatures = enabledValidationFeatures.data();

validationFeatures.disabledValidationFeatureCount = static_cast<uint32_t>(disabledValidationFeatures.size());
validationFeatures.pDisabledValidationFeatures = disabledValidationFeatures.data();

createInfo.pNext = &validationFeatures;
}
else
{
createInfo.pNext = nullptr;
}

VkInstance instance;
VkResult result = vkCreateInstance(&createInfo, allocator, &instance);
Expand Down
Loading