设备和队列

一旦 Vulkan 初始化完成,设备和队列是与 Vulkan 实现交互的主要对象。

Vulkan 分离了物理设备和逻辑设备的概念。物理设备通常表示主机可用的单个完整的 Vulkan 实现(不包括实例级功能),其数量是有限的。逻辑设备表示该实现的实例,具有独立于其他逻辑设备的状态和资源。

物理设备由 VkPhysicalDevice 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_HANDLE(VkPhysicalDevice)

物理设备

要检索表示系统中安装的物理设备的物理设备对象列表,请调用

// Provided by VK_VERSION_1_0
VkResult vkEnumeratePhysicalDevices(
    VkInstance                                  instance,
    uint32_t*                                   pPhysicalDeviceCount,
    VkPhysicalDevice*                           pPhysicalDevices);
  • instance 是先前使用 vkCreateInstance 创建的 Vulkan 实例的句柄。

  • pPhysicalDeviceCount 是指向与可用或查询的物理设备数量相关的整数的指针,如下所述。

  • pPhysicalDevices 要么是 NULL,要么是指向 VkPhysicalDevice 句柄数组的指针。

如果 pPhysicalDevicesNULL,则可用物理设备的数量将返回到 pPhysicalDeviceCount 中。否则,pPhysicalDeviceCount **必须**指向应用程序设置为 pPhysicalDevices 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pPhysicalDevices 的句柄数量覆盖。如果 pPhysicalDeviceCount 小于可用物理设备的数量,则最多将写入 pPhysicalDeviceCount 个结构体,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的物理设备都被返回。

有效用法(隐式)
  • VUID-vkEnumeratePhysicalDevices-instance-parameter
    instance **必须**是有效的 VkInstance 句柄

  • VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter
    pPhysicalDeviceCount **必须**是指向 uint32_t 值的有效指针

  • VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter
    如果 pPhysicalDeviceCount 引用的值不为 0,并且 pPhysicalDevices 不为 NULL,则 pPhysicalDevices **必须**是指向 pPhysicalDeviceCountVkPhysicalDevice 句柄数组的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

要查询枚举后的物理设备的常规属性,请调用

// Provided by VK_VERSION_1_0
void vkGetPhysicalDeviceProperties(
    VkPhysicalDevice                            physicalDevice,
    VkPhysicalDeviceProperties*                 pProperties);
  • physicalDevice 是要查询其属性的物理设备的句柄。

  • pProperties 是指向 VkPhysicalDeviceProperties 结构的指针,其中返回属性。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter
    physicalDevice **必须**是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceProperties-pProperties-parameter
    pProperties **必须**是指向 VkPhysicalDeviceProperties 结构的有效指针

VkPhysicalDeviceProperties 结构的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkPhysicalDeviceProperties {
    uint32_t                            apiVersion;
    uint32_t                            driverVersion;
    uint32_t                            vendorID;
    uint32_t                            deviceID;
    VkPhysicalDeviceType                deviceType;
    char                                deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];
    uint8_t                             pipelineCacheUUID[VK_UUID_SIZE];
    VkPhysicalDeviceLimits              limits;
    VkPhysicalDeviceSparseProperties    sparseProperties;
} VkPhysicalDeviceProperties;
  • apiVersion 是设备支持的 Vulkan 版本,按照 版本号 中所述进行编码。

  • driverVersion 是驱动程序供应商指定的版本。

  • vendorID 是物理设备供应商(见下文)的唯一标识符。

  • deviceID 是供应商提供的可用设备中物理设备的唯一标识符。

  • deviceType 是指定设备类型的 VkPhysicalDeviceType

  • deviceName 是一个包含设备名称的以 null 结尾的 UTF-8 字符串的 VK_MAX_PHYSICAL_DEVICE_NAME_SIZE char 数组。

  • pipelineCacheUUID 是一个包含设备通用唯一标识符的 VK_UUID_SIZEuint8_t 值的数组。

  • limits 是指定物理设备的设备特定限制的 VkPhysicalDeviceLimits 结构。有关详细信息,请参见 限制

  • sparseProperties 是指定物理设备的各种稀疏相关属性的 VkPhysicalDeviceSparseProperties 结构。有关详细信息,请参见 稀疏属性

apiVersion 的值可能vkEnumerateInstanceVersion 返回的版本不同;可能更高或更低。在这种情况下,应用程序必须不使用超出与给定对象关联的 Vulkan 版本的任何功能。 vkEnumerateInstanceVersion 返回的 pApiVersion 参数是与 VkInstance 及其子对象关联的版本,除了 VkPhysicalDevice 及其子对象。 VkPhysicalDeviceProperties::apiVersion 是与 VkPhysicalDevice 及其子对象关联的版本。

driverVersion 的编码是实现定义的。它可能不使用与 apiVersion 相同的编码。应用程序应遵循供应商关于如何从 driverVersion 中提取版本信息的信息。

在声明支持 Roadmap 2022 配置文件的实现中,apiVersion 表示的主版本和次版本必须至少为 Vulkan 1.3。

提供 vendorIDdeviceID 字段是为了允许应用程序适应其他 Vulkan 查询无法充分暴露的设备特性。

这些可能包括性能配置文件、硬件勘误或其他特性。

vendorID 标识的供应商负责所查询的 VkPhysicalDevice 的底层实现的最显著特性。

例如,在离散 GPU 实现的情况下,这应该是 GPU 芯片组供应商。在集成到片上系统 (SoC) 中的硬件加速器的情况下,这应该是用于创建加速器的硅 IP 的供应商。

如果供应商有 PCI 供应商 ID,则 vendorID 的低 16 位必须包含该 PCI 供应商 ID,其余位必须为零。否则,返回的值必须是有效的 Khronos 供应商 ID,如 Vulkan 文档和扩展:过程和约定文档中“向 Khronos 注册供应商 ID”部分所述。 Khronos 供应商 ID 的分配起始于 0x10000,以便将它们与 PCI 供应商 ID 命名空间区分开。 Khronos 供应商 ID 在 VkVendorId 类型中以符号方式定义。

供应商还负责 deviceID 中返回的值。如果实现主要由具有 PCI 设备 IDPCI 设备驱动,则 deviceID 的低 16 位必须包含该 PCI 设备 ID,其余位必须为零。否则,返回哪些值的选择可能由操作系统或平台策略决定 - 但应该唯一地标识设备版本和任何主要配置选项(例如,多核设备情况下的核心数)。

对于该设备版本和配置的所有物理实现,应该使用相同的设备 ID。例如,特定硅 IP GPU 版本和配置的所有使用应该使用相同的设备 ID,即使这些使用发生在不同的 SoC 中。

VkPhysicalDeviceProperties::vendorID可能返回的 Khronos 供应商 ID 为

// Provided by VK_VERSION_1_0
typedef enum VkVendorId {
    VK_VENDOR_ID_KHRONOS = 0x10000,
    VK_VENDOR_ID_VIV = 0x10001,
    VK_VENDOR_ID_VSI = 0x10002,
    VK_VENDOR_ID_KAZAN = 0x10003,
    VK_VENDOR_ID_CODEPLAY = 0x10004,
    VK_VENDOR_ID_MESA = 0x10005,
    VK_VENDOR_ID_POCL = 0x10006,
    VK_VENDOR_ID_MOBILEYE = 0x10007,
} VkVendorId;

供应商可以随时分配 Khronos 供应商 ID。只有本规范、相应的 vk.xml API 注册表以及相应的 vulkan_core.h 头文件的最新规范版本必须包含所有保留的 Khronos 供应商 ID。

目前仅给出 Khronos 供应商 ID 的符号名称。实现返回的 PCI 供应商 ID 可以在 PCI-SIG 数据库中查找。

VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 是包含物理设备名称字符串的数组中 char 值的长度,如在 VkPhysicalDeviceProperties::deviceName 中返回的。

#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE  256U

VkPhysicalDeviceProperties::deviceType可能返回的物理设备类型为

// Provided by VK_VERSION_1_0
typedef enum VkPhysicalDeviceType {
    VK_PHYSICAL_DEVICE_TYPE_OTHER = 0,
    VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1,
    VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2,
    VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3,
    VK_PHYSICAL_DEVICE_TYPE_CPU = 4,
} VkPhysicalDeviceType;
  • VK_PHYSICAL_DEVICE_TYPE_OTHER - 该设备与任何其他可用类型都不匹配。

  • VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU - 该设备通常是嵌入在主机中或与主机紧密耦合的设备。

  • VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU - 该设备通常是通过互连连接到主机的独立处理器。

  • VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU - 该设备通常是虚拟化环境中的虚拟节点。

  • VK_PHYSICAL_DEVICE_TYPE_CPU - 该设备通常与主机在同一处理器上运行。

公开物理设备类型仅用于提供信息,不会直接影响系统的运行。但是,设备类型可能与系统的其他已公开属性或功能(例如,内存堆的数量)相关。

要查询枚举后的物理设备的常规属性,请调用

// Provided by VK_VERSION_1_1
void vkGetPhysicalDeviceProperties2(
    VkPhysicalDevice                            physicalDevice,
    VkPhysicalDeviceProperties2*                pProperties);

或等效命令

// Provided by VK_KHR_get_physical_device_properties2
void vkGetPhysicalDeviceProperties2KHR(
    VkPhysicalDevice                            physicalDevice,
    VkPhysicalDeviceProperties2*                pProperties);
  • physicalDevice 是要查询其属性的物理设备的句柄。

  • pProperties 是指向 VkPhysicalDeviceProperties2 结构的指针,该结构中返回属性。

pProperties 中的每个结构及其 pNext 链都包含与实现相关的属性、行为或限制对应的成员。vkGetPhysicalDeviceProperties2 填充每个成员以指定实现的对应值。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter
    physicalDevice **必须**是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter
    pProperties 必须是指向 VkPhysicalDeviceProperties2 结构的有效指针

VkPhysicalDeviceProperties2 结构定义为

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceProperties2 {
    VkStructureType               sType;
    void*                         pNext;
    VkPhysicalDeviceProperties    properties;
} VkPhysicalDeviceProperties2;

或等效结构

// Provided by VK_KHR_get_physical_device_properties2
typedef VkPhysicalDeviceProperties2 VkPhysicalDeviceProperties2KHR;

此结构的 pNext 链用于使用扩展定义的属性来扩展该结构。

有效用法(隐式)

VkPhysicalDeviceVulkan11Properties 结构定义为

// Provided by VK_VERSION_1_2
typedef struct VkPhysicalDeviceVulkan11Properties {
    VkStructureType            sType;
    void*                      pNext;
    uint8_t                    deviceUUID[VK_UUID_SIZE];
    uint8_t                    driverUUID[VK_UUID_SIZE];
    uint8_t                    deviceLUID[VK_LUID_SIZE];
    uint32_t                   deviceNodeMask;
    VkBool32                   deviceLUIDValid;
    uint32_t                   subgroupSize;
    VkShaderStageFlags         subgroupSupportedStages;
    VkSubgroupFeatureFlags     subgroupSupportedOperations;
    VkBool32                   subgroupQuadOperationsInAllStages;
    VkPointClippingBehavior    pointClippingBehavior;
    uint32_t                   maxMultiviewViewCount;
    uint32_t                   maxMultiviewInstanceIndex;
    VkBool32                   protectedNoFault;
    uint32_t                   maxPerSetDescriptors;
    VkDeviceSize               maxMemoryAllocationSize;
} VkPhysicalDeviceVulkan11Properties;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • deviceUUID 是一个包含 VK_UUID_SIZEuint8_t 值的数组,表示设备的通用唯一标识符。

  • driverUUID 是一个包含 VK_UUID_SIZEuint8_t 值的数组,表示设备正在使用的驱动程序构建版本的通用唯一标识符。

  • deviceLUID 是一个包含 VK_LUID_SIZEuint8_t 值的数组,表示设备的本地唯一标识符。

  • deviceNodeMask 是一个 uint32_t 位域,标识链接设备适配器中与该设备对应的节点。

  • deviceLUIDValid 是一个布尔值,如果 deviceLUID 包含有效的 LUID 并且 deviceNodeMask 包含有效的节点掩码,则为 VK_TRUE;否则为 VK_FALSE

  • subgroupSize 是每个子组中调用的默认数量。如果物理设备的任何队列支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 subgroupSize 至少为 1。subgroupSize 是 2 的幂。

  • subgroupSupportedStages 是一个 VkShaderStageFlagBits 的位域,描述了 组操作 中支持 子组作用域 的着色器阶段。如果物理设备的任何队列支持 VK_QUEUE_COMPUTE_BIT,则 subgroupSupportedStages 将设置 VK_SHADER_STAGE_COMPUTE_BIT 位。

  • subgroupSupportedOperations 是一个 VkSubgroupFeatureFlagBits 的位掩码,指定此设备上支持的具有 子组作用域组操作 集合。如果物理设备的任何队列支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 subgroupSupportedOperations 将设置 VK_SUBGROUP_FEATURE_BASIC_BIT 位。

  • subgroupQuadOperationsInAllStages 是一个布尔值,指定 四元组组操作 是否在所有阶段都可用,或者是否仅限于片段和计算阶段。

  • pointClippingBehavior 是一个 VkPointClippingBehavior 值,指定实现支持的点裁剪行为。

  • maxMultiviewViewCount 比子通道中可以使用的最大视图索引大 1。

  • maxMultiviewInstanceIndex 是允许由多视图渲染通道实例的子通道中记录的绘制命令生成的实例索引的最大有效值。

  • protectedNoFault 指定当应用程序尝试在受保护的队列操作中写入非受保护的内存、在非受保护的队列操作中从受保护的内存读取或在受保护的队列操作中执行查询时,实现的行为。如果此限制为 VK_TRUE,则此类写入将被丢弃或写入未定义的值,读取和查询将返回未定义的值。如果此限制为 VK_FALSE,则应用程序必须不执行这些操作。有关更多信息,请参阅受保护的内存访问规则

  • maxPerSetDescriptors 是单个描述符集中(所有描述符类型之和)描述符的最大数量,保证满足对描述符集本身大小的任何实现相关的约束。应用程序可以使用 vkGetDescriptorSetLayoutSupport 查询是否支持超出此限制的描述符集。

  • maxMemoryAllocationSize 是可以创建的最大内存分配大小,即使堆中有更多可用空间。如果 VkMemoryAllocateInfo::allocationSize 大于此值,则可能返回错误 VK_ERROR_OUT_OF_DEVICE_MEMORY

如果 VkPhysicalDeviceVulkan11Properties 结构包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则它将填充每个相应的实现相关的属性。

这些属性对应于 Vulkan 1.1 功能。

此结构的 subgroupSupportedStagessubgroupSupportedOperationssubgroupQuadOperationsInAllStages 成员分别对应于 VkPhysicalDeviceSubgroupProperties::supportedStagesVkPhysicalDeviceSubgroupProperties::supportedOperationsVkPhysicalDeviceSubgroupProperties::quadOperationsInAllStages 成员,但会在成员名称中添加 subgroup 前缀。

有效用法(隐式)
  • VUID-VkPhysicalDeviceVulkan11Properties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES

VkPhysicalDeviceVulkan12Properties 结构定义如下

