版本
Vulkan 使用主版本号、次版本号、补丁版本号的版本控制系统。目前,Vulkan 有 3 个次版本发布(1.0、1.1、1.2 和 1.3),它们彼此向后兼容。应用程序可以使用vkEnumerateInstanceVersion 来检查支持的 Vulkan 实例版本。LunarG 还有一个关于如何查询和检查支持版本的白皮书。在跨次版本工作时,需要注意一些细微之处。
实例和设备
重要的是要记住实例级版本和设备级版本之间存在差异。加载器和实现可能支持不同的版本。
Vulkan 规范中的查询版本支持部分详细介绍了如何查询实例和设备级别支持的版本。
头文件
对于所有 Vulkan 主要版本,只有一个受支持的头文件。这意味着不存在“Vulkan 1.0 头文件”之类的东西,因为次版本和补丁版本的所有头文件都是统一的。这不应与生成Vulkan 规范的 1.0 版本的能力混淆,因为同一补丁版本的 Vulkan 规范和头文件将匹配。一个示例是,生成的 1.0.42 Vulkan 规范将与 1.x.42 头文件匹配。
强烈建议开发人员尝试保持使用发布的最新头文件。Vulkan SDK 有许多版本,这些版本映射到它将打包的头文件版本。
扩展
在 Vulkan 的次版本之间,一些扩展被提升到核心版本。当以较新的 Vulkan 次版本为目标时,应用程序无需在实例和设备创建时启用新提升的扩展。但是,如果应用程序想要保持向后兼容性,则需要启用这些扩展。
有关每个版本的新增内容的摘要,请查看Vulkan 版本摘要
结构体和枚举
结构体和枚举取决于正在使用的头文件,而不是查询的实例或设备的版本。例如,结构体 VkPhysicalDeviceFeatures2
在 Vulkan 1.1 发布之前曾是 VkPhysicalDeviceFeatures2KHR
。无论使用哪个 1.x 版本的 Vulkan,应用程序都应在其代码中使用 VkPhysicalDeviceFeatures2
,因为它与最新的头文件版本匹配。对于代码中确实有 VkPhysicalDeviceFeatures2KHR
的应用程序,无需担心,因为 Vulkan 头文件还会别名任何提升的结构体和枚举(typedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR;
)。
使用较新命名的原因是 Vulkan 规范本身将仅引用 VkPhysicalDeviceFeatures2
,而无论生成的是哪个版本的 Vulkan 规范。使用较新的命名可以更容易地快速搜索到该结构体的使用位置。
函数
由于函数用于与加载器和实现进行交互,因此在次版本之间工作时需要更加小心。例如,让我们看一下 vkGetPhysicalDeviceFeatures2KHR
,它从 Vulkan 1.0 到 Vulkan 1.1 被提升为核心函数 vkGetPhysicalDeviceFeatures2
。查看 Vulkan 头文件,两者都已声明。
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures);
// ...
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures);
主要的区别在于,当调用 vkGetInstanceProcAddr(instance, “vkGetPhysicalDeviceFeatures2”);
时,Vulkan 1.0 实现可能不知道 vkGetPhysicalDeviceFeatures2
的存在,vkGetInstanceProcAddr
将返回 NULL
。为了在这种情况下向后兼容 Vulkan 1.0,应用程序应查询 vkGetPhysicalDeviceFeatures2KHR
,因为 1.1 Vulkan 实现很可能直接将该函数指针指向内部的 vkGetPhysicalDeviceFeatures2
函数指针。
只有当 |
限制
目前,所有Vulkan版本都共享相同的最小/最大限制要求,但任何更改都将在Vulkan规范的限制要求部分列出。
SPIR-V
每个Vulkan的次要版本都映射到必须支持的SPIR-V版本。
-
Vulkan 1.0 支持 SPIR-V 1.0
-
Vulkan 1.1 支持 SPIR-V 1.3 及以下版本
-
Vulkan 1.2 支持 SPIR-V 1.5 及以下版本
-
Vulkan 1.3 支持 SPIR-V 1.6 及以下版本
应用程序有责任确保 VkShaderModule
中的 SPIR-V 版本对于相应的 Vulkan 版本是有效的。