validation layer介绍
validation layer称为验证层。用于校验Vulkan API输入是否有效。
有效输入
有效输入(Valid Usage,简称为VU),在Vulkan Spec中定义为:
提示
为了使应用出现明确定义的行为而必须满足的前提条件。
作为一种显式调用的 API,Vulkan 的主要特点之一是驱动程序不会在检查有效输入上浪费时间。而在 OpenGL 中,驱动程序必须检查输入是否有效,这会增加很多额外开销。Vulkan 中没有等效的 glGetError实现。
vulkan spec在每个函数和结构之后列出了有效性输入。例如,如果检测出VkBindImageMemory
中使用了无效的 vkImage
,那么validation layer会识别出一个VUID,在VkBindImageMemory
下有该VUID的说明。
未定义的行为
当应用程序有无效输入时,结果将是未定义行为。在这种状态下,Vulkan 不保证任何未定义行为的结果。
有效输入 ID (VUID)
VUID是每个有效性输入的唯一 ID。根据VUID将很容易地在spec中找到有效性输入的说明。
举个例子,VUID-vkBindImageMemory-memoryOffset-01046
)只需将 VUID 在spec html中添加锚点 (vkspec.html#VUID-vkBindImageMemory-memoryOffset-01046),就会直接跳转到该 VUID。
Khronos validation layer
由于 Vulkan 不执行任何错误检查,因此在开发调试时,启用验证层来辅助定位无效行为是非常重要的。
获取validation layer
验证层在不断的更新和改进,因此可以下载最新的源代码自己构建。 也可以下载平台预编译好的版本:
- Android - 二进制文件在 GitHub 上发布。NDK 也附带了验证层,参考Android使用说明。
- Linux - Vulkan SDK附带了验证层,参考 Linux使用说明 。
- MacOS - Vulkan SDK 附带了验证层,参考 MacOS使用说明 。
- Windows - Vulkan SDK附带了验证层,参考 Windows使用说明 。
分析验证错误消息
验证层会在发生错误时提供尽可能多的信息。以下示例说明了如何解读验证层信息