validation layers
https://github.com/KhronosGroup/Vulkan-ValidationLayers
概念
Vulkan API设计时时刻考虑着性能.其中一个提升其性能的方式是减少驱动的状态和错误检查.这是Vulkan被称为”thin API”或”thin driver”,因为它硬件的最小抽象–这在多个硬件上跨平台是必须的(高性能的PC,移动手机,低性能的嵌入式设备等).
这导致变现Vulkan API的app更困难.为了解决这个问题,Vulkan也被设计为一个分层的API,最底层和核心的曾是Vulkan API自己–与驱动交互.它的上策(app与Vulkan API之间),开发者可以激活额外的layers,简化debugging流程.
如何做
windows
找到Vulkan SDK安装目录,找到./Config文件夹
将其内的vk_layer_settings.txt拷贝执行程序所在文件夹内
创建环境变量 VK_INSTANCE_LAYERS:
打开控制台(cmd.exe),输入一下内容:
setx VK_INSTANCE_LAYERS
VK_LAYER_LUNARG_standard_validation
重新打开控制台
使用控制台执行要测试的程序,warnings或errors会显示到控制台里
linux类似
同上
同上
输入命令变为
export
VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_standard_validation
同上
如何工作的
Vulkan validation layers包含了一组创建app时辅助找到潜在问题的库.他们的调试策略包括但不限于:参数检测,确认texture和RT的formats,追踪Vulkan objects的生命周期和使用,检查Vulkan API函数调用的潜在的内存泄漏和奔溃.这些功能通过激活不同的validation layers来启动,但其中大多数被集中到了一个叫VK_LAYER_LUNARG_standard_validation的层.其他layers包括:VK_LAYER_LUNARG_swapchain,VK_LAYER_LUNARG_object_tracker,VK_LAYER_GOOGLE_threading,VK_LAYER_LUNARG_api_dump等.多个layers可以同时激活,如果是windows这样做:
1 | setx VK_INSTANCE_LAYERS |
如果是linux:
1 | export VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_api_dump:VK_LAYER_LUNARG_core_validation |
但是上述的方法都是全局的,事实上,实际编程时,我们根据是否时DEBUG模式动态决定是否使用Vulkan validation layers.
实际编程的做法
通过标准宏NDEBUG决定是否启用某些validation layers
通过vkEnumerateInstanceLayerProperties获得支持的validation layers
将支持且需要启用的validation layer绑定到VkInstanceCreateInfo
调用vkCreateInstance时启用
定义调试回调函数,PFN_vkDebugReportCallbackEXT
填充结构VkDebugReportCallbackCreateInfoEXT
调用vkCreateDebugReportCallbackEXT(扩展函数,需要使用vkGetInstanceprocAddr获得)创建
注意需要在清理Instance前调用vkDestroyDebugReportCallbackEXT清理callback
参考https://blog.csdn.net/lbknxy/article/details/52430599