// Provided by VK_VERSION_1_2
typedef struct VkPhysicalDeviceVulkan12Properties {
    VkStructureType                      sType;
    void*                                pNext;
    VkDriverId                           driverID;
    char                                 driverName[VK_MAX_DRIVER_NAME_SIZE];
    char                                 driverInfo[VK_MAX_DRIVER_INFO_SIZE];
    VkConformanceVersion                 conformanceVersion;
    VkShaderFloatControlsIndependence    denormBehaviorIndependence;
    VkShaderFloatControlsIndependence    roundingModeIndependence;
    VkBool32                             shaderSignedZeroInfNanPreserveFloat16;
    VkBool32                             shaderSignedZeroInfNanPreserveFloat32;
    VkBool32                             shaderSignedZeroInfNanPreserveFloat64;
    VkBool32                             shaderDenormPreserveFloat16;
    VkBool32                             shaderDenormPreserveFloat32;
    VkBool32                             shaderDenormPreserveFloat64;
    VkBool32                             shaderDenormFlushToZeroFloat16;
    VkBool32                             shaderDenormFlushToZeroFloat32;
    VkBool32                             shaderDenormFlushToZeroFloat64;
    VkBool32                             shaderRoundingModeRTEFloat16;
    VkBool32                             shaderRoundingModeRTEFloat32;
    VkBool32                             shaderRoundingModeRTEFloat64;
    VkBool32                             shaderRoundingModeRTZFloat16;
    VkBool32                             shaderRoundingModeRTZFloat32;
    VkBool32                             shaderRoundingModeRTZFloat64;
    uint32_t                             maxUpdateAfterBindDescriptorsInAllPools;
    VkBool32                             shaderUniformBufferArrayNonUniformIndexingNative;
    VkBool32                             shaderSampledImageArrayNonUniformIndexingNative;
    VkBool32                             shaderStorageBufferArrayNonUniformIndexingNative;
    VkBool32                             shaderStorageImageArrayNonUniformIndexingNative;
    VkBool32                             shaderInputAttachmentArrayNonUniformIndexingNative;
    VkBool32                             robustBufferAccessUpdateAfterBind;
    VkBool32                             quadDivergentImplicitLod;
    uint32_t                             maxPerStageDescriptorUpdateAfterBindSamplers;
    uint32_t                             maxPerStageDescriptorUpdateAfterBindUniformBuffers;
    uint32_t                             maxPerStageDescriptorUpdateAfterBindStorageBuffers;
    uint32_t                             maxPerStageDescriptorUpdateAfterBindSampledImages;
    uint32_t                             maxPerStageDescriptorUpdateAfterBindStorageImages;
    uint32_t                             maxPerStageDescriptorUpdateAfterBindInputAttachments;
    uint32_t                             maxPerStageUpdateAfterBindResources;
    uint32_t                             maxDescriptorSetUpdateAfterBindSamplers;
    uint32_t                             maxDescriptorSetUpdateAfterBindUniformBuffers;
    uint32_t                             maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
    uint32_t                             maxDescriptorSetUpdateAfterBindStorageBuffers;
    uint32_t                             maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
    uint32_t                             maxDescriptorSetUpdateAfterBindSampledImages;
    uint32_t                             maxDescriptorSetUpdateAfterBindStorageImages;
    uint32_t                             maxDescriptorSetUpdateAfterBindInputAttachments;
    VkResolveModeFlags                   supportedDepthResolveModes;
    VkResolveModeFlags                   supportedStencilResolveModes;
    VkBool32                             independentResolveNone;
    VkBool32                             independentResolve;
    VkBool32                             filterMinmaxSingleComponentFormats;
    VkBool32                             filterMinmaxImageComponentMapping;
    uint64_t                             maxTimelineSemaphoreValueDifference;
    VkSampleCountFlags                   framebufferIntegerColorSampleCounts;
} VkPhysicalDeviceVulkan12Properties;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • driverID 是物理设备驱动程序的唯一标识符。

  • driverName 是一个包含 VK_MAX_DRIVER_NAME_SIZEchar 的数组,其中包含以 null 结尾的 UTF-8 字符串,该字符串是驱动程序的名称。

  • driverInfo 是一个包含 VK_MAX_DRIVER_INFO_SIZEchar 的数组,其中包含以 null 结尾的 UTF-8 字符串,其中包含有关驱动程序的其他信息。

  • conformanceVersion 是实施者在发布之前成功测试此驱动程序所依据的最新版本 Vulkan 一致性测试(请参阅 VkConformanceVersion)。

  • denormBehaviorIndependence 是一个 VkShaderFloatControlsIndependence 值,指示是否以及如何为不同的位宽独立设置非规范化行为。

  • roundingModeIndependence 是一个 VkShaderFloatControlsIndependence 值,指示是否以及如何为不同的位宽独立设置舍入模式。

  • shaderSignedZeroInfNanPreserveFloat16 是一个布尔值,指示在 16 位浮点计算中是否可以保留零的符号、Nan 值和 。它还指示 SignedZeroInfNanPreserve 执行模式是否可以用于 16 位浮点类型。

  • shaderSignedZeroInfNanPreserveFloat32 是一个布尔值,指示在 32 位浮点计算中是否可以保留零的符号、Nan 值和 。它还指示 SignedZeroInfNanPreserve 执行模式是否可以用于 32 位浮点类型。

  • shaderSignedZeroInfNanPreserveFloat64 是一个布尔值,指示在 64 位浮点计算中是否可以保留零的符号、Nan 值和 。它还指示 SignedZeroInfNanPreserve 执行模式是否可以用于 64 位浮点类型。

  • shaderDenormPreserveFloat16 是一个布尔值,指示在 16 位浮点计算中是否可以保留非正规数。它还指示 DenormPreserve 执行模式是否可以用于 16 位浮点类型。

  • shaderDenormPreserveFloat32 是一个布尔值,指示在 32 位浮点计算中是否可以保留非正规数。它还指示 DenormPreserve 执行模式是否可以用于 32 位浮点类型。

  • shaderDenormPreserveFloat64 是一个布尔值,指示在 64 位浮点计算中是否可以保留非正规数。它还指示 DenormPreserve 执行模式是否可以用于 64 位浮点类型。

  • shaderDenormFlushToZeroFloat16 是一个布尔值,指示在 16 位浮点计算中是否可以将非正规数刷新为零。它还指示 DenormFlushToZero 执行模式是否可以用于 16 位浮点类型。

  • shaderDenormFlushToZeroFloat32 是一个布尔值,指示在 32 位浮点计算中是否可以将非正规数刷新为零。它还指示 DenormFlushToZero 执行模式是否可以用于 32 位浮点类型。

  • shaderDenormFlushToZeroFloat64 是一个布尔值,指示在 64 位浮点计算中是否可以将非正规数刷新为零。它还指示 DenormFlushToZero 执行模式是否可以用于 64 位浮点类型。

  • shaderRoundingModeRTEFloat16 是一个布尔值,指示实现是否支持 16 位浮点算术和转换指令的舍入到最近偶数舍入模式。它还指示 RoundingModeRTE 执行模式是否可以用于 16 位浮点类型。

  • shaderRoundingModeRTEFloat32 是一个布尔值,指示实现是否支持 32 位浮点算术和转换指令的舍入到最近偶数舍入模式。它还指示 RoundingModeRTE 执行模式是否可以用于 32 位浮点类型。

  • shaderRoundingModeRTEFloat64 是一个布尔值,指示实现是否支持 64 位浮点算术和转换指令的舍入到最近偶数舍入模式。它还指示 RoundingModeRTE 执行模式是否可以用于 64 位浮点类型。

  • shaderRoundingModeRTZFloat16 是一个布尔值,指示实现是否支持 16 位浮点算术和转换指令的向零舍入模式。 它还指示 RoundingModeRTZ 执行模式是否可以用于 16 位浮点类型。

  • shaderRoundingModeRTZFloat32 是一个布尔值,指示实现是否支持 32 位浮点算术和转换指令的向零舍入模式。 它还指示 RoundingModeRTZ 执行模式是否可以用于 32 位浮点类型。

  • shaderRoundingModeRTZFloat64 是一个布尔值,指示实现是否支持 64 位浮点算术和转换指令的向零舍入模式。 它还指示 RoundingModeRTZ 执行模式是否可以用于 64 位浮点类型。

  • maxUpdateAfterBindDescriptorsInAllPools 是所有使用设置了 VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT 位创建的池中,可以创建的最大描述符数量(所有描述符类型的总和)。 当超过此限制时,或者当此限制表示的空间由于碎片而无法满足池创建时,池创建可能会失败。

  • shaderUniformBufferArrayNonUniformIndexingNative 是一个布尔值,指示统一缓冲区描述符是否原生支持非统一索引。 如果为 VK_FALSE,则对统一缓冲区数组进行非统一索引的指令的单个动态实例可能会执行多次,以便访问所有描述符。

  • shaderSampledImageArrayNonUniformIndexingNative 是一个布尔值,指示采样器和图像描述符是否原生支持非统一索引。 如果为 VK_FALSE,则对采样器或图像数组进行非统一索引的指令的单个动态实例可能会执行多次,以便访问所有描述符。

  • shaderStorageBufferArrayNonUniformIndexingNative 是一个布尔值,指示存储缓冲区描述符是否原生支持非统一索引。 如果为 VK_FALSE,则对存储缓冲区数组进行非统一索引的指令的单个动态实例可能会执行多次,以便访问所有描述符。

  • shaderStorageImageArrayNonUniformIndexingNative 是一个布尔值,指示存储图像描述符是否原生支持非统一索引。 如果为 VK_FALSE,则对存储图像数组进行非统一索引的指令的单个动态实例可能会执行多次,以便访问所有描述符。

  • shaderInputAttachmentArrayNonUniformIndexingNative 是一个布尔值,指示输入附件描述符是否原生支持非统一索引。 如果为 VK_FALSE,则对输入附件数组进行非统一索引的指令的单个动态实例可能会执行多次,以便访问所有描述符。

  • robustBufferAccessUpdateAfterBind 是一个布尔值,指示 robustBufferAccess 是否可以在设备上与 descriptorBindingUniformBufferUpdateAfterBinddescriptorBindingStorageBufferUpdateAfterBinddescriptorBindingUniformTexelBufferUpdateAfterBind 和/或 descriptorBindingStorageTexelBufferUpdateAfterBind 同时启用。 如果为 VK_FALSE,则必须禁用 robustBufferAccess,或者必须禁用所有这些更新后绑定功能。

  • quadDivergentImplicitLod 是一个布尔值,指示当用于指令的图像和/或采样器对象在四边形内不均匀时,图像操作的隐式 LOD 计算是否具有明确定义的结果。请参阅导数图像操作

  • maxPerStageDescriptorUpdateAfterBindSamplers 类似于 maxPerStageDescriptorSamplers,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxPerStageDescriptorUpdateAfterBindUniformBuffers 类似于 maxPerStageDescriptorUniformBuffers,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxPerStageDescriptorUpdateAfterBindStorageBuffers 类似于 maxPerStageDescriptorStorageBuffers,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxPerStageDescriptorUpdateAfterBindSampledImages 类似于 maxPerStageDescriptorSampledImages,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxPerStageDescriptorUpdateAfterBindStorageImages 类似于 maxPerStageDescriptorStorageImages,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxPerStageDescriptorUpdateAfterBindInputAttachments 类似于 maxPerStageDescriptorInputAttachments,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxPerStageUpdateAfterBindResources 类似于 maxPerStageResources,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxDescriptorSetUpdateAfterBindSamplers 类似于 maxDescriptorSetSamplers,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxDescriptorSetUpdateAfterBindUniformBuffers 类似于 maxDescriptorSetUniformBuffers,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxDescriptorSetUpdateAfterBindUniformBuffersDynamic 类似于 maxDescriptorSetUniformBuffersDynamic,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。 虽然应用程序可以从使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 创建的池中分配动态统一缓冲区描述符,但这些描述符的绑定必须不能存在于任何包含使用 VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT 创建的绑定的描述符集布局中。

  • maxDescriptorSetUpdateAfterBindStorageBuffers 类似于 maxDescriptorSetStorageBuffers,但会计算从使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中获取的描述符。

  • maxDescriptorSetUpdateAfterBindStorageBuffersDynamicmaxDescriptorSetStorageBuffersDynamic 类似,但它会计算使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中的描述符。虽然应用程序可以从使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 创建的池中分配动态存储缓冲区描述符,但这些描述符的绑定必须不存在于任何包含使用 VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT 创建的绑定的描述符集布局中。

  • maxDescriptorSetUpdateAfterBindSampledImagesmaxDescriptorSetSampledImages 类似,但它会计算使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中的描述符。

  • maxDescriptorSetUpdateAfterBindStorageImagesmaxDescriptorSetStorageImages 类似,但它会计算使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中的描述符。

  • maxDescriptorSetUpdateAfterBindInputAttachmentsmaxDescriptorSetInputAttachments 类似,但它会计算使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中的描述符。

  • supportedDepthResolveModes 是一个 VkResolveModeFlagBits 的位掩码,指示支持的深度解析模式集合。VK_RESOLVE_MODE_SAMPLE_ZERO_BIT 必须包含在该集合中,但实现可以支持其他模式。

  • supportedStencilResolveModes 是一个 VkResolveModeFlagBits 的位掩码,指示支持的模板解析模式集合。VK_RESOLVE_MODE_SAMPLE_ZERO_BIT 必须包含在该集合中,但实现可以支持其他模式。VK_RESOLVE_MODE_AVERAGE_BIT 必须不包含在该集合中。

  • 如果当深度和模板解析模式之一为 VK_RESOLVE_MODE_NONE 时,实现支持将深度和模板解析模式设置为不同的值,则 independentResolveNoneVK_TRUE。否则,实现仅支持将两种模式设置为相同的值。

  • 如果实现支持所有支持的深度和模板解析模式的组合,包括将深度或模板解析模式设置为 VK_RESOLVE_MODE_NONE,则 independentResolveVK_TRUE。支持 independentResolve 的实现必须也支持 independentResolveNone

  • filterMinmaxSingleComponentFormats 是一个布尔值,指示是否有一组最小的所需格式支持最小/最大滤波。

  • filterMinmaxImageComponentMapping 是一个布尔值,指示在执行最小/最大滤波时,实现是否支持图像的非恒等组件映射。

  • maxTimelineSemaphoreValueDifference 指示实现允许的时间线信号量当前值与任何挂起的信号或等待操作之间的最大差异。

  • framebufferIntegerColorSampleCounts 是一个 VkSampleCountFlagBits 的位掩码,指示所有使用整数格式的帧缓冲区颜色附件支持的颜色采样计数。

如果 VkPhysicalDeviceVulkan12Properties 结构包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则会填充每个对应的实现相关的属性。

这些属性对应于 Vulkan 1.2 功能。

有效用法(隐式)
  • VUID-VkPhysicalDeviceVulkan12Properties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES

VkPhysicalDeviceVulkan13Properties 结构的定义如下

// Provided by VK_VERSION_1_3
typedef struct VkPhysicalDeviceVulkan13Properties {
    VkStructureType       sType;
    void*                 pNext;
    uint32_t              minSubgroupSize;
    uint32_t              maxSubgroupSize;
    uint32_t              maxComputeWorkgroupSubgroups;
    VkShaderStageFlags    requiredSubgroupSizeStages;
    uint32_t              maxInlineUniformBlockSize;
    uint32_t              maxPerStageDescriptorInlineUniformBlocks;
    uint32_t              maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks;
    uint32_t              maxDescriptorSetInlineUniformBlocks;
    uint32_t              maxDescriptorSetUpdateAfterBindInlineUniformBlocks;
    uint32_t              maxInlineUniformTotalSize;
    VkBool32              integerDotProduct8BitUnsignedAccelerated;
    VkBool32              integerDotProduct8BitSignedAccelerated;
    VkBool32              integerDotProduct8BitMixedSignednessAccelerated;
    VkBool32              integerDotProduct4x8BitPackedUnsignedAccelerated;
    VkBool32              integerDotProduct4x8BitPackedSignedAccelerated;
    VkBool32              integerDotProduct4x8BitPackedMixedSignednessAccelerated;
    VkBool32              integerDotProduct16BitUnsignedAccelerated;
    VkBool32              integerDotProduct16BitSignedAccelerated;
    VkBool32              integerDotProduct16BitMixedSignednessAccelerated;
    VkBool32              integerDotProduct32BitUnsignedAccelerated;
    VkBool32              integerDotProduct32BitSignedAccelerated;
    VkBool32              integerDotProduct32BitMixedSignednessAccelerated;
    VkBool32              integerDotProduct64BitUnsignedAccelerated;
    VkBool32              integerDotProduct64BitSignedAccelerated;
    VkBool32              integerDotProduct64BitMixedSignednessAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating8BitUnsignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating8BitSignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating16BitUnsignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating16BitSignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating32BitUnsignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating32BitSignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating64BitUnsignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating64BitSignedAccelerated;
    VkBool32              integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated;
    VkDeviceSize          storageTexelBufferOffsetAlignmentBytes;
    VkBool32              storageTexelBufferOffsetSingleTexelAlignment;
    VkDeviceSize          uniformTexelBufferOffsetAlignmentBytes;
    VkBool32              uniformTexelBufferOffsetSingleTexelAlignment;
    VkDeviceSize          maxBufferSize;
} VkPhysicalDeviceVulkan13Properties;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • minSubgroupSize 是此设备支持的最小子组大小。如果任何物理设备的队列支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 minSubgroupSize 至少为 1。minSubgroupSize 是 2 的幂。minSubgroupSize 小于或等于 maxSubgroupSizeminSubgroupSize 小于或等于 subgroupSize

  • maxSubgroupSize 是此设备支持的最大子组大小。如果任何物理设备的队列支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 maxSubgroupSize 至少为 1。maxSubgroupSize 是 2 的幂。maxSubgroupSize 大于或等于 minSubgroupSizemaxSubgroupSize 大于或等于 subgroupSize

  • maxComputeWorkgroupSubgroups 是一个工作组内实现支持的最大子组数量。

  • requiredSubgroupSizeStages 是一个位域,表示哪些着色器阶段支持指定所需的子组大小。

  • maxInlineUniformBlockSize 是一个 内联统一块绑定的最大字节大小。

  • maxPerStageDescriptorInlineUniformBlocks 是管道布局中单个着色器阶段可以访问的最大内联统一块绑定数量。描述符类型为 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK 的描述符绑定计入此限制。只有在不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集布局中的描述符绑定才计入此限制。

  • maxPerStageDescriptorUpdateAfterBindInlineUniformBlocksmaxPerStageDescriptorInlineUniformBlocks 类似,但它会计算使用或不使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位设置创建的描述符集中的描述符绑定。

  • maxDescriptorSetInlineUniformBlocks 是管道布局中所有管道着色器阶段和描述符集编号中,描述符绑定中可以包含的内联统一块绑定的最大数量。描述符类型为 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK 的描述符绑定会计入此限制。只有在创建描述符集布局时没有设置 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位的情况下,描述符绑定才会计入此限制。

  • maxDescriptorSetUpdateAfterBindInlineUniformBlocksmaxDescriptorSetInlineUniformBlocks 类似,但它会统计通过设置或不设置 VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT 位创建的描述符集中的描述符绑定。

  • maxInlineUniformTotalSize 是管道布局中所有管道着色器阶段和描述符集编号中,可以包含的所有内联统一块绑定的最大总大小(以字节为单位)。描述符类型为 VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK 的描述符绑定会计入此限制。

  • integerDotProduct8BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 8 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct8BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 8 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct8BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 8 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct4x8BitPackedUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct4x8BitPackedSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct4x8BitPackedMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct16BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 16 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct16BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 16 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct16BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 16 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct32BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 32 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct32BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 32 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct32BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 32 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct64BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 64 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct64BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 64 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct64BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 64 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating8BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 8 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating8BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 8 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 8 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating16BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 16 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating16BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 16 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 16 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating32BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 32 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating32BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 32 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 32 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating64BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 64 位无符号累积饱和点积运算得到加速,则为 VK_TRUE定义如下

  • integerDotProductAccumulatingSaturating64BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 64 位有符号累积饱和点积运算得到加速,则为 VK_TRUE定义如下

  • integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 64 位混合符号累积饱和点积运算得到加速,则为 VK_TRUE定义如下

  • storageTexelBufferOffsetAlignmentBytes 是一个字节对齐值,它足以满足任何格式的存储纹理缓冲区的要求。该值必须是 2 的幂。

  • storageTexelBufferOffsetSingleTexelAlignment 指示对于任何格式的存储纹理缓冲区,单纹素对齐是否足够。

  • uniformTexelBufferOffsetAlignmentBytes 是一个字节对齐值,它足以满足任何格式的统一纹理缓冲区的要求。该值必须是 2 的幂。

  • uniformTexelBufferOffsetSingleTexelAlignment 指示对于任何格式的统一纹理缓冲区,单纹素对齐是否足够。

  • maxBufferSize可以创建的 VkBuffer 的最大大小。

