目录
先叨叨
Vulkan为了尽量提高执行效率,因此所有API对传入的参数没有作任何校验。即使传错了参数也会继续执行,对错误参数会造成的后果不做任何定义。
不过Vulkan也提供了一个叫VK_LAYER_KHRONOS_validation的Layer如果开启这个Layer,Vulkan在执行API时就会校验参数的正确性,如果发现有错误参数传入就会通过DebugUtilsMessenger通知APP。
而上篇我们已经开启了DebugUtilsMessenger。
本篇介绍如何启动VK_LAYER_KHRONOS_validation
关键函数和API
VulkanEnv::GetAllSupportedLayers()
想要开启一个Layer首先要判断当前平台的Vulkan实现是否支持这个Layer。
本函数的作用是调用vkEnumerateInstanceLayerProperties接口获取当前平台的Vulkan实现支持的所有Layer,并存放在m_supportedLayerNames中。
void VulkanEnv::GetAllSupportedLayers()
{
uint32_t layerCount;
//https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#vkEnumerateInstanceLayerProperties
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
std::vector<VkLayerProperties> availableLayers(layerCount);
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());
for (uint32_t i = 0; i < layerCount; ++i)
{
m_supportedLayerNames.insert(std::string(availableLayers[i].layerName));
}
}
VulkanEnv::CreateVkInstance()
在创建VkInstance时,先判断Vulkan是否支持VK_LAYER_KHRONOS_validation。
如果支持便通过VkInstanceCreateInfo的ppEnabledLayerNames属性,通知VkInstance启动VK_LAYER_KHRONOS_validation。
void VulkanEnv::CreateVkInstance()
{
...
std::vector<const char*> expectedLayerNames = {};
if (true == m_enableDebug)
{
...
if (m_supportedLayerNames.end() != m_supportedLayerNames.find(std::string("VK_LAYER_KHRONOS_validation")))
{
expectedLayerNames.push_back("VK_LAYER_KHRONOS_validation");
}
}
...
VkInstanceCreateInfo createInfo{};
...
createInfo.enabledLayerCount = static_cast<uint32_t>(expectedLayerNames.size());
createInfo.ppEnabledLayerNames = expectedLayerNames.data();
}
运行代码
结合上篇,在运行代码便可以看到Vulkan的Debug信息。如果你故意传错某个参数,也会收到VK_LAYER_KHRONOS_validation的提示。