我想知道 Vulkan 驱动程序如何与 SDK 交互。
例如,如果驱动程序和 SDK 中的 VK_API_VERSION 不同,我很想知道是否存在某种不兼容。
例如在 CUDA 中,较新的 CUDA 驱动程序保持向后兼容性,但它们与较新的 CUDA 版本不向前兼容。任何人都知道这是否也发生在 Vulkan 中?
Vulkan 的兼容性在 Vulkan 规范中列出,它基于版本号:XYZ
Z
是“补丁”编号,主要代表规范的编辑或次要行为更改。不允许任何面向用户的 API 根据补丁编号进行更改。可以与 XY(Z-1) 一起使用的代码必须与 XYZ 一起使用,反之亦然。因此,如果 SDK 可以加载 Vulkan 版本 XY,它可以Z
为该版本中的每个版本加载它。
Y
是次要版本号,表示对 API 的向后兼容更改。也就是说,如果您的代码与 X.(Y-1) 一起使用,它也将与 XY 一起使用。但是,反过来不一定正确。因此,如果您使用的是 1.0 版的 SDK 加载器,它应该适用于 1.1 版及更高版本。
显然,如果您使用 1.0 加载程序,您将无法使用 1.1+ 中添加的新 API。
X
代表主要版本号。如果情况发生变化,所有赌注都将取消。可以删除、修改 API、更改验证规则等。因此,如果您使用 1.3 版的 SDK 加载器,并且 2.0 版发布,则不能保证 1.3 加载器会加载它。最重要的是,即使它看起来确实加载正确,你也不应该使用它。
永远不要期望针对 Vulkan 的一个主要版本编写的应用程序可以在不同的主要版本上运行。
上面解释了 Vulkan 规范与用户之间的合同,无论用户是谁。如果您使用的是 SDK,那么 SDK 位于您和实现之间。它可以在上面添加规则。
但是,从文档中,我没有看到任何证据表明加载器试图阻止从以前的 API 版本加载更高的次要 API 版本。因此,SDK 加载器似乎遵循 Vulkan 规范。如果加载器是为 Vulkan 1.1 构建的,那么它应该适用于最高 2.0 的任何 Vulkan 实现。此时加载程序可能无法工作,因为它所依赖的 API 不存在。