如果 VkPhysicalDeviceVulkan13Properties 结构包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则它将填充每个对应的、依赖于实现的属性。

这些属性对应于 Vulkan 1.3 的功能。

VkPhysicalDeviceVulkan13Properties 的成员必须VkPhysicalDeviceInlineUniformBlockPropertiesVkPhysicalDeviceSubgroupSizeControlProperties 的相应成员具有相同的值。

有效用法(隐式)
  • VUID-VkPhysicalDeviceVulkan13Properties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES

VkPhysicalDeviceVulkan14Properties 结构定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkPhysicalDeviceVulkan14Properties {
    VkStructureType                       sType;
    void*                                 pNext;
    uint32_t                              lineSubPixelPrecisionBits;
    uint32_t                              maxVertexAttribDivisor;
    VkBool32                              supportsNonZeroFirstInstance;
    uint32_t                              maxPushDescriptors;
    VkBool32                              dynamicRenderingLocalReadDepthStencilAttachments;
    VkBool32                              dynamicRenderingLocalReadMultisampledAttachments;
    VkBool32                              earlyFragmentMultisampleCoverageAfterSampleCounting;
    VkBool32                              earlyFragmentSampleMaskTestBeforeSampleCounting;
    VkBool32                              depthStencilSwizzleOneSupport;
    VkBool32                              polygonModePointSize;
    VkBool32                              nonStrictSinglePixelWideLinesUseParallelogram;
    VkBool32                              nonStrictWideLinesUseParallelogram;
    VkBool32                              blockTexelViewCompatibleMultipleLayers;
    uint32_t                              maxCombinedImageSamplerDescriptorCount;
    VkBool32                              fragmentShadingRateClampCombinerInputs;
    VkPipelineRobustnessBufferBehavior    defaultRobustnessStorageBuffers;
    VkPipelineRobustnessBufferBehavior    defaultRobustnessUniformBuffers;
    VkPipelineRobustnessBufferBehavior    defaultRobustnessVertexInputs;
    VkPipelineRobustnessImageBehavior     defaultRobustnessImages;
    uint32_t                              copySrcLayoutCount;
    VkImageLayout*                        pCopySrcLayouts;
    uint32_t                              copyDstLayoutCount;
    VkImageLayout*                        pCopyDstLayouts;
    uint8_t                               optimalTilingLayoutUUID[VK_UUID_SIZE];
    VkBool32                              identicalMemoryTypeRequirements;
} VkPhysicalDeviceVulkan14Properties;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • lineSubPixelPrecisionBits 是光栅化线段时,帧缓冲坐标 xfyf 中的亚像素精度位数。

  • maxVertexAttribDivisor 是启用实例化渲染时,重复顶点属性数据值的实例数的最大值。

  • supportsNonZeroFirstInstance 指定当 VkVertexInputBindingDivisorDescription::divisor 不为 1 时,是否支持绘制命令firstInstance 参数的非零值。

  • maxPushDescriptors 是使用设置了 VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT 创建的描述符集布局中可以使用的最大描述符数。

  • dynamicRenderingLocalReadDepthStencilAttachments 如果实现支持深度/模板附件的本地读取,则为 VK_TRUE,否则为 VK_FALSE

  • dynamicRenderingLocalReadMultisampledAttachments 如果实现支持多采样附件的本地读取,则为 VK_TRUE,否则为 VK_FALSE

  • earlyFragmentMultisampleCoverageAfterSampleCounting 是一个布尔值,指示对于使用 EarlyFragmentTests 执行模式的片段着色器,在采样计数之后是否执行片段着色多采样覆盖率操作。

  • earlyFragmentSampleMaskTestBeforeSampleCounting 是一个布尔值,指示对于使用 EarlyFragmentTests 执行模式的片段着色器,在采样计数之前是否执行采样掩码测试操作。

  • depthStencilSwizzleOneSupport 是一个布尔值,指示使用 VK_COMPONENT_SWIZZLE_ONE 的深度/模板纹理操作具有已定义行为。

  • polygonModePointSize 是一个布尔值,指示具有 VK_POLYGON_MODE_POINT 的多边形的最终光栅化的点大小是否由 PointSize 控制。

  • nonStrictSinglePixelWideLinesUseParallelogram 是一个布尔值,指示宽度为 1.0 的非严格线是否光栅化为平行四边形或使用 Bresenham 算法。

  • nonStrictWideLinesUseParallelogram 是一个布尔值,指示宽度大于 1.0 的非严格线是否光栅化为平行四边形或使用 Bresenham 算法。

  • blockTexelViewCompatibleMultipleLayers 是一个布尔值,指示实现是否支持创建具有 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 的图像视图,其中 subresourceRangelayerCount 成员大于 1

  • maxCombinedImageSamplerDescriptorCount 是实现用于访问实现支持的需要采样器 Y′CBCR 转换的格式的组合图像采样器描述符的最大数量。

  • fragmentShadingRateClampCombinerInputs 是一个布尔值,指示实现是否将组合器操作的输入钳制。

  • defaultRobustnessStorageBuffers 描述当未启用任何鲁棒性功能时,对存储缓冲区进行的越界访问的行为。

  • defaultRobustnessUniformBuffers 描述当未启用任何鲁棒性功能时,对统一缓冲区进行的越界访问的行为。

  • defaultRobustnessVertexInputs 描述当未启用任何鲁棒性功能时,对顶点输入属性进行的越界访问的行为。

  • defaultRobustnessImages 描述当未启用任何鲁棒性功能时,对图像进行的越界访问的行为。

  • copySrcLayoutCount 是一个整数,与下面描述的用于从图像进行主机复制的可用或查询的图像布局的数量有关。

  • pCopySrcLayouts 是一个指向 VkImageLayout 数组的指针,其中返回支持从图像进行主机复制操作的图像布局。

  • copyDstLayoutCount 是一个整数,与下面描述的用于向图像进行主机复制的可用或查询的图像布局的数量有关。

  • pCopyDstLayouts 是一个指向 VkImageLayout 数组的指针,其中返回支持向图像进行主机复制操作的图像布局。

  • optimalTilingLayoutUUID 是一个 VK_UUID_SIZE uint8_t 值的数组,表示使用 VK_IMAGE_TILING_OPTIMAL 创建的图像的实现的混合布局的通用唯一标识符。

  • identicalMemoryTypeRequirements 指示在 VkImageCreateInfo::usage 中指定 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 标志不会影响图像的内存类型要求。

如果 VkPhysicalDeviceVulkan14Properties 结构包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则它将填充每个对应的、依赖于实现的属性。

这些属性对应于 Vulkan 1.4 的功能。

有效用法(隐式)
  • VUID-VkPhysicalDeviceVulkan14Properties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES

VkPhysicalDeviceIDProperties 结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceIDProperties {
    VkStructureType    sType;
    void*              pNext;
    uint8_t            deviceUUID[VK_UUID_SIZE];
    uint8_t            driverUUID[VK_UUID_SIZE];
    uint8_t            deviceLUID[VK_LUID_SIZE];
    uint32_t           deviceNodeMask;
    VkBool32           deviceLUIDValid;
} VkPhysicalDeviceIDProperties;

或等效结构

// Provided by VK_KHR_external_fence_capabilities, VK_KHR_external_memory_capabilities, VK_KHR_external_semaphore_capabilities
typedef VkPhysicalDeviceIDProperties VkPhysicalDeviceIDPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • deviceUUID 是一个包含 VK_UUID_SIZEuint8_t 值的数组,表示设备的通用唯一标识符。

  • driverUUID 是一个包含 VK_UUID_SIZEuint8_t 值的数组,表示设备正在使用的驱动程序构建版本的通用唯一标识符。

  • deviceLUID 是一个包含 VK_LUID_SIZEuint8_t 值的数组,表示设备的本地唯一标识符。

  • deviceNodeMask 是一个 uint32_t 位域,标识链接设备适配器中与该设备对应的节点。

  • deviceLUIDValid 是一个布尔值,如果 deviceLUID 包含有效的 LUID 并且 deviceNodeMask 包含有效的节点掩码,则为 VK_TRUE;否则为 VK_FALSE

如果 VkPhysicalDeviceIDProperties 结构包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则会填充每个对应的、与实现相关的属性。

对于给定的设备,deviceUUID 必须在实例、进程、驱动程序 API、驱动程序版本和系统重启之间保持不变。

应用程序 可以跨实例和进程边界比较 driverUUID 的值,并且 可以在外部 API 中进行类似的查询,以确定它们是否能够使用该设备共享内存对象和资源。

deviceUUID 和/或 driverUUID 必须用于确定特定的外部对象是否可以在驱动程序组件之间共享,其中存在针对特定对象类型的兼容性表中所定义的此类限制。

如果 deviceLUIDValidVK_FALSE,则 deviceLUIDdeviceNodeMask 的值是 未定义的。如果 deviceLUIDValidVK_TRUE 且 Vulkan 正在 Windows 操作系统上运行,则 deviceLUID 的内容 可以被转换为 LUID 对象,并且 必须等于与 physicalDevice 对应的 IDXGIAdapter1 对象的本地唯一标识符。如果 deviceLUIDValidVK_TRUE,则 deviceNodeMask 必须仅包含一位。如果 Vulkan 正在支持 Direct3D 12 API 的操作系统上运行,并且 physicalDevice 对应于链接设备适配器中的单个设备,则 deviceNodeMask 标识与 physicalDevice 对应的 Direct3D 12 节点。否则,deviceNodeMask 必须1

尽管它们的描述相同,但 VkPhysicalDeviceIDProperties::deviceUUID 可能与 VkPhysicalDeviceProperties2::pipelineCacheUUID 不同。前者旨在跨 API 和驱动程序边界识别和关联设备,而后者用于标识在序列化和反序列化管道状态时使用的兼容设备和驱动程序组合。

即使存在多个 Vulkan 实现(例如 GPU 驱动程序和软件渲染器;两个用于不同 GPU 的驱动程序;或在两个逻辑上不同的设备上运行的同一 Vulkan 驱动程序),实现 应该返回可能唯一的 deviceUUID 值。

Khronos 的一致性测试无法保证 deviceUUID 值实际上是唯一的,因此实现者 应该尽最大努力确保这一点。特别是,硬编码的 deviceUUID 值,尤其是全为 0 的位, 绝不应该使用。

可以使用对供应商、驱动程序和硬件环境唯一的值的组合来提供高度确定的唯一 deviceUUID。这种计算的一些可能的输入是:

  • vkGetPhysicalDeviceProperties 报告的信息

  • PCI 设备 ID(如果已定义)

  • PCI 总线 ID,或类似的系统配置信息。

  • 驱动程序二进制校验和。

虽然指定了 VkPhysicalDeviceIDProperties::deviceUUID 在驱动程序版本和系统重启之间保持一致,但不打算将其用作设备的可序列化持久标识符。当设备物理添加到系统、从系统中删除或在系统断电时移动到系统中的不同连接器时,它可能会发生变化。此外,没有合理的方法通过一致性测试来验证给定设备在给定系统中跨该系统支持的所有驱动程序版本是否保留相同的 UUID。虽然实现应尽一切努力在不同驱动程序版本中报告一致的设备 UUID,但应用程序应避免依赖此值的持久性,用于除了识别用于外部对象共享目的的兼容设备之外的用途。

有效用法(隐式)
  • VUID-VkPhysicalDeviceIDProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES

VK_UUID_SIZE 是一个数组的 uint8_t 值的长度,该数组包含一个全局唯一的设备或驱动程序构建标识符,如 VkPhysicalDeviceIDProperties::deviceUUIDVkPhysicalDeviceIDProperties::driverUUID 中返回的那样。

#define VK_UUID_SIZE                      16U

VK_LUID_SIZE 是一个数组的 uint8_t 值的长度,该数组包含一个本地唯一的设备标识符,如 VkPhysicalDeviceIDProperties::deviceLUID 中返回的那样。

#define VK_LUID_SIZE                      8U

或等效结构

#define VK_LUID_SIZE_KHR                  VK_LUID_SIZE

VkPhysicalDeviceDriverProperties 结构的定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkPhysicalDeviceDriverProperties {
    VkStructureType         sType;
    void*                   pNext;
    VkDriverId              driverID;
    char                    driverName[VK_MAX_DRIVER_NAME_SIZE];
    char                    driverInfo[VK_MAX_DRIVER_INFO_SIZE];
    VkConformanceVersion    conformanceVersion;
} VkPhysicalDeviceDriverProperties;

或等效结构

// Provided by VK_KHR_driver_properties
typedef VkPhysicalDeviceDriverProperties VkPhysicalDeviceDriverPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • driverID 是物理设备驱动程序的唯一标识符。

  • driverName 是一个包含 VK_MAX_DRIVER_NAME_SIZEchar 的数组,其中包含以 null 结尾的 UTF-8 字符串,该字符串是驱动程序的名称。

  • driverInfo 是一个包含 VK_MAX_DRIVER_INFO_SIZEchar 的数组,其中包含以 null 结尾的 UTF-8 字符串,其中包含有关驱动程序的其他信息。

  • conformanceVersion 是实施者在发布之前成功测试此驱动程序所依据的最新版本 Vulkan 一致性测试(请参阅 VkConformanceVersion)。

如果 VkPhysicalDeviceDriverProperties 结构包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则会填充每个对应的、与实现相关的属性。

这些是对应于物理设备的驱动程序的属性。

对于给定的驱动程序,driverID 必须在实例、进程、驱动程序版本和系统重启之间保持不变。

有效用法(隐式)
  • VUID-VkPhysicalDeviceDriverProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES

VkPhysicalDeviceDriverProperties::driverID可能返回的 Khronos 驱动程序 ID 是:

// Provided by VK_VERSION_1_2
typedef enum VkDriverId {
    VK_DRIVER_ID_AMD_PROPRIETARY = 1,
    VK_DRIVER_ID_AMD_OPEN_SOURCE = 2,
    VK_DRIVER_ID_MESA_RADV = 3,
    VK_DRIVER_ID_NVIDIA_PROPRIETARY = 4,
    VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS = 5,
    VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA = 6,
    VK_DRIVER_ID_IMAGINATION_PROPRIETARY = 7,
    VK_DRIVER_ID_QUALCOMM_PROPRIETARY = 8,
    VK_DRIVER_ID_ARM_PROPRIETARY = 9,
    VK_DRIVER_ID_GOOGLE_SWIFTSHADER = 10,
    VK_DRIVER_ID_GGP_PROPRIETARY = 11,
    VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
    VK_DRIVER_ID_MESA_LLVMPIPE = 13,
    VK_DRIVER_ID_MOLTENVK = 14,
    VK_DRIVER_ID_COREAVI_PROPRIETARY = 15,
    VK_DRIVER_ID_JUICE_PROPRIETARY = 16,
    VK_DRIVER_ID_VERISILICON_PROPRIETARY = 17,
    VK_DRIVER_ID_MESA_TURNIP = 18,
    VK_DRIVER_ID_MESA_V3DV = 19,
    VK_DRIVER_ID_MESA_PANVK = 20,
    VK_DRIVER_ID_SAMSUNG_PROPRIETARY = 21,
    VK_DRIVER_ID_MESA_VENUS = 22,
    VK_DRIVER_ID_MESA_DOZEN = 23,
    VK_DRIVER_ID_MESA_NVK = 24,
    VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA = 25,
    VK_DRIVER_ID_MESA_HONEYKRISP = 26,
    VK_DRIVER_ID_VULKAN_SC_EMULATION_ON_VULKAN = 27,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = VK_DRIVER_ID_NVIDIA_PROPRIETARY,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = VK_DRIVER_ID_IMAGINATION_PROPRIETARY,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_ARM_PROPRIETARY_KHR = VK_DRIVER_ID_ARM_PROPRIETARY,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR = VK_DRIVER_ID_GOOGLE_SWIFTSHADER,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_GGP_PROPRIETARY_KHR = VK_DRIVER_ID_GGP_PROPRIETARY,
  // Provided by VK_KHR_driver_properties
    VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR = VK_DRIVER_ID_BROADCOM_PROPRIETARY,
} VkDriverId;

