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