关于调试

validation layers

https://github.com/LunarG提供

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
2
setx VK_INSTANCE_LAYERS
VK_LAYER_LUNARG_api_dump;VK_LAYER_LUNARG_core_validation

如果是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

其他调试技巧

RenderDoc