或等效结构

// Provided by VK_KHR_driver_properties
typedef VkDriverId VkDriverIdKHR;

Khronos 驱动程序 ID 可以由供应商随时分配。同一个供应商可能存在多个驱动程序 ID,代表不同的驱动程序(例如,不同的平台、专有或开源等)。只有本规范的最新规范版本、对应的 vk.xml API 注册表以及对应的 vulkan_core.h 头文件 必须包含所有保留的 Khronos 驱动程序 ID。

只有在 Khronos 注册的驱动程序 ID 才会被赋予符号名称。 可能会返回未注册的驱动程序 ID。

VK_MAX_DRIVER_NAME_SIZE 是一个数组的 char 值的长度,该数组包含驱动程序名称字符串,如 VkPhysicalDeviceDriverProperties::driverName 中返回的那样。

#define VK_MAX_DRIVER_NAME_SIZE           256U

或等效结构

#define VK_MAX_DRIVER_NAME_SIZE_KHR       VK_MAX_DRIVER_NAME_SIZE

VK_MAX_DRIVER_INFO_SIZE 是一个数组的 char 值的长度,该数组包含驱动程序信息字符串,如 VkPhysicalDeviceDriverProperties::driverInfo 中返回的那样。

#define VK_MAX_DRIVER_INFO_SIZE           256U

或等效结构

#define VK_MAX_DRIVER_INFO_SIZE_KHR       VK_MAX_DRIVER_INFO_SIZE

实现所符合的一致性测试套件版本由 VkConformanceVersion 结构描述。

// Provided by VK_VERSION_1_2
typedef struct VkConformanceVersion {
    uint8_t    major;
    uint8_t    minor;
    uint8_t    subminor;
    uint8_t    patch;
} VkConformanceVersion;

或等效结构

// Provided by VK_KHR_driver_properties
typedef VkConformanceVersion VkConformanceVersionKHR;
  • major 是一致性测试套件的主版本号。

  • minor 是一致性测试套件的次版本号。

  • subminor 是一致性测试套件的子版本号。

  • patch 是一致性测试套件的补丁版本号。

VkPhysicalDevicePCIBusInfoPropertiesEXT 结构的定义如下:

// Provided by VK_EXT_pci_bus_info
typedef struct VkPhysicalDevicePCIBusInfoPropertiesEXT {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           pciDomain;
    uint32_t           pciBus;
    uint32_t           pciDevice;
    uint32_t           pciFunction;
} VkPhysicalDevicePCIBusInfoPropertiesEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pciDomain 是 PCI 总线域。

  • pciBus 是 PCI 总线标识符。

  • pciDevice 是 PCI 设备标识符。

  • pciFunction 是 PCI 设备功能标识符。

如果 VkPhysicalDevicePCIBusInfoPropertiesEXT 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构体的 pNext 链中,则会填充每个相应的实现相关的属性。

这些是物理设备的 PCI 总线信息的属性。

有效用法(隐式)
  • VUID-VkPhysicalDevicePCIBusInfoPropertiesEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT

VkPhysicalDeviceDrmPropertiesEXT 结构体定义如下:

// Provided by VK_EXT_physical_device_drm
typedef struct VkPhysicalDeviceDrmPropertiesEXT {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           hasPrimary;
    VkBool32           hasRender;
    int64_t            primaryMajor;
    int64_t            primaryMinor;
    int64_t            renderMajor;
    int64_t            renderMinor;
} VkPhysicalDeviceDrmPropertiesEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • hasPrimary 是一个布尔值,指示物理设备是否具有 DRM 主节点。

  • hasRender 是一个布尔值,指示物理设备是否具有 DRM 渲染节点。

  • primaryMajor 是 DRM 主节点的主设备号(如果有)。

  • primaryMinor 是 DRM 主节点的次设备号(如果有)。

  • renderMajor 是 DRM 渲染节点的主设备号(如果有)。

  • renderMinor 是 DRM 渲染节点的次设备号(如果有)。

如果 VkPhysicalDeviceDrmPropertiesEXT 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构体的 pNext 链中,则会填充每个相应的实现相关的属性。

这些是物理设备的 DRM 信息的属性。

有效用法(隐式)
  • VUID-VkPhysicalDeviceDrmPropertiesEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT

VkPhysicalDeviceShaderIntegerDotProductProperties 结构体定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkPhysicalDeviceShaderIntegerDotProductProperties {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           integerDotProduct8BitUnsignedAccelerated;
    VkBool32           integerDotProduct8BitSignedAccelerated;
    VkBool32           integerDotProduct8BitMixedSignednessAccelerated;
    VkBool32           integerDotProduct4x8BitPackedUnsignedAccelerated;
    VkBool32           integerDotProduct4x8BitPackedSignedAccelerated;
    VkBool32           integerDotProduct4x8BitPackedMixedSignednessAccelerated;
    VkBool32           integerDotProduct16BitUnsignedAccelerated;
    VkBool32           integerDotProduct16BitSignedAccelerated;
    VkBool32           integerDotProduct16BitMixedSignednessAccelerated;
    VkBool32           integerDotProduct32BitUnsignedAccelerated;
    VkBool32           integerDotProduct32BitSignedAccelerated;
    VkBool32           integerDotProduct32BitMixedSignednessAccelerated;
    VkBool32           integerDotProduct64BitUnsignedAccelerated;
    VkBool32           integerDotProduct64BitSignedAccelerated;
    VkBool32           integerDotProduct64BitMixedSignednessAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating8BitUnsignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating8BitSignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating16BitUnsignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating16BitSignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating32BitUnsignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating32BitSignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating64BitUnsignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating64BitSignedAccelerated;
    VkBool32           integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated;
} VkPhysicalDeviceShaderIntegerDotProductProperties;

或等效结构

// Provided by VK_KHR_shader_integer_dot_product
typedef VkPhysicalDeviceShaderIntegerDotProductProperties VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • integerDotProduct8BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 8 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct8BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 8 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct8BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 8 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct4x8BitPackedUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct4x8BitPackedSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct4x8BitPackedMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct16BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 16 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct16BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 16 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct16BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 16 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct32BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 32 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct32BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 32 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct32BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 32 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct64BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotKHR SPIR-V 指令的 64 位无符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct64BitSignedAccelerated 是一个布尔值,如果使用 OpSDotKHR SPIR-V 指令的 64 位有符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProduct64BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotKHR SPIR-V 指令的 64 位混合符号点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating8BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 8 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating8BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 8 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 8 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令,从打包到 32 位整数的操作数中进行 8 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating16BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 16 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating16BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 16 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 16 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating32BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 32 位无符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating32BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 32 位有符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 32 位混合符号累积饱和点积运算得到加速(如下定义),则该值为 VK_TRUE

  • integerDotProductAccumulatingSaturating64BitUnsignedAccelerated 是一个布尔值,如果使用 OpUDotAccSatKHR SPIR-V 指令的 64 位无符号累积饱和点积运算得到加速,则为 VK_TRUE定义如下

  • integerDotProductAccumulatingSaturating64BitSignedAccelerated 是一个布尔值,如果使用 OpSDotAccSatKHR SPIR-V 指令的 64 位有符号累积饱和点积运算得到加速,则为 VK_TRUE定义如下

  • integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated 是一个布尔值,如果使用 OpSUDotAccSatKHR SPIR-V 指令的 64 位混合符号累积饱和点积运算得到加速,则为 VK_TRUE定义如下

如果 VkPhysicalDeviceShaderIntegerDotProductProperties 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构体的 pNext 链中,则会填充每个相应的实现相关的属性。

这些是物理设备的整数点积加速信息的属性。

如果点积运算的实现提供了比由基本指令和/或其他点积指令组成的应用程序代码更高的性能优势,则认为该点积运算是加速的,原因可能是该实现使用了优化的机器代码序列,无法保证从应用程序代码生成该序列,或者因为它使用了应用程序代码无法以其他方式定位的硬件功能。

有效用法(隐式)
  • VUID-VkPhysicalDeviceShaderIntegerDotProductProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES

VkPhysicalDeviceImageProcessingPropertiesQCOM 结构体定义如下:

// Provided by VK_QCOM_image_processing
typedef struct VkPhysicalDeviceImageProcessingPropertiesQCOM {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           maxWeightFilterPhases;
    VkExtent2D         maxWeightFilterDimension;
    VkExtent2D         maxBlockMatchRegion;
    VkExtent2D         maxBoxFilterBlockSize;
} VkPhysicalDeviceImageProcessingPropertiesQCOM;

如果 VkPhysicalDeviceImageProcessingPropertiesQCOM 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构体的 pNext 链中,则会填充每个相应的实现相关的属性。

这些是物理设备的图像处理信息的属性。

有效用法(隐式)
  • VUID-VkPhysicalDeviceImageProcessingPropertiesQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM

VkPhysicalDeviceShaderTileImagePropertiesEXT 结构体定义如下:

// Provided by VK_EXT_shader_tile_image
typedef struct VkPhysicalDeviceShaderTileImagePropertiesEXT {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           shaderTileImageCoherentReadAccelerated;
    VkBool32           shaderTileImageReadSampleFromPixelRateInvocation;
    VkBool32           shaderTileImageReadFromHelperInvocation;
} VkPhysicalDeviceShaderTileImagePropertiesEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • shaderTileImageCoherentReadAccelerated 是一个布尔值,如果加速读取图块图像数据,则为 VK_TRUE

  • shaderTileImageReadSampleFromPixelRateInvocation 是一个布尔值,如果当 VkPipelineMultisampleStateCreateInfo::rasterizationSamples > 1 时,支持从像素速率片段调用中读取样本,则为 VK_TRUE

  • shaderTileImageReadFromHelperInvocation 是一个布尔值,如果从辅助片段调用中读取图块图像数据会产生有效值,则为 VK_TRUE

如果 VkPhysicalDeviceShaderTileImagePropertiesEXT 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构体的 pNext 链中,则会填充每个相应的实现相关的属性。

这些是物理设备的图块图像信息的属性。

有效用法(隐式)
  • VUID-VkPhysicalDeviceShaderTileImagePropertiesEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT

VkPhysicalDeviceImageProcessing2PropertiesQCOM 结构体定义如下:

// Provided by VK_QCOM_image_processing2
typedef struct VkPhysicalDeviceImageProcessing2PropertiesQCOM {
    VkStructureType    sType;
    void*              pNext;
    VkExtent2D         maxBlockMatchWindow;
} VkPhysicalDeviceImageProcessing2PropertiesQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxBlockMatchWindow 是一个 VkExtent2D,描述了块匹配窗口可以指定的最大维度(widthheight)。

如果 VkPhysicalDeviceImageProcessing2PropertiesQCOM 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构体的 pNext 链中,则会填充每个相应的实现相关的属性。

这些是物理设备的图像处理2信息的属性。

有效用法(隐式)
  • VUID-VkPhysicalDeviceImageProcessing2PropertiesQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM

VkPhysicalDeviceLayeredDriverPropertiesMSFT 结构体定义如下:

// Provided by VK_MSFT_layered_driver
typedef struct VkPhysicalDeviceLayeredDriverPropertiesMSFT {
    VkStructureType                     sType;
    void*                               pNext;
    VkLayeredDriverUnderlyingApiMSFT    underlyingAPI;
} VkPhysicalDeviceLayeredDriverPropertiesMSFT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • underlyingAPI 是一个 VkLayeredDriverUnderlyingApiMSFT 值,指示用于实现分层驱动程序的底层 API,如果驱动程序不是分层的,则为 VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT

这些是物理设备的驱动程序分层信息的属性。

有效用法(隐式)
  • VUID-VkPhysicalDeviceLayeredDriverPropertiesMSFT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT

VkPhysicalDeviceLayeredDriverPropertiesMSFT::underlyingAPI可能返回的底层 API 为:

// Provided by VK_MSFT_layered_driver
typedef enum VkLayeredDriverUnderlyingApiMSFT {
    VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT = 0,
    VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT = 1,
} VkLayeredDriverUnderlyingApiMSFT;

VkPhysicalDeviceSchedulingControlsPropertiesARM 结构体定义如下:

// Provided by VK_ARM_scheduling_controls
typedef struct VkPhysicalDeviceSchedulingControlsPropertiesARM {
    VkStructureType                               sType;
    void*                                         pNext;
    VkPhysicalDeviceSchedulingControlsFlagsARM    schedulingControlsFlags;
} VkPhysicalDeviceSchedulingControlsPropertiesARM;
  • schedulingControlsFlags 指定物理设备支持的特定调度控制。

如果 VkPhysicalDeviceSchedulingControlsPropertiesARM 结构体包含在传递给 vkGetPhysicalDeviceProperties2VkPhysicalDeviceProperties2 结构的 pNext 链中,则会填充每个相应的实现相关的属性。

有效用法(隐式)
  • VUID-VkPhysicalDeviceSchedulingControlsPropertiesARM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM

  • VUID-VkPhysicalDeviceSchedulingControlsPropertiesARM-schedulingControlsFlags-parameter
    schedulingControlsFlags 必须VkPhysicalDeviceSchedulingControlsFlagBitsARM 值的有效组合

  • VUID-VkPhysicalDeviceSchedulingControlsPropertiesARM-schedulingControlsFlags-requiredbitmask
    schedulingControlsFlags 不得0

可以在 VkPhysicalDeviceSchedulingControlsPropertiesARM::schedulingControlsFlags 中设置的位,指定支持的调度控制,包括:

// Provided by VK_ARM_scheduling_controls
// Flag bits for VkPhysicalDeviceSchedulingControlsFlagBitsARM
typedef VkFlags64 VkPhysicalDeviceSchedulingControlsFlagBitsARM;
static const VkPhysicalDeviceSchedulingControlsFlagBitsARM VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM = 0x00000001ULL;
// Provided by VK_ARM_scheduling_controls
typedef VkFlags64 VkPhysicalDeviceSchedulingControlsFlagsARM;

VkPhysicalDeviceSchedulingControlsFlagsARM 是一个位掩码类型,用于设置零个或多个 VkPhysicalDeviceSchedulingControlsFlagBitsARM 的掩码。

要查询物理设备上可用队列的属性,请调用:

// Provided by VK_VERSION_1_0
void vkGetPhysicalDeviceQueueFamilyProperties(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pQueueFamilyPropertyCount,
    VkQueueFamilyProperties*                    pQueueFamilyProperties);
  • physicalDevice 是要查询其属性的物理设备的句柄。

  • pQueueFamilyPropertyCount 是一个指向整数的指针,该整数与可用或查询的队列族数量有关,如下所述。

  • pQueueFamilyProperties 可以是 NULL,也可以是指向 VkQueueFamilyProperties 结构体数组的指针。

如果 pQueueFamilyPropertiesNULL,则可用队列族的数量将在 pQueueFamilyPropertyCount 中返回。实现必须至少支持一个队列族。否则,pQueueFamilyPropertyCount 必须指向应用程序设置为 pQueueFamilyProperties 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pQueueFamilyProperties 的结构体数量覆盖。如果 pQueueFamilyPropertyCount 小于可用队列族的数量,则最多写入 pQueueFamilyPropertyCount 个结构体。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter
    physicalDevice **必须**是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter
    pQueueFamilyPropertyCount 必须 是一个指向 uint32_t 值的有效指针

  • VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter
    如果 pQueueFamilyPropertyCount 引用的值不为 0,且 pQueueFamilyProperties 不为 NULL,则 pQueueFamilyProperties 必须 是一个指向 pQueueFamilyPropertyCountVkQueueFamilyProperties 结构体数组的有效指针

VkQueueFamilyProperties 结构体的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkQueueFamilyProperties {
    VkQueueFlags    queueFlags;
    uint32_t        queueCount;
    uint32_t        timestampValidBits;
    VkExtent3D      minImageTransferGranularity;
} VkQueueFamilyProperties;
  • queueFlags 是一个 VkQueueFlagBits 的位掩码,指示此队列族中队列的功能。

  • queueCount 是此队列族中队列的无符号整数计数。每个队列族必须至少支持一个队列。

  • timestampValidBits 是通过 vkCmdWriteTimestamp2vkCmdWriteTimestamp 写入的时间戳中有意义的位数。有效范围为 36 到 64 位,或者值为 0,表示不支持时间戳。有效范围之外的位保证为零。

  • minImageTransferGranularity 是此队列族中队列支持的图像传输操作的最小粒度。

