08/06/2020
文章目录
扩展或者层
Vulkan API的设计核心是尽量最小化驱动程序的额外开销,所谓额外开销更多的是指向渲染以外的运算。
扩展和层是有区别的。
验证层
验证层是一个可选的层,可以在VkInstance或者VkDevice中启动。实例层上的扩展验证与全局VkInstance有关的调用,VkDevice层知识验证与特定GPU相关的调用,但是VkDevice层的已经被丢弃,所以现在VkInstance引用所有的Vulkan的调用。
如何挂在到Vulkan vkCreateInstance函数中去?下面是一段伪代码
VkResult vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
Vkinstance* instance)
{
//挂在部分
//验证层 多出来的检测
if(pCreateInfo == nullptr ||instance == nullptr)
{
log("NUll pointer passed to required parameter!");
return VK_ERROR_INITIALIZATION_FAILED;
}
}
作用
- 检查参数的值是否违反标准和使用情况
- 跟踪创建和销毁实例来检测资源泄露
- 检查线程安全
- 输出每一个调用
- 追踪Vulkan调用
实践
检测是否支持的验证层
uint32_t layerCount;
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
std::vector<VkLayerProperties> availableLayers(layerCount);
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());
std::cout << "Support Validation Layor: \n";
for (const auto& layerProperties : availableLayers)
{
std::cout << "\t" << layerProperties.layerName << "\t" << layerProperties.description << "\n";
}
启动验证层
在VkInstance中有一个layer属性,可以启动全局的验证层扩展