跳转至

Vulkan版本控制

Vulkan使用主要(major)、次要(minor)、补丁(patch)版本控制系统。目前共有 3 个小版本(1.0、1.1、1.2 和 1.3),它们彼此向后兼容。应用程序可以使用vkEnumerateInstanceVersion来检查系统支持的 Vulkan 版本。LunarG还有一个白皮书介绍如何检查支持的版本。

扩展

Vulkan 次要版本升级时,一些扩展会升级为核心版本。当使用较新的 Vulkan 次要版本时,应用程序不需要在创建实例和设备时启用扩展。但是如果想要保持向后兼容性,则需要启用扩展。

有关每个版本的新增内容的摘要,请查看Vulkan发行摘要

结构体和枚举

结构体和枚举依赖使用的头文件,而不是实例或设备的版本。例如,在 Vulkan 1.1 之前,没有结构体VkPhysicalDeviceFeatures2,而是VkPhysicalDeviceFeatures2KHR。在 Vulkan 1.x 版本中,应用程序应在代码中使用VkPhysicalDeviceFeatures2,因为它与最新的标头版本匹配。对比较早的代码中包含VkPhysicalDeviceFeatures2KHR的应用程序,也没关系,因为 Vulkan 头文件中为旧结构和枚举 ( typedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR;) 指定了别名。

使用较新命名的原因是,新的 Vulkan Spec 只会引用VkPhysicalDeviceFeatures2,使用新的命名可以更快速地搜索结构体的使用位置。

函数

由于函数用于与vulkan loader进行交互,因此在小版本之间工作时需要注意。举个例子,让我们看看从 Vulkan 1.0 升级到 Vulkan 1.1 核心扩展的函数vkGetPhysicalDeviceFeatures2KHR。下面是 Vulkan 头文件中两个函数的的声明:

1
2
3
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

Note

vkGetPhysicalDeviceFeatures2KHR函数是在 Vulkan 1.0 作为扩展实现的。

特性

在次要版本之间,可能会添加、删除某些功能特性开关,或将其设为可选或必选项。所有修改的功能特性信息在 Vulkan Spec Core Revisions 章节中描述。

Vulkan Spec Feature Requirements章节可用于查看各次要版本实现的功能列表。

限制

目前,Vulkan 的所有版本都具有相同的最小/最大限制,任何限制的更改都在Vulkan Spec Limit Requirements章节中列出。

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 是对应的有效版本。