minImageTransferGranularity 中返回的值,对于具有块压缩格式的图像,单位为压缩纹素块,否则单位为纹素。

minImageTransferGranularity 的可能值为:

  • (0,0,0) 指定只能使用相应队列上的图像传输操作传输整个 mip 级别。在这种情况下,以下限制适用于图像传输操作的所有偏移和范围参数:

    • VkOffset3D 参数的 xyz 成员必须始终为零。

    • VkExtent3D 参数的 widthheightdepth 成员必须始终分别与该参数对应的图像子资源的宽度、高度和深度相匹配。

  • (Ax, Ay, Az),其中 AxAyAz 均为 2 的整数次幂。在这种情况下,以下限制适用于所有图像传输操作:

    • VkOffset3D 参数的 xyz 必须分别是 AxAyAz 的整数倍。

    • VkExtent3D 参数的 width 必须Ax 的整数倍,否则 x + width 必须等于该参数对应的图像子资源的宽度。

    • VkExtent3D 参数的 height 必须Ay 的整数倍,否则 y + height 必须等于该参数对应的图像子资源的高度。

    • VkExtent3D 参数的 depth 必须Az 的整数倍,否则 z + depth 必须等于该参数对应的图像子资源的深度。

    • 如果与参数对应的图像格式为块压缩格式之一,则为了以上计算的目的,粒度必须按压缩纹素块尺寸放大。

支持图形和/或计算操作的队列必须minImageTransferGranularity中报告(1,1,1),这意味着对于这些队列的图像传输操作的粒度没有额外的限制。其他支持图像传输操作的队列仅需要支持整个mipmap级别的传输,因此属于此类队列族的队列的minImageTransferGranularity可能(0,0,0)

设备内存部分描述了从物理设备查询的内存属性。

有关物理设备特性查询,请参阅特性章节。

VkQueueFamilyProperties::queueFlags可能设置的位,表示队列族中队列的功能有:

// Provided by VK_VERSION_1_0
typedef enum VkQueueFlagBits {
    VK_QUEUE_GRAPHICS_BIT = 0x00000001,
    VK_QUEUE_COMPUTE_BIT = 0x00000002,
    VK_QUEUE_TRANSFER_BIT = 0x00000004,
    VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,
  // Provided by VK_VERSION_1_1
    VK_QUEUE_PROTECTED_BIT = 0x00000010,
  // Provided by VK_KHR_video_decode_queue
    VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020,
  // Provided by VK_KHR_video_encode_queue
    VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040,
  // Provided by VK_NV_optical_flow
    VK_QUEUE_OPTICAL_FLOW_BIT_NV = 0x00000100,
} VkQueueFlagBits;
  • VK_QUEUE_GRAPHICS_BIT指定此队列族中的队列支持图形操作。

  • VK_QUEUE_COMPUTE_BIT指定此队列族中的队列支持计算操作。

  • VK_QUEUE_TRANSFER_BIT指定此队列族中的队列支持传输操作。

  • VK_QUEUE_SPARSE_BINDING_BIT指定此队列族中的队列支持稀疏内存管理操作(参见稀疏资源)。如果启用了任何稀疏资源特性,则至少一个队列族必须支持此位。

  • VK_QUEUE_VIDEO_DECODE_BIT_KHR指定此队列族中的队列支持视频解码操作

  • VK_QUEUE_VIDEO_ENCODE_BIT_KHR指定此队列族中的队列支持视频编码操作

  • VK_QUEUE_OPTICAL_FLOW_BIT_NV指定此队列族中的队列支持光流操作。

  • VK_QUEUE_PROTECTED_BIT指定此队列族中的队列支持VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT位。(参见受保护内存)。如果物理设备支持protectedMemory特性,则其至少一个队列族必须支持此位。

如果实现公开了任何支持图形操作的队列族,则该实现公开的至少一个物理设备的至少一个队列族必须同时支持图形和计算操作。

此外,如果支持protectedMemory物理设备特性,则该实现公开的至少一个物理设备的至少一个队列族必须支持图形操作、计算操作和受保护的内存操作。

所有允许在支持传输操作的队列上执行的命令也允许在支持图形或计算操作的队列上执行。因此,如果队列族的功能包括VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则对于该队列族单独报告VK_QUEUE_TRANSFER_BIT功能是可选的

有关更多详细信息,请参阅队列

// Provided by VK_VERSION_1_0
typedef VkFlags VkQueueFlags;

VkQueueFlags是一个位掩码类型,用于设置零个或多个VkQueueFlagBits的掩码。

要查询物理设备上可用队列的属性,请调用:

// Provided by VK_VERSION_1_1
void vkGetPhysicalDeviceQueueFamilyProperties2(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pQueueFamilyPropertyCount,
    VkQueueFamilyProperties2*                   pQueueFamilyProperties);

或等效命令

// Provided by VK_KHR_get_physical_device_properties2
void vkGetPhysicalDeviceQueueFamilyProperties2KHR(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pQueueFamilyPropertyCount,
    VkQueueFamilyProperties2*                   pQueueFamilyProperties);
  • physicalDevice 是要查询其属性的物理设备的句柄。

  • pQueueFamilyPropertyCount是指向一个整数的指针,该整数与可用或查询的队列族数量相关,如vkGetPhysicalDeviceQueueFamilyProperties中所述。

  • pQueueFamilyProperties可以是NULL,也可以是指向VkQueueFamilyProperties2结构数组的指针。

vkGetPhysicalDeviceQueueFamilyProperties2的行为类似于vkGetPhysicalDeviceQueueFamilyProperties,但能够在输出结构的pNext链中返回扩展信息。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter
    physicalDevice **必须**是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter
    pQueueFamilyPropertyCount 必须 是一个指向 uint32_t 值的有效指针

  • VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter
    如果pQueueFamilyPropertyCount引用的值不为0,并且pQueueFamilyProperties不为NULL,则pQueueFamilyProperties必须是指向pQueueFamilyPropertyCountVkQueueFamilyProperties2结构数组的有效指针。

VkQueueFamilyProperties2结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkQueueFamilyProperties2 {
    VkStructureType            sType;
    void*                      pNext;
    VkQueueFamilyProperties    queueFamilyProperties;
} VkQueueFamilyProperties2;

或等效结构

// Provided by VK_KHR_get_physical_device_properties2
typedef VkQueueFamilyProperties2 VkQueueFamilyProperties2KHR;
有效用法(隐式)

VkQueueFamilyGlobalPriorityProperties结构的定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkQueueFamilyGlobalPriorityProperties {
    VkStructureType          sType;
    void*                    pNext;
    uint32_t                 priorityCount;
    VkQueueGlobalPriority    priorities[VK_MAX_GLOBAL_PRIORITY_SIZE];
} VkQueueFamilyGlobalPriorityProperties;

或等效结构

// Provided by VK_KHR_global_priority
typedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropertiesKHR;

或等效结构

// Provided by VK_EXT_global_priority_query
typedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropertiesEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • priorityCount是此队列族中支持的全局队列优先级数,它必须大于0。

  • prioritiesVK_MAX_GLOBAL_PRIORITY_SIZEVkQueueGlobalPriority枚举的数组,表示此队列族中所有支持的全局队列优先级。数组的前priorityCount个元素将有效。

如果将VkQueueFamilyGlobalPriorityProperties结构包含在传递给vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyProperties2结构的pNext链中,则将使用指示族的受支持的全局队列优先级列表进行填充。

priorities的有效元素必须不包含任何重复值。

priorities的有效元素必须是按升序排列的VkQueueGlobalPriority枚举的连续序列。

例如,返回priorityCount为3,且支持的prioritiesVK_QUEUE_GLOBAL_PRIORITY_LOWVK_QUEUE_GLOBAL_PRIORITY_MEDIUMVK_QUEUE_GLOBAL_PRIORITY_REALTIME是不允许的。

有效用法(隐式)
  • VUID-VkQueueFamilyGlobalPriorityProperties-sType-sType
    sType必须VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES

VK_MAX_GLOBAL_PRIORITY_SIZE是一个VkQueueGlobalPriority枚举数组的长度,表示支持的队列优先级,如VkQueueFamilyGlobalPriorityProperties::priorities中所返回。

#define VK_MAX_GLOBAL_PRIORITY_SIZE       16U

或等效结构

#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR   VK_MAX_GLOBAL_PRIORITY_SIZE

或等效结构

#define VK_MAX_GLOBAL_PRIORITY_SIZE_EXT   VK_MAX_GLOBAL_PRIORITY_SIZE

VkQueueFamilyCheckpointProperties2NV结构的定义如下:

// Provided by VK_NV_device_diagnostic_checkpoints with VK_VERSION_1_3 or VK_KHR_synchronization2
typedef struct VkQueueFamilyCheckpointProperties2NV {
    VkStructureType          sType;
    void*                    pNext;
    VkPipelineStageFlags2    checkpointExecutionStageMask;
} VkQueueFamilyCheckpointProperties2NV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • checkpointExecutionStageMask是一个掩码,指示实现可以在其中执行检查点标记的管道阶段。

可以通过设置VkQueueFamilyProperties2::pNext指向VkQueueFamilyCheckpointProperties2NV结构来查询其他队列族信息。

有效用法(隐式)
  • VUID-VkQueueFamilyCheckpointProperties2NV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV

VkQueueFamilyCheckpointPropertiesNV 结构定义如下:

// Provided by VK_NV_device_diagnostic_checkpoints
typedef struct VkQueueFamilyCheckpointPropertiesNV {
    VkStructureType         sType;
    void*                   pNext;
    VkPipelineStageFlags    checkpointExecutionStageMask;
} VkQueueFamilyCheckpointPropertiesNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • checkpointExecutionStageMask是一个掩码,指示实现可以在其中执行检查点标记的管道阶段。

可以通过设置 VkQueueFamilyProperties2::pNext 指向一个 VkQueueFamilyCheckpointPropertiesNV 结构来查询额外的队列族信息。

有效用法(隐式)
  • VUID-VkQueueFamilyCheckpointPropertiesNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV

VkQueueFamilyVideoPropertiesKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkQueueFamilyVideoPropertiesKHR {
    VkStructureType                  sType;
    void*                            pNext;
    VkVideoCodecOperationFlagsKHR    videoCodecOperations;
} VkQueueFamilyVideoPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • videoCodecOperations 是一个 VkVideoCodecOperationFlagBitsKHR 的位掩码,指示队列族支持的视频编解码操作集合。

如果此结构包含在传递给 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyProperties2 结构的 pNext 链中,则会填充指定队列族支持的视频编解码操作集合。

有效用法(隐式)
  • VUID-VkQueueFamilyVideoPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR

// Provided by VK_KHR_video_queue
typedef struct VkQueueFamilyQueryResultStatusPropertiesKHR {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           queryResultStatusSupport;
} VkQueueFamilyQueryResultStatusPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • 如果支持查询类型 VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR 和使用 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则 queryResultStatusSupport 报告 VK_TRUE

如果此结构包含在传递给 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyProperties2 结构的 pNext 链中,则会填充有关指定队列族是否支持结果状态查询的信息。

有效用法(隐式)
  • VUID-VkQueueFamilyQueryResultStatusPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR

要枚举物理设备的队列族上可用的性能查询计数器,请调用:

// Provided by VK_KHR_performance_query
VkResult vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
    VkPhysicalDevice                            physicalDevice,
    uint32_t                                    queueFamilyIndex,
    uint32_t*                                   pCounterCount,
    VkPerformanceCounterKHR*                    pCounters,
    VkPerformanceCounterDescriptionKHR*         pCounterDescriptions);
  • physicalDevice 是要查询其队列族性能查询计数器属性的物理设备的句柄。

  • queueFamilyIndex 是我们想要获取属性的物理设备队列族的索引。

  • pCounterCount 是一个指向与可用或查询的计数器数量相关的整数的指针,如下所述。

  • pCounters 可以是 NULL,也可以是指向 VkPerformanceCounterKHR 结构数组的指针。

  • pCounterDescriptions 可以是 NULL,也可以是指向 VkPerformanceCounterDescriptionKHR 结构数组的指针。

如果 pCountersNULL 并且 pCounterDescriptionsNULL,则可用计数器的数量将在 pCounterCount 中返回。否则,pCounterCount 必须 指向应用程序设置的变量,该变量表示 pCounterspCounterDescriptions 或两个数组中的元素数量,并且在返回时,该变量将被实际写入的结构数量覆盖。如果 pCounterCount 小于可用计数器的数量,则最多将写入 pCounterCount 个结构,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的计数器都已返回。

有效用法(隐式)
  • VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-physicalDevice-parameter
    physicalDevice **必须**是有效的 VkPhysicalDevice 句柄

  • VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterCount-parameter
    pCounterCount 必须 是指向 uint32_t 值的有效指针

  • VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounters-parameter
    如果 pCounterCount 引用的值不为 0,且 pCounters 不为 NULL,则 pCounters 必须 是指向 pCounterCountVkPerformanceCounterKHR 结构的有效指针

  • VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterDescriptions-parameter
    如果 pCounterCount 引用的值不为 0,且 pCounterDescriptions 不为 NULL,则 pCounterDescriptions 必须 是指向 pCounterCountVkPerformanceCounterDescriptionKHR 结构的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

VkPerformanceCounterKHR 结构定义如下:

// Provided by VK_KHR_performance_query
typedef struct VkPerformanceCounterKHR {
    VkStructureType                   sType;
    void*                             pNext;
    VkPerformanceCounterUnitKHR       unit;
    VkPerformanceCounterScopeKHR      scope;
    VkPerformanceCounterStorageKHR    storage;
    uint8_t                           uuid[VK_UUID_SIZE];
} VkPerformanceCounterKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • unit 是一个 VkPerformanceCounterUnitKHR,指定计数器数据将记录的单位。

  • scope 是一个 VkPerformanceCounterScopeKHR,指定计数器所属的范围。

  • storage 是一个 VkPerformanceCounterStorageKHR,指定计数器数据使用的存储类型。

  • uuid 是一个大小为 VK_UUID_SIZE 的数组,包含 8 位值,表示物理设备计数器的通用唯一标识符。

有效用法(隐式)
  • VUID-VkPerformanceCounterKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR

  • VUID-VkPerformanceCounterKHR-pNext-pNext
    pNext 必须NULL

性能计数器具有关联的单位。此单位描述如何解释性能计数器结果。

可在 VkPerformanceCounterKHR::unit 中返回的性能计数器单位类型可能是:

// Provided by VK_KHR_performance_query
typedef enum VkPerformanceCounterUnitKHR {
    VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR = 0,
    VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR = 1,
    VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR = 2,
    VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR = 3,
    VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR = 4,
    VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR = 5,
    VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR = 6,
    VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR = 7,
    VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR = 8,
    VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR = 9,
    VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR = 10,
} VkPerformanceCounterUnitKHR;
  • VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR - 性能计数器单位是通用数据点。

  • VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR - 性能计数器单位是百分比 (%)。

  • VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR - 性能计数器单位是纳秒 (ns) 值。

  • VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR - 性能计数器单位是字节值。

  • VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR - 性能计数器单位是字节/秒 (bytes/s) 值。

  • VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR - 性能计数器单位是以开尔文 (Kelvin) 为单位报告的温度。

  • VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR - 性能计数器单位是瓦特 (W) 值。

  • VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR - 性能计数器单位是伏特 (V) 值。

  • VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR - 性能计数器单位是安培 (A) 值。

  • VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR - 性能计数器单位是赫兹 (Hz) 值。

  • VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR - 性能计数器单位是周期值。

性能计数器具有关联的范围。此范围描述性能计数器的粒度。

可在 VkPerformanceCounterKHR::scope 中返回的性能计数器范围类型可能是:

// Provided by VK_KHR_performance_query
typedef enum VkPerformanceCounterScopeKHR {
    VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR = 0,
    VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR = 1,
    VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR = 2,
  // VK_QUERY_SCOPE_COMMAND_BUFFER_KHR is a deprecated alias
    VK_QUERY_SCOPE_COMMAND_BUFFER_KHR = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR,
  // VK_QUERY_SCOPE_RENDER_PASS_KHR is a deprecated alias
    VK_QUERY_SCOPE_RENDER_PASS_KHR = VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR,
  // VK_QUERY_SCOPE_COMMAND_KHR is a deprecated alias
    VK_QUERY_SCOPE_COMMAND_KHR = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR,
} VkPerformanceCounterScopeKHR;
  • VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR - 性能计数器范围是单个完整的命令缓冲区。

  • VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR - 性能计数器范围是零个或多个完整的渲染通道。包含性能计数器的性能查询必须在渲染通道实例之外开始和结束。

  • VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR - 性能计数器范围是零个或多个命令。

性能计数器具有关联的存储。此存储描述计数器结果的有效负载。

可在 VkPerformanceCounterKHR::storage 中返回的性能计数器存储类型可能是:

// Provided by VK_KHR_performance_query
typedef enum VkPerformanceCounterStorageKHR {
    VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR = 0,
    VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR = 1,
    VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR = 2,
    VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR = 3,
    VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR = 4,
    VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR = 5,
} VkPerformanceCounterStorageKHR;
  • VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR - 性能计数器存储为 32 位有符号整数。

  • VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR - 性能计数器存储为 64 位有符号整数。

  • VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR - 性能计数器存储为 32 位无符号整数。

  • VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR - 性能计数器存储为 64 位无符号整数。

  • VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR - 性能计数器存储为 32 位浮点数。

  • VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR - 性能计数器存储为 64 位浮点数。

VkPerformanceCounterDescriptionKHR 结构的定义如下

// Provided by VK_KHR_performance_query
typedef struct VkPerformanceCounterDescriptionKHR {
    VkStructureType                            sType;
    void*                                      pNext;
    VkPerformanceCounterDescriptionFlagsKHR    flags;
    char                                       name[VK_MAX_DESCRIPTION_SIZE];
    char                                       category[VK_MAX_DESCRIPTION_SIZE];
    char                                       description[VK_MAX_DESCRIPTION_SIZE];
} VkPerformanceCounterDescriptionKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkPerformanceCounterDescriptionFlagBitsKHR 的位掩码,指示计数器的使用行为。

  • name 是一个大小为 VK_MAX_DESCRIPTION_SIZE 的数组,包含一个以 null 结尾的 UTF-8 字符串,指定计数器的名称。

  • category 是一个大小为 VK_MAX_DESCRIPTION_SIZE 的数组,包含一个以 null 结尾的 UTF-8 字符串,指定计数器的类别。

  • description 是一个大小为 VK_MAX_DESCRIPTION_SIZE 的数组,包含一个以 null 结尾的 UTF-8 字符串,指定计数器的描述。

有效用法(隐式)
  • VUID-VkPerformanceCounterDescriptionKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR

  • VUID-VkPerformanceCounterDescriptionKHR-pNext-pNext
    pNext 必须NULL

VkPerformanceCounterDescriptionKHR::flags可以设置的位,用于指定性能计数器的使用行为,如下所示

// Provided by VK_KHR_performance_query
typedef enum VkPerformanceCounterDescriptionFlagBitsKHR {
    VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR = 0x00000001,
    VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR = 0x00000002,
  // VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR is a deprecated alias
    VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR,
  // VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR is a deprecated alias
    VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR,
} VkPerformanceCounterDescriptionFlagBitsKHR;
  • VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR 指定记录计数器可能会对性能产生明显的影响。

  • VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR 指定当其他提交的命令缓冲区正在运行时,并发记录计数器可能会影响记录的准确性。

// Provided by VK_KHR_performance_query
typedef VkFlags VkPerformanceCounterDescriptionFlagsKHR;

VkPerformanceCounterDescriptionFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkPerformanceCounterDescriptionFlagBitsKHR 的掩码。

设备

设备对象表示与物理设备的逻辑连接。每个设备都公开了许多队列族,每个队列族都有一个或多个队列。队列族中的所有队列都支持相同的操作。

物理设备 中所述,Vulkan 应用程序将首先查询系统中所有物理设备。然后,可以查询每个物理设备的功能,包括其队列和队列族属性。一旦确定了一个可接受的物理设备,应用程序将创建一个相应的逻辑设备。创建的逻辑设备随后成为物理设备的主要接口。

如何在系统中枚举物理设备并查询这些物理设备的队列族属性,在上面的 物理设备枚举 部分中进行了描述。

如果多个物理设备属于同一个设备组,则可以从这些物理设备创建一个逻辑设备。设备组是一组物理设备,它们支持访问彼此的内存并记录一个可以在所有物理设备上执行的命令缓冲区。通过调用 vkEnumeratePhysicalDeviceGroups 来枚举设备组,并通过 VkDeviceGroupDeviceCreateInfo 传递物理设备,可以从设备组中的物理设备子集创建逻辑设备。为了使两个物理设备在同一个设备组中,它们必须支持相同的扩展、特性和属性。

同一设备组中的物理设备必须如此相似,因为没有关于不同特性/属性如何交互的规则。它们必须为几乎所有不变的 vkGetPhysicalDevice* 特性、属性、功能等返回相同的值,但可能会在某些查询中因诸如连接了不同的显示器或不同的合成器等因素而有所不同。规范不尝试枚举每种类别中的状态,因为这样的列表很快就会过时。

要检索系统中存在的设备组列表,请调用

// Provided by VK_VERSION_1_1
VkResult vkEnumeratePhysicalDeviceGroups(
    VkInstance                                  instance,
    uint32_t*                                   pPhysicalDeviceGroupCount,
    VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties);

或等效命令

// Provided by VK_KHR_device_group_creation
VkResult vkEnumeratePhysicalDeviceGroupsKHR(
    VkInstance                                  instance,
    uint32_t*                                   pPhysicalDeviceGroupCount,
    VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties);
  • instance 是先前使用 vkCreateInstance 创建的 Vulkan 实例的句柄。

  • pPhysicalDeviceGroupCount 是一个指向整数的指针,该整数与可用或查询的设备组数量相关,如下所述。

  • pPhysicalDeviceGroupPropertiesNULL 或指向 VkPhysicalDeviceGroupProperties 结构数组的指针。

如果 pPhysicalDeviceGroupPropertiesNULL,则可用设备组的数量将在 pPhysicalDeviceGroupCount 中返回。否则,pPhysicalDeviceGroupCount 必须指向一个由应用程序设置为 pPhysicalDeviceGroupProperties 数组中元素数量的变量,并且在返回时,该变量会被实际写入 pPhysicalDeviceGroupProperties 的结构数量覆盖。如果 pPhysicalDeviceGroupCount 小于可用设备组的数量,则最多会写入 pPhysicalDeviceGroupCount 个结构,并且会返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的设备组都被返回。

每个物理设备必须恰好在一个设备组中。

有效用法(隐式)
  • VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter
    instance **必须**是有效的 VkInstance 句柄

  • VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter
    pPhysicalDeviceGroupCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter
    如果 pPhysicalDeviceGroupCount 引用的值不为 0,并且 pPhysicalDeviceGroupProperties 不为 NULL,则 pPhysicalDeviceGroupProperties 必须是指向 pPhysicalDeviceGroupCountVkPhysicalDeviceGroupProperties 结构数组的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

VkPhysicalDeviceGroupProperties 结构的定义如下

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceGroupProperties {
    VkStructureType     sType;
    void*               pNext;
    uint32_t            physicalDeviceCount;
    VkPhysicalDevice    physicalDevices[VK_MAX_DEVICE_GROUP_SIZE];
    VkBool32            subsetAllocation;
} VkPhysicalDeviceGroupProperties;

或等效结构

// Provided by VK_KHR_device_group_creation
typedef VkPhysicalDeviceGroupProperties VkPhysicalDeviceGroupPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • physicalDeviceCount 是组中物理设备的数量。

  • physicalDevices 是一个 VK_MAX_DEVICE_GROUP_SIZE VkPhysicalDevice 句柄的数组,表示组中的所有物理设备。数组的前 physicalDeviceCount 个元素将是有效的。

  • subsetAllocation 指定从该组创建的逻辑设备是否支持在设备子集上分配设备内存,通过 VkMemoryAllocateFlagsInfodeviceMask 成员。如果此值为 VK_FALSE,则所有设备内存分配都将在组中的所有物理设备上进行。如果 physicalDeviceCount1,则 subsetAllocation 必须VK_FALSE

有效用法(隐式)
  • VUID-VkPhysicalDeviceGroupProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES

  • VUID-VkPhysicalDeviceGroupProperties-pNext-pNext
    pNext 必须NULL

VK_MAX_DEVICE_GROUP_SIZE 是一个数组的长度,该数组包含 VkPhysicalDevice 句柄值,表示组中的所有物理设备,如 VkPhysicalDeviceGroupProperties::physicalDevices 中返回。

#define VK_MAX_DEVICE_GROUP_SIZE          32U

或等效结构

#define VK_MAX_DEVICE_GROUP_SIZE_KHR      VK_MAX_DEVICE_GROUP_SIZE

设备创建

逻辑设备由 VkDevice 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_HANDLE(VkDevice)

逻辑设备是作为与物理设备的连接而创建的。要创建逻辑设备,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateDevice(
    VkPhysicalDevice                            physicalDevice,
    const VkDeviceCreateInfo*                   pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkDevice*                                   pDevice);
  • physicalDevice 必须是从调用 vkEnumeratePhysicalDevices 返回的设备句柄之一(请参阅 物理设备枚举)。

  • pCreateInfo 是指向 VkDeviceCreateInfo 结构的指针,其中包含有关如何创建设备的信息。

  • pAllocator 控制主机内存分配,如 内存分配 章节中所述。

  • pDevice 是一个指针,指向一个句柄,创建的 VkDevice 将返回到该句柄中。

vkCreateDevice 验证 pCreateInfoppEnabledExtensionNamespEnabledFeatures 成员中分别请求的扩展和功能是否受实现支持。如果任何请求的扩展不受支持,vkCreateDevice 必须返回 VK_ERROR_EXTENSION_NOT_PRESENT。如果任何请求的功能不受支持,vkCreateDevice 必须返回 VK_ERROR_FEATURE_NOT_PRESENT。可以通过查询 vkEnumerateDeviceExtensionProperties,在创建设备之前检查对扩展的支持。可以通过查询 vkGetPhysicalDeviceFeatures,类似地检查对功能的支持。

在验证并启用扩展后,将创建 VkDevice 对象并返回给应用程序。

可以从同一物理设备创建多个逻辑设备。逻辑设备的创建 可能 会因缺少设备特定资源(以及其他错误)而失败。如果发生这种情况,vkCreateDevice 将返回 VK_ERROR_TOO_MANY_OBJECTS

有效使用
有效用法(隐式)
  • VUID-vkCreateDevice-physicalDevice-parameter
    physicalDevice **必须**是有效的 VkPhysicalDevice 句柄

  • VUID-vkCreateDevice-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效 VkDeviceCreateInfo 结构的有效指针。

  • VUID-vkCreateDevice-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须 是指向有效的 VkAllocationCallbacks 结构的有效指针。

  • VUID-vkCreateDevice-pDevice-parameter
    pDevice 必须 是指向 VkDevice 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_EXTENSION_NOT_PRESENT

  • VK_ERROR_FEATURE_NOT_PRESENT

  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_DEVICE_LOST

VkDeviceCreateInfo 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkDeviceCreateInfo {
    VkStructureType                    sType;
    const void*                        pNext;
    VkDeviceCreateFlags                flags;
    uint32_t                           queueCreateInfoCount;
    const VkDeviceQueueCreateInfo*     pQueueCreateInfos;
    // enabledLayerCount is deprecated and should not be used
    uint32_t                           enabledLayerCount;
    // ppEnabledLayerNames is deprecated and should not be used
    const char* const*                 ppEnabledLayerNames;
    uint32_t                           enabledExtensionCount;
    const char* const*                 ppEnabledExtensionNames;
    const VkPhysicalDeviceFeatures*    pEnabledFeatures;
} VkDeviceCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

  • queueCreateInfoCountpQueueCreateInfos 数组的无符号整数大小。有关更多详细信息,请参阅下面的队列创建部分。

  • pQueueCreateInfos 是指向 VkDeviceQueueCreateInfo 结构数组的指针,该数组描述了与逻辑设备一起请求创建的队列。有关更多详细信息,请参阅下面的队列创建部分。

  • enabledLayerCount 已弃用并被忽略。

  • ppEnabledLayerNames 已弃用并被忽略。请参阅设备层弃用

  • enabledExtensionCount 是要启用的设备扩展的数量。

  • ppEnabledExtensionNames 是一个指针,指向一个包含 enabledExtensionCount 个以 null 结尾的 UTF-8 字符串的数组,这些字符串包含要为创建的设备启用的扩展的名称。有关更多详细信息,请参阅扩展部分。

  • pEnabledFeaturesNULL 或指向 VkPhysicalDeviceFeatures 结构的指针,该结构包含所有要启用的功能的布尔指示器。有关更多详细信息,请参阅功能部分。

有效使用
有效用法(隐式)
// Provided by VK_VERSION_1_0
typedef VkFlags VkDeviceCreateFlags;

VkDeviceCreateFlags 是用于设置掩码的位掩码类型,但目前保留供将来使用。

通过将 VkDeviceGroupDeviceCreateInfo 结构添加到 VkDeviceCreateInfopNext 链,可以创建一个连接到一个或多个物理设备的逻辑设备。VkDeviceGroupDeviceCreateInfo 结构定义为:

// Provided by VK_VERSION_1_1
typedef struct VkDeviceGroupDeviceCreateInfo {
    VkStructureType            sType;
    const void*                pNext;
    uint32_t                   physicalDeviceCount;
    const VkPhysicalDevice*    pPhysicalDevices;
} VkDeviceGroupDeviceCreateInfo;

或等效结构

// Provided by VK_KHR_device_group_creation
typedef VkDeviceGroupDeviceCreateInfo VkDeviceGroupDeviceCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • physicalDeviceCountpPhysicalDevices 数组中的元素数量。

  • pPhysicalDevices 是指向属于同一设备组的物理设备句柄数组的指针。

pPhysicalDevices 数组的元素是逻辑设备表示的物理设备的有序列表。 这些必须是单个设备组的子集,并且无需与枚举它们的顺序相同。 pPhysicalDevices 数组中物理设备的顺序决定了每个物理设备的设备索引,其中元素 i 被分配的设备索引为 i。某些命令和结构通过使用设备索引或使用设备索引形成的设备掩码来引用一个或多个物理设备。

创建时不使用 VkDeviceGroupDeviceCreateInfophysicalDeviceCount 等于零的逻辑设备,等效于 physicalDeviceCount 为 1,并且 pPhysicalDevices 指向 vkCreateDevicephysicalDevice 参数。 特别地,该物理设备的设备索引为零。

有效使用
  • VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375
    pPhysicalDevices 的每个元素必须是唯一的。

  • VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376
    pPhysicalDevices 的所有元素必须vkEnumeratePhysicalDeviceGroups 枚举的设备组相同。

  • VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377
    如果 physicalDeviceCount 不为 0,则 vkCreateDevicephysicalDevice 参数必须pPhysicalDevices 的一个元素。

有效用法(隐式)
  • VUID-VkDeviceGroupDeviceCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO

  • VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter
    如果 physicalDeviceCount 不为 0,则 pPhysicalDevices 必须是指向 physicalDeviceCount 个有效 VkPhysicalDevice 句柄的数组的有效指针。

要指定是否允许设备内存分配超出 VkPhysicalDeviceMemoryProperties 报告的大小,请将 VkDeviceMemoryOverallocationCreateInfoAMD 结构添加到 VkDeviceCreateInfo 结构的 pNext 链中。如果未指定此结构,则相当于使用了 VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD 值。

// Provided by VK_AMD_memory_overallocation_behavior
typedef struct VkDeviceMemoryOverallocationCreateInfoAMD {
    VkStructureType                      sType;
    const void*                          pNext;
    VkMemoryOverallocationBehaviorAMD    overallocationBehavior;
} VkDeviceMemoryOverallocationCreateInfoAMD;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • overallocationBehavior 是所需的过度分配行为。

有效用法(隐式)
  • VUID-VkDeviceMemoryOverallocationCreateInfoAMD-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD

  • VUID-VkDeviceMemoryOverallocationCreateInfoAMD-overallocationBehavior-parameter
    overallocationBehavior 必须是有效的 VkMemoryOverallocationBehaviorAMD 值。

VkDeviceMemoryOverallocationCreateInfoAMD::overallocationBehavior 的可能值包括

// Provided by VK_AMD_memory_overallocation_behavior
typedef enum VkMemoryOverallocationBehaviorAMD {
    VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD = 0,
    VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD = 1,
    VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD = 2,
} VkMemoryOverallocationBehaviorAMD;
  • VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD 让实现决定是否允许过度分配。

  • VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD 指定如果平台允许,则允许过度分配。

  • VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD 指定应用程序不允许分配超出 VkPhysicalDeviceMemoryProperties 报告的堆大小的设备内存。在 Vulkan 实例范围内应用程序未明确进行的分配不予考虑。

当使用 Nsight Aftermath SDK 时,要配置如何创建设备崩溃转储,请将 VkDeviceDiagnosticsConfigCreateInfoNV 结构添加到 VkDeviceCreateInfo 结构的 pNext 链中。

// Provided by VK_NV_device_diagnostics_config
typedef struct VkDeviceDiagnosticsConfigCreateInfoNV {
    VkStructureType                     sType;
    const void*                         pNext;
    VkDeviceDiagnosticsConfigFlagsNV    flags;
} VkDeviceDiagnosticsConfigCreateInfoNV;
有效用法(隐式)
  • VUID-VkDeviceDiagnosticsConfigCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV

  • VUID-VkDeviceDiagnosticsConfigCreateInfoNV-flags-parameter
    flags 必须VkDeviceDiagnosticsConfigFlagBitsNV 值的有效组合。

可以在 VkDeviceDiagnosticsConfigCreateInfoNV::flags 中设置的位包括

// Provided by VK_NV_device_diagnostics_config
typedef enum VkDeviceDiagnosticsConfigFlagBitsNV {
    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV = 0x00000001,
    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV = 0x00000002,
    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV = 0x00000004,
    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV = 0x00000008,
} VkDeviceDiagnosticsConfigFlagBitsNV;
  • VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV 启用着色器的调试信息生成。

  • VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV 启用驱动程序端跟踪用于增强设备故障信息的资源(图像、缓冲区等)。

  • VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV 启用对绘制调用、分发、光线追踪和复制的诊断检查点的自动插入。命令时的 CPU 调用堆栈将作为自动插入的检查点的标记数据相关联。

  • VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV 启用着色器错误报告。

// Provided by VK_NV_device_diagnostics_config
typedef VkFlags VkDeviceDiagnosticsConfigFlagsNV;

VkDeviceDiagnosticsConfigFlagsNV 是一种位掩码类型,用于设置零个或多个 VkDeviceDiagnosticsConfigFlagBitsNV 的掩码。

要注册 VkDeviceMemoryReportEventTypeEXT 类型的底层设备内存事件的回调,请将一个或多个 VkDeviceDeviceMemoryReportCreateInfoEXT 结构添加到 VkDeviceCreateInfo 结构的 pNext 链中。

// Provided by VK_EXT_device_memory_report
typedef struct VkDeviceDeviceMemoryReportCreateInfoEXT {
    VkStructureType                        sType;
    const void*                            pNext;
    VkDeviceMemoryReportFlagsEXT           flags;
    PFN_vkDeviceMemoryReportCallbackEXT    pfnUserCallback;
    void*                                  pUserData;
} VkDeviceDeviceMemoryReportCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 为 0,保留供将来使用。

  • pfnUserCallback 是要调用的应用程序回调函数。

  • pUserData 是要传递给回调的用户数据。

回调函数可能会被多个线程同时调用。

当发生 VkDeviceMemoryReportEventTypeEXT 事件时,实现必须只调用一次回调函数。

回调函数可以从调用 Vulkan 命令的线程以外的后台线程调用。

有效用法(隐式)
  • VUID-VkDeviceDeviceMemoryReportCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT

  • VUID-VkDeviceDeviceMemoryReportCreateInfoEXT-flags-zerobitmask
    flags 必须0

  • VUID-VkDeviceDeviceMemoryReportCreateInfoEXT-pfnUserCallback-parameter
    pfnUserCallback 必须是有效的 PFN_vkDeviceMemoryReportCallbackEXT 值。

  • VUID-VkDeviceDeviceMemoryReportCreateInfoEXT-pUserData-parameter
    pUserData 必须是指针值。

应用程序实现的 VkDeviceDeviceMemoryReportCreateInfoEXT::pfnUserCallback 函数的原型是

// Provided by VK_EXT_device_memory_report
typedef void (VKAPI_PTR *PFN_vkDeviceMemoryReportCallbackEXT)(
    const VkDeviceMemoryReportCallbackDataEXT*  pCallbackData,
    void*                                       pUserData);

回调函数必须不能调用任何 Vulkan 命令。

VkDeviceMemoryReportCallbackDataEXT 的定义是

// Provided by VK_EXT_device_memory_report
typedef struct VkDeviceMemoryReportCallbackDataEXT {
    VkStructureType                     sType;
    void*                               pNext;
    VkDeviceMemoryReportFlagsEXT        flags;
    VkDeviceMemoryReportEventTypeEXT    type;
    uint64_t                            memoryObjectId;
    VkDeviceSize                        size;
    VkObjectType                        objectType;
    uint64_t                            objectHandle;
    uint32_t                            heapIndex;
} VkDeviceMemoryReportCallbackDataEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 为 0,保留供将来使用。

  • type 是一个 VkDeviceMemoryReportEventTypeEXT 类型,指定此 VkDeviceMemoryReportCallbackDataEXT 结构中报告的事件类型。

  • memoryObjectId 是底层内存对象的唯一 ID,如下所述。

  • size 是内存对象的大小,以字节为单位。如果 typeVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT,则 size 是一个有效的 VkDeviceSize 值。否则,size未定义的

  • objectType 是一个 VkObjectType 值,指定与此设备内存报告事件关联的对象的类型。如果 typeVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT,则 objectType 是一个有效的 VkObjectType 枚举。否则,objectType未定义的

  • objectHandle 是此设备内存报告事件归属的对象。如果 typeVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT,则 objectHandle 是一个有效的 Vulkan 句柄,其类型与 VkObjectType 和 Vulkan 句柄关系表中定义的 objectType 关联。否则,objectHandle未定义的

  • heapIndex 描述了此设备内存分配来自哪个内存堆。如果 typeVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT,则 heapIndex 对应于 VkPhysicalDeviceMemoryProperties 结构中的一个有效堆。否则,heapIndex未定义的

memoryObjectId 用于避免在同一内存对象上重复计数。

如果无法导出内部分配的设备内存对象或 VkDeviceMemory,则 memoryObjectIdVkDevice必须是唯一的。

如果内部分配的设备内存对象或 VkDeviceMemory 支持导出,则 memoryObjectId 在系统范围内必须是唯一的。

如果内部设备内存对象或 VkDeviceMemory 由导入的外部内存对象支持,则 memoryObjectId 在系统范围内必须是唯一的。

此结构仅在触发的回调的生命周期内被视为有效。

对于 VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXTVK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT 事件,当应用程序或工具接收到回调时,objectHandle 通常还不存在。objectHandle 仅在触发事件的创建或分配调用返回时存在,如果分配或导入最终失败,则 objectHandle 将永远不存在。

有效用法(隐式)
  • VUID-VkDeviceMemoryReportCallbackDataEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT

  • VUID-VkDeviceMemoryReportCallbackDataEXT-pNext-pNext
    pNext 必须NULL

// Provided by VK_EXT_device_memory_report
typedef VkFlags VkDeviceMemoryReportFlagsEXT;

VkDeviceMemoryReportFlagsEXT 是一种用于设置掩码的位掩码类型,但目前保留供将来使用。

VkDeviceMemoryReportCallbackDataEXT::type 的可能值,指定导致设备驱动程序调用回调的事件类型,如下所示:

// Provided by VK_EXT_device_memory_report
typedef enum VkDeviceMemoryReportEventTypeEXT {
    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT = 0,
    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT = 1,
    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT = 2,
    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT = 3,
    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT = 4,
} VkDeviceMemoryReportEventTypeEXT;
  • VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT 指定此事件对应于内部设备内存对象或 VkDeviceMemory 的分配。

  • VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT 指定此事件对应于内部分配的设备内存对象或 VkDeviceMemory 的释放。

  • VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT 指定此事件对应于外部内存对象的导入。

  • VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT 指定此事件是释放导入的外部内存对象。

  • VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT 指定此事件对应于内部设备内存对象或 VkDeviceMemory 的分配失败。

要保留私有数据存储槽,请将 VkDevicePrivateDataCreateInfo 结构添加到 VkDeviceCreateInfo 结构的 pNext 链中。以这种方式保留槽不是严格必要的,但这样做可能会提高性能。

// Provided by VK_VERSION_1_3
typedef struct VkDevicePrivateDataCreateInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           privateDataSlotRequestCount;
} VkDevicePrivateDataCreateInfo;

或等效结构

// Provided by VK_EXT_private_data
typedef VkDevicePrivateDataCreateInfo VkDevicePrivateDataCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • privateDataSlotRequestCount 是要保留的槽的数量。

有效用法(隐式)
  • VUID-VkDevicePrivateDataCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO

要禁用实现内部管道缓存,请将 VkDevicePipelineBinaryInternalCacheControlKHR 结构添加到 VkDeviceCreateInfo 结构的 pNext 链中。

// Provided by VK_KHR_pipeline_binary
typedef struct VkDevicePipelineBinaryInternalCacheControlKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           disableInternalCache;
} VkDevicePipelineBinaryInternalCacheControlKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • disableInternalCache 指定是否禁用实现的内部管道缓存。

如果 VkDeviceCreateInfo::pNext 链不包含此结构,则 disableInternalCache 默认为 VK_FALSE

有效使用
  • VUID-VkDevicePipelineBinaryInternalCacheControlKHR-disableInternalCache-09602
    如果 VkPhysicalDevicePipelineBinaryPropertiesKHR::pipelineBinaryInternalCacheControlVK_FALSE,则 disableInternalCache 必须VK_FALSE

有效用法(隐式)
  • VUID-VkDevicePipelineBinaryInternalCacheControlKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_PIPELINE_BINARY_INTERNAL_CACHE_CONTROL_KHR

设备的所有队列使用的着色器核心数量可以通过将 VkDeviceQueueShaderCoreControlCreateInfoARM 结构添加到 VkDeviceCreateInfo 结构的 pNext 链中来控制。

设备使用

以下是 VkDevice 用途的高级列表,以及查找更多信息的参考:

  • 创建队列。有关更多详细信息,请参见下面的队列部分。

  • 创建和跟踪各种同步结构。有关更多详细信息,请参见同步和缓存控制

  • 分配、释放和管理内存。有关更多详细信息,请参见内存分配资源创建

  • 创建和销毁命令缓冲区和命令缓冲区池。有关更多详细信息,请参见命令缓冲区

  • 创建、销毁和管理图形状态。有关更多详细信息,请参见管道资源描述符等。

丢失的设备

由于许多特定于实现的原因,逻辑设备可能会变得丢失,这表示挂起和将来的命令执行可能会失败,并导致资源和后备内存变得未定义

设备丢失的典型原因包括执行超时(以防止拒绝服务)、电源管理事件、平台资源管理和实现错误。

应用程序不遵守有效使用也可能导致报告设备丢失,但这不能保证。即使报告了设备丢失,系统也可能处于无法恢复的状态,进一步使用 API 仍然被认为是无效的。

当发生这种情况时,某些命令将返回 VK_ERROR_DEVICE_LOST。在发生任何此类事件后,逻辑设备被认为是丢失的。不可能将逻辑设备重置为非丢失状态,但是丢失状态特定于逻辑设备 (VkDevice),并且相应的物理设备 (VkPhysicalDevice) 可能在其他方面不受影响。

在某些情况下,物理设备可能也会丢失,尝试创建新的逻辑设备将失败,并返回 VK_ERROR_DEVICE_LOST。这通常表明底层实现或其与主机的连接存在问题。如果物理设备没有丢失,并且从该物理设备成功创建了新的逻辑设备,则它必须处于非丢失状态。

虽然逻辑设备丢失可能是可恢复的,但在物理设备丢失的情况下,除非系统上存在其他不受影响的物理设备,否则应用程序不太可能恢复。此错误主要是信息性的,仅旨在告知应用程序发生了平台问题,并且应该进一步调查。例如,底层硬件可能已出现故障或与系统的其余部分物理断开连接。在许多情况下,物理设备丢失可能会导致其他更严重的问题,例如操作系统崩溃;在这种情况下,它可能不会通过 Vulkan API 报告。

当设备丢失时,其子对象不会被隐式销毁,并且它们的句柄仍然有效。这些对象在它们的父对象或设备可以被销毁之前必须仍然被销毁(请参阅对象生命周期部分)。使用 vkMapMemory 映射的设备内存对应的主机地址空间仍然有效,并且对这些映射区域的主机内存访问仍然有效,但内容是未定义的。在设备和子对象上调用任何 API 命令仍然是合法的。

一旦设备丢失,命令执行可能会失败,并且某些返回 VkResult 的命令可能会返回 VK_ERROR_DEVICE_LOST。这些命令可以通过每个命令的“返回代码”部分中包含 VK_ERROR_DEVICE_LOST 来识别。不允许运行时错误的命令对于有效使用必须仍然正确运行,并且如果适用,则返回有效数据。

无限期等待设备执行的命令(即 vkDeviceWaitIdlevkQueueWaitIdlevkWaitForFencesvkAcquireNextImageKHR 带有最大 timeout,以及 vkGetQueryPoolResultsflags 中设置了 VK_QUERY_RESULT_WAIT_BIT 位)即使在设备丢失的情况下必须在有限的时间内返回,并且返回 VK_SUCCESSVK_ERROR_DEVICE_LOST。对于任何可能返回 VK_ERROR_DEVICE_LOST 的命令,为了确定命令缓冲区是否处于挂起状态,或者资源是否被设备视为正在使用,返回值 VK_ERROR_DEVICE_LOST 等同于 VK_SUCCESS

如果使用maintenance5功能启用了设备,并且任何设备命令返回 VK_ERROR_DEVICE_LOST,则所有 VK_ERROR_DEVICE_LOST 是有效返回值的设备命令,以及在同一主机线程上发生在其之后的所有命令必须返回 VK_ERROR_DEVICE_LOST

在其他线程上执行的设备命令必须在有限的时间内开始返回 VK_ERROR_DEVICE_LOST

从丢失的设备导出或导入的任何外部内存对象的内容都变为未定义的。其他逻辑设备上或与其他 API 相关的对象,与丢失设备上的外部内存对象具有相同底层内存资源,除了它们的内容变为未定义的之外,不受影响。绑定到与丢失设备上的外部内存对象具有相同底层内存资源的 VkDeviceMemory 对象的其他逻辑设备上的图像子资源的布局变为 VK_IMAGE_LAYOUT_UNDEFINED

通过导入信号量有效负载创建的,且具有从丢失的设备导出的临时持久性的其他逻辑设备上的 VkSemaphore 对象的状态是未定义的。在其他逻辑设备上,与丢失的设备上的 VkSemaphore 对象永久共享信号量有效负载的 VkSemaphore 对象的状态是未定义的,并且在随后的任何信号操作后仍然是未定义的。实现必须确保此类信号量的挂起和后续提交的等待操作的行为符合 等待操作的信号量状态要求 中定义的用于等待操作的外部信号量处于无效状态。

设备销毁

要销毁设备,请调用

// Provided by VK_VERSION_1_0
void vkDestroyDevice(
    VkDevice                                    device,
    const VkAllocationCallbacks*                pAllocator);
  • device 是要销毁的逻辑设备。

  • pAllocator 控制主机内存分配,如 内存分配 章节中所述。

为了确保设备上没有活动的工作,vkDeviceWaitIdle可以用于控制设备的销毁。在销毁设备之前,应用程序有责任销毁/释放使用该设备作为相应 vkCreate*vkAllocate* 命令的第一个参数创建的任何 Vulkan 对象。

这些对象的生命周期受 VkDevice 对象的生命周期约束。因此,为避免资源泄漏,应用程序必须在调用 vkDestroyDevice 之前显式释放所有这些资源。

有效使用
  • VUID-vkDestroyDevice-device-05137
    在销毁 device 之前,必须销毁在 device 上创建的所有子对象

  • VUID-vkDestroyDevice-device-00379
    如果在创建 device 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调函数。

  • VUID-vkDestroyDevice-device-00380
    如果在创建 device 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyDevice-device-parameter
    如果 device 不为 NULL,则 device 必须是一个有效的 VkDevice 句柄。

  • VUID-vkDestroyDevice-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须 是指向有效的 VkAllocationCallbacks 结构的有效指针。

主机同步
  • device 的主机访问必须进行外部同步。

  • 对从 device 创建的所有 VkQueue 对象的主机访问必须进行外部同步。

队列

队列族属性

如上面的物理设备枚举部分所述,vkGetPhysicalDeviceQueueFamilyProperties 命令用于检索有关设备支持的队列族和队列的详细信息。

vkGetPhysicalDeviceQueueFamilyProperties 返回的 pQueueFamilyProperties 数组中的每个索引都描述了该物理设备上的一个唯一队列族。这些索引在创建队列时使用,它们与通过 VkDeviceQueueCreateInfo 结构传递给 vkCreateDevice 命令的 queueFamilyIndex 直接对应,如下面的队列创建部分所述。

物理设备内队列族的的分组是与具体实现相关的。

通常的期望是,物理设备将所有具有匹配功能的队列分组到一个族中。但是,虽然实现应该这样做,但物理设备可能返回两个具有相同功能的独立队列族。

一旦应用程序识别出具有其希望使用的队列的物理设备,它将结合逻辑设备创建这些队列。这将在下一节中介绍。

队列创建

创建逻辑设备还会创建与该设备关联的队列。要创建的队列由一组 VkDeviceQueueCreateInfo 结构描述,这些结构在 pQueueCreateInfos 中传递给 vkCreateDevice

队列由 VkQueue 句柄表示。

// Provided by VK_VERSION_1_0
VK_DEFINE_HANDLE(VkQueue)

VkDeviceQueueCreateInfo 结构的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkDeviceQueueCreateInfo {
    VkStructureType             sType;
    const void*                 pNext;
    VkDeviceQueueCreateFlags    flags;
    uint32_t                    queueFamilyIndex;
    uint32_t                    queueCount;
    const float*                pQueuePriorities;
} VkDeviceQueueCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个位掩码,指示队列的行为。

  • queueFamilyIndex 是一个无符号整数,表示要在该设备上创建队列的队列族的索引。此索引与 vkGetPhysicalDeviceQueueFamilyProperties 返回的 pQueueFamilyProperties 数组的元素的索引相对应。

  • queueCount 是一个无符号整数,指定要在由 queueFamilyIndex 指示的队列族中创建的队列的数量,以及由 flags 指定的行为。

  • pQueuePriorities 是一个指向 queueCount 个归一化浮点值的数组的指针,指定将提交到每个创建队列的工作的优先级。有关更多信息,请参阅队列优先级

有效使用
  • VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381
    queueFamilyIndex 必须小于 vkGetPhysicalDeviceQueueFamilyProperties 返回的 pQueueFamilyPropertyCount

  • VUID-VkDeviceQueueCreateInfo-queueCount-00382
    queueCount 必须小于或等于 VkQueueFamilyProperties 结构的 queueCount 成员,该结构由 vkGetPhysicalDeviceQueueFamilyPropertiespQueueFamilyProperties[queueFamilyIndex] 中返回。

  • VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383
    pQueuePriorities 的每个元素必须介于 0.01.0 之间,包括 0.01.0

  • VUID-VkDeviceQueueCreateInfo-flags-02861
    如果未启用protectedMemory 功能,则 flagsVK_DEVICE_QUEUE_CREATE_PROTECTED_BIT必须不被设置。

  • VUID-VkDeviceQueueCreateInfo-flags-06449
    如果 flags 包括 VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT,则 queueFamilyIndex 必须是包含 VK_QUEUE_PROTECTED_BIT 功能的队列族的索引。

  • VUID-VkDeviceQueueCreateInfo-pNext-09398
    如果 pNext 链包含 VkDeviceQueueShaderCoreControlCreateInfoARM 结构,则 VkPhysicalDeviceSchedulingControlsPropertiesARM::schedulingControlsFlags 必须包含 VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM

有效用法(隐式)
  • VUID-VkDeviceQueueCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO

  • VUID-VkDeviceQueueCreateInfo-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkDeviceQueueGlobalPriorityCreateInfoVkDeviceQueueShaderCoreControlCreateInfoARM 的有效实例的指针。

  • VUID-VkDeviceQueueCreateInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkDeviceQueueCreateInfo-flags-parameter
    flags 必须VkDeviceQueueCreateFlagBits 值的有效组合。

  • VUID-VkDeviceQueueCreateInfo-pQueuePriorities-parameter
    pQueuePriorities 必须是指向 queueCountfloat 值的数组的有效指针。

  • VUID-VkDeviceQueueCreateInfo-queueCount-arraylength
    queueCount 必须大于 0

可以在 VkDeviceQueueCreateInfo::flags 中设置的位,用于指定队列的使用行为,如下所示:

// Provided by VK_VERSION_1_1
typedef enum VkDeviceQueueCreateFlagBits {
  // Provided by VK_VERSION_1_1
    VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT = 0x00000001,
} VkDeviceQueueCreateFlagBits;
  • VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT 指定设备队列是受保护的队列。

// Provided by VK_VERSION_1_0
typedef VkFlags VkDeviceQueueCreateFlags;

VkDeviceQueueCreateFlags 是一个位掩码类型,用于设置零个或多个 VkDeviceQueueCreateFlagBits 的掩码。

通过将 VkDeviceQueueGlobalPriorityCreateInfo 结构体添加到 VkDeviceQueueCreateInfopNext 链中,可以创建具有系统级优先级的队列。

VkDeviceQueueGlobalPriorityCreateInfo 结构体定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkDeviceQueueGlobalPriorityCreateInfo {
    VkStructureType          sType;
    const void*              pNext;
    VkQueueGlobalPriority    globalPriority;
} VkDeviceQueueGlobalPriorityCreateInfo;

或等效结构

// Provided by VK_KHR_global_priority
typedef VkDeviceQueueGlobalPriorityCreateInfo VkDeviceQueueGlobalPriorityCreateInfoKHR;

或等效结构

// Provided by VK_EXT_global_priority
typedef VkDeviceQueueGlobalPriorityCreateInfo VkDeviceQueueGlobalPriorityCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • globalPriority 是与这些队列关联的系统级优先级,由 VkQueueGlobalPriority 指定。

创建队列时,如果没有指定 VkDeviceQueueGlobalPriorityCreateInfo,则默认优先级为 VK_QUEUE_GLOBAL_PRIORITY_MEDIUM

有效用法(隐式)
  • VUID-VkDeviceQueueGlobalPriorityCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO

  • VUID-VkDeviceQueueGlobalPriorityCreateInfo-globalPriority-parameter
    globalPriority 必须是有效的 VkQueueGlobalPriority 值。

以下是 VkDeviceQueueGlobalPriorityCreateInfo::globalPriority 的可能值,它们指定了系统级优先级:

// Provided by VK_VERSION_1_4
typedef enum VkQueueGlobalPriority {
    VK_QUEUE_GLOBAL_PRIORITY_LOW = 128,
    VK_QUEUE_GLOBAL_PRIORITY_MEDIUM = 256,
    VK_QUEUE_GLOBAL_PRIORITY_HIGH = 512,
    VK_QUEUE_GLOBAL_PRIORITY_REALTIME = 1024,
  // Provided by VK_EXT_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT = VK_QUEUE_GLOBAL_PRIORITY_LOW,
  // Provided by VK_EXT_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM,
  // Provided by VK_EXT_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT = VK_QUEUE_GLOBAL_PRIORITY_HIGH,
  // Provided by VK_EXT_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT = VK_QUEUE_GLOBAL_PRIORITY_REALTIME,
  // Provided by VK_KHR_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR = VK_QUEUE_GLOBAL_PRIORITY_LOW,
  // Provided by VK_KHR_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM,
  // Provided by VK_KHR_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR = VK_QUEUE_GLOBAL_PRIORITY_HIGH,
  // Provided by VK_KHR_global_priority
    VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR = VK_QUEUE_GLOBAL_PRIORITY_REALTIME,
} VkQueueGlobalPriority;

或等效结构

// Provided by VK_KHR_global_priority
typedef VkQueueGlobalPriority VkQueueGlobalPriorityKHR;

或等效结构

// Provided by VK_EXT_global_priority
typedef VkQueueGlobalPriority VkQueueGlobalPriorityEXT;

优先级值按升序排列。可以对枚举值进行比较操作来确定优先级顺序。

  • VK_QUEUE_GLOBAL_PRIORITY_LOW 低于系统默认值,适用于非交互式任务。

  • VK_QUEUE_GLOBAL_PRIORITY_MEDIUM 是系统默认优先级。

  • VK_QUEUE_GLOBAL_PRIORITY_HIGH 高于系统默认值。

  • VK_QUEUE_GLOBAL_PRIORITY_REALTIME 是最高优先级,适用于关键任务。

系统优先级较高的队列可能会比优先级较低的队列分配到更多的处理时间。实现可能允许较高优先级的队列使较低优先级的队列处于饥饿状态,直到较高优先级的队列没有进一步的命令要执行为止。

优先级不意味着排序或调度约束。

不保证较高优先级的队列比较低优先级的队列获得更多的处理时间或更好的服务质量。

队列的全局优先级级别优先于每个进程的队列优先级 (VkDeviceQueueCreateInfo::pQueuePriorities)。

滥用此功能可能会导致系统其余部分因实现资源而处于饥饿状态。因此,如果调用者没有足够的权限,驱动程序实现可能会拒绝获取高于默认优先级 (VK_QUEUE_GLOBAL_PRIORITY_MEDIUM) 的优先级请求。在这种情况下,会返回 VK_ERROR_NOT_PERMITTED

如果完成操作所需的资源已耗尽(无论是被同一进程还是不同进程耗尽),驱动程序实现可能会使队列分配请求失败。在这种情况下,会返回 VK_ERROR_INITIALIZATION_FAILED

如果启用了 globalPriorityQuery 功能,并且请求的全局优先级未通过 VkQueueFamilyGlobalPriorityProperties 报告,则驱动程序实现必须使队列创建失败。在这种情况下,会返回 VK_ERROR_INITIALIZATION_FAILED

可以通过将 VkDeviceQueueShaderCoreControlCreateInfoARM 结构体添加到 VkDeviceQueueCreateInfo 结构体的 pNext 链中来控制队列使用的着色器核心数量。

VkDeviceQueueShaderCoreControlCreateInfoARM 结构体定义如下:

// Provided by VK_ARM_scheduling_controls
typedef struct VkDeviceQueueShaderCoreControlCreateInfoARM {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           shaderCoreCount;
} VkDeviceQueueShaderCoreControlCreateInfoARM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • shaderCoreCount 是此队列使用的着色器核心数量。

创建队列时,如果没有指定 VkDeviceQueueShaderCoreControlCreateInfoARM,则默认使用所有可用的着色器核心。

有效使用
有效用法(隐式)
  • VUID-VkDeviceQueueShaderCoreControlCreateInfoARM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM

要检索 VkQueue 对象的句柄,请调用:

// Provided by VK_VERSION_1_0
void vkGetDeviceQueue(
    VkDevice                                    device,
    uint32_t                                    queueFamilyIndex,
    uint32_t                                    queueIndex,
    VkQueue*                                    pQueue);
  • device 是拥有队列的逻辑设备。

  • queueFamilyIndex 是队列所属的队列族索引。

  • queueIndex 是要检索的队列在此队列族中的索引。

  • pQueue 是一个指向 VkQueue 对象的指针,该对象将填充请求的队列的句柄。

vkGetDeviceQueue 必须仅用于获取使用 VkDeviceQueueCreateInfoflags 参数设置为零创建的队列。要获取使用非零 flags 参数创建的队列,请使用 vkGetDeviceQueue2

有效使用
  • VUID-vkGetDeviceQueue-queueFamilyIndex-00384
    当创建 device 时,通过 VkDeviceQueueCreateInfo 结构体,queueFamilyIndex 必须是指定的队列族索引之一。

  • VUID-vkGetDeviceQueue-queueIndex-00385
    当创建 device 时,queueIndex 必须小于 queueFamilyIndex 指示的队列族的 VkDeviceQueueCreateInfo::queueCount 值。

  • VUID-vkGetDeviceQueue-flags-01841
    当创建 device 时,VkDeviceQueueCreateInfo::flags 必须为零。

有效用法(隐式)
  • VUID-vkGetDeviceQueue-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkGetDeviceQueue-pQueue-parameter
    pQueue 必须是指向 VkQueue 句柄的有效指针。

要检索具有特定 VkDeviceQueueCreateFlags 创建标志的 VkQueue 对象的句柄,请调用:

// Provided by VK_VERSION_1_1
void vkGetDeviceQueue2(
    VkDevice                                    device,
    const VkDeviceQueueInfo2*                   pQueueInfo,
    VkQueue*                                    pQueue);
  • device 是拥有队列的逻辑设备。

  • pQueueInfo 是一个指向 VkDeviceQueueInfo2 结构体的指针,该结构体描述了要检索的设备队列的参数。

  • pQueue 是一个指向 VkQueue 对象的指针,该对象将填充请求的队列的句柄。

有效用法(隐式)
  • VUID-vkGetDeviceQueue2-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkGetDeviceQueue2-pQueueInfo-parameter
    pQueueInfo 必须 是指向有效 VkDeviceQueueInfo2 结构的有效指针。

  • VUID-vkGetDeviceQueue2-pQueue-parameter
    pQueue 必须是指向 VkQueue 句柄的有效指针。

VkDeviceQueueInfo2 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkDeviceQueueInfo2 {
    VkStructureType             sType;
    const void*                 pNext;
    VkDeviceQueueCreateFlags    flags;
    uint32_t                    queueFamilyIndex;
    uint32_t                    queueIndex;
} VkDeviceQueueInfo2;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。VkDeviceQueueInfo2pNext可以用于为 vkGetDeviceQueue2 提供额外的设备队列参数。

  • flags 是一个 VkDeviceQueueCreateFlags 值,指示用于创建设备队列的标志。

  • queueFamilyIndex 是队列所属的队列族索引。

  • queueIndex 是要从共享指定的队列族和标志的队列集中检索的队列的索引。

vkGetDeviceQueue2 返回的队列必须具有与设备创建时在 VkDeviceQueueCreateInfo 结构中使用的此结构相同的 flags 值。

通常,如果您使用相同的族创建了受保护和不受保护的队列,它们将被视为单独的队列列表,并且 queueIndex 相对于由 queueFamilyIndexflags 指定的队列列表的开头。但是,由于历史原因,某些实现可能会表现出不同的行为。这些不同的实现会连接队列列表,并将 queueIndex 视为相对于具有给定 queueFamilyIndex 的第一个队列列表的开头。这仅在应用程序从同一队列族创建了受保护和不受保护的队列时才重要。

对于此类不同的实现,queueIndex 的最大值等于 VkDeviceQueueCreateInfo::queueCount 的总和减 1,对于共享公共 queueFamilyIndex 的所有 VkDeviceQueueCreateInfo 结构。

当调用 vkGetDeviceQueue2 时,如果 queueIndex 在 0 到 VkDeviceQueueCreateInfo::queueCount 减 1 的范围内,此类实现将为受保护或不受保护的队列返回 NULL。如果这些实现返回 NULL,则相应的队列将位于前两段中描述的扩展范围内。

在任何通过 Vulkan 一致性测试套件 1.3.3.0 版本或任何后续版本的驱动程序上都不会观察到此行为。可以通过查询 VkPhysicalDeviceDriverProperties::conformanceVersion 来找到此信息。

有效使用
  • VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842
    当创建 device 时,通过 VkDeviceQueueCreateInfo 结构体,queueFamilyIndex 必须是指定的队列族索引之一。

  • VUID-VkDeviceQueueInfo2-flags-06225
    对于创建 device 时由 queueFamilyIndex 指示的队列族的 VkDeviceQueueCreateInfo 结构,flags 必须等于 VkDeviceQueueCreateInfo::flags

  • VUID-VkDeviceQueueInfo2-queueIndex-01843
    对于创建 device 时由 queueFamilyIndexflags 指示的相应队列族和标志,queueIndex 必须小于 VkDeviceQueueCreateInfo::queueCount

有效用法(隐式)
  • VUID-VkDeviceQueueInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2

  • VUID-VkDeviceQueueInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkDeviceQueueInfo2-flags-parameter
    flags 必须VkDeviceQueueCreateFlagBits 值的有效组合。

队列族索引

队列族索引在 Vulkan 中的多个位置使用,以便将操作与特定的队列族关联起来。

当通过 vkGetDeviceQueue 检索队列句柄时,队列族索引用于选择从哪个队列族检索 VkQueue 句柄,如上一节所述。

当创建 VkCommandPool 对象时(请参阅 命令池),在 VkCommandPoolCreateInfo 结构中指定一个队列族索引。来自此池的命令缓冲区只能在与此队列族对应的队列上提交。

当创建 VkImage(请参阅 图像)和 VkBuffer(请参阅 缓冲区)资源时,一组队列族包含在 VkImageCreateInfoVkBufferCreateInfo 结构中,以指定可以访问资源的队列族。

当插入 VkBufferMemoryBarrierVkImageMemoryBarrier(请参阅 管线屏障)时,将指定源和目标队列族索引,以允许将缓冲区或图像的所有权从一个队列族转移到另一个队列族。有关详细信息,请参阅 资源共享 部分。

队列优先级

每个队列都分配了一个优先级,该优先级在创建设备时在 VkDeviceQueueCreateInfo 结构中设置。每个队列的优先级是一个介于 0.0 和 1.0 之间的归一化浮点值,然后由实现转换为离散优先级级别。较高的值表示较高的优先级,其中 0.0 是最低优先级,1.0 是最高优先级。

在同一设备中,具有较高优先级的队列可能比具有较低优先级的队列分配更多的处理时间。该实现不保证相同优先级的队列之间的排序或调度,除了任何 显式同步原语定义的约束之外。该实现不保证不同设备之间的队列。

在同一个 VkDevice 上,实现可能允许高优先级队列使低优先级队列处于饥饿状态,直到高优先级队列没有进一步的命令要执行。队列优先级的关系必须不会导致一个 VkDevice 上的队列使另一个 VkDevice 上的队列处于饥饿状态。

不保证较高优先级的队列比较低优先级的队列获得更多的处理时间或更好的服务质量。

队列提交

通过队列提交命令(如 vkQueueSubmit2vkQueueSubmit)将工作提交到队列。队列提交命令定义了底层物理设备要执行的一组队列操作,包括与信号量和栅栏的同步。

提交命令将目标队列、零个或多个工作批次以及一个可选的在完成时发出信号的栅栏作为参数。每个批次由三个不同的部分组成:

  1. 在执行批次其余部分之前要等待的零个或多个信号量。

  2. 要执行的零个或多个工作项。

    • 如果存在,这些描述了与所述工作匹配的队列操作

  3. 在完成工作项时要发出信号的零个或多个信号量。

如果队列提交中存在栅栏,则它描述了一个 栅栏信号操作

队列提交命令描述的所有工作必须在命令返回之前提交到队列。

稀疏内存绑定

在 Vulkan 中,可以将内存稀疏地绑定到缓冲区和图像,如稀疏资源章节所述。稀疏内存绑定是一种队列操作。标志包含 VK_QUEUE_SPARSE_BINDING_BIT 的队列必须能够支持将虚拟地址映射到设备上的物理地址。这会导致设备上的页表映射更新。此更新必须在队列上同步,以避免在执行图形命令期间损坏页表映射。通过在队列上绑定稀疏内存资源,所有依赖于更新绑定的命令都将同步,以便仅在绑定更新后执行。有关如何实现此同步的信息,请参阅同步和缓存控制章节。

队列销毁

队列在 vkCreateDevice 期间与逻辑设备一起创建。当对该设备调用 vkDestroyDevice 时,与逻辑设备关联的所有队列都会被销毁。