设备和队列
一旦 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
句柄数组的指针。
如果 pPhysicalDevices
为 NULL
,则可用物理设备的数量将返回到 pPhysicalDeviceCount
中。否则,pPhysicalDeviceCount
**必须**指向应用程序设置为 pPhysicalDevices
数组中元素数量的变量,并且在返回时,该变量将被实际写入 pPhysicalDevices
的句柄数量覆盖。如果 pPhysicalDeviceCount
小于可用物理设备的数量,则最多将写入 pPhysicalDeviceCount
个结构体,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有可用的物理设备都被返回。
要查询枚举后的物理设备的常规属性,请调用
// Provided by VK_VERSION_1_0
void vkGetPhysicalDeviceProperties(
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceProperties* pProperties);
-
physicalDevice
是要查询其属性的物理设备的句柄。 -
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_SIZE
个uint8_t
值的数组。 -
limits
是指定物理设备的设备特定限制的 VkPhysicalDeviceLimits 结构。有关详细信息,请参见 限制。 -
sparseProperties
是指定物理设备的各种稀疏相关属性的 VkPhysicalDeviceSparseProperties 结构。有关详细信息,请参见 稀疏属性。
|
|
在声明支持 Roadmap 2022 配置文件的实现中,apiVersion
表示的主版本和次版本必须至少为 Vulkan 1.3。
提供 vendorID
和 deviceID
字段是为了允许应用程序适应其他 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 设备 ID 的 PCI 设备驱动,则 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。只有本规范、相应的 目前仅给出 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
填充每个成员以指定实现的对应值。
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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
properties
是一个 VkPhysicalDeviceProperties 结构,用于描述物理设备的属性。此结构写入的值与 vkGetPhysicalDeviceProperties 写入的值相同。
此结构的 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
deviceUUID
是一个包含VK_UUID_SIZE
个uint8_t
值的数组,表示设备的通用唯一标识符。 -
driverUUID
是一个包含VK_UUID_SIZE
个uint8_t
值的数组,表示设备正在使用的驱动程序构建版本的通用唯一标识符。 -
deviceLUID
是一个包含VK_LUID_SIZE
个uint8_t
值的数组,表示设备的本地唯一标识符。 -
deviceNodeMask
是一个uint32_t
位域,标识链接设备适配器中与该设备对应的节点。 -
deviceLUIDValid
是一个布尔值,如果deviceLUID
包含有效的 LUID 并且deviceNodeMask
包含有效的节点掩码,则为VK_TRUE
;否则为VK_FALSE
。
-
subgroupSize
是每个子组中调用的默认数量。如果物理设备的任何队列支持VK_QUEUE_GRAPHICS_BIT
或VK_QUEUE_COMPUTE_BIT
,则subgroupSize
至少为 1。subgroupSize
是 2 的幂。 -
subgroupSupportedStages
是一个 VkShaderStageFlagBits 的位域,描述了 组操作 中支持 子组作用域 的着色器阶段。如果物理设备的任何队列支持VK_QUEUE_COMPUTE_BIT
,则subgroupSupportedStages
将设置VK_SHADER_STAGE_COMPUTE_BIT
位。 -
subgroupSupportedOperations
是一个 VkSubgroupFeatureFlagBits 的位掩码,指定此设备上支持的具有 子组作用域 的 组操作 集合。如果物理设备的任何队列支持VK_QUEUE_GRAPHICS_BIT
或VK_QUEUE_COMPUTE_BIT
,则subgroupSupportedOperations
将设置VK_SUBGROUP_FEATURE_BASIC_BIT
位。 -
subgroupQuadOperationsInAllStages
是一个布尔值,指定 四元组组操作 是否在所有阶段都可用,或者是否仅限于片段和计算阶段。 -
pointClippingBehavior
是一个 VkPointClippingBehavior 值,指定实现支持的点裁剪行为。 -
maxMultiviewInstanceIndex
是允许由多视图渲染通道实例的子通道中记录的绘制命令生成的实例索引的最大有效值。 -
protectedNoFault
指定当应用程序尝试在受保护的队列操作中写入非受保护的内存、在非受保护的队列操作中从受保护的内存读取或在受保护的队列操作中执行查询时,实现的行为。如果此限制为VK_TRUE
,则此类写入将被丢弃或写入未定义的值,读取和查询将返回未定义的值。如果此限制为VK_FALSE
,则应用程序必须不执行这些操作。有关更多信息,请参阅受保护的内存访问规则。 -
maxPerSetDescriptors
是单个描述符集中(所有描述符类型之和)描述符的最大数量,保证满足对描述符集本身大小的任何实现相关的约束。应用程序可以使用 vkGetDescriptorSetLayoutSupport 查询是否支持超出此限制的描述符集。 -
maxMemoryAllocationSize
是可以创建的最大内存分配大小,即使堆中有更多可用空间。如果 VkMemoryAllocateInfo::allocationSize
大于此值,则可能返回错误VK_ERROR_OUT_OF_DEVICE_MEMORY
。
如果 VkPhysicalDeviceVulkan11Properties
结构包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则它将填充每个相应的实现相关的属性。
这些属性对应于 Vulkan 1.1 功能。
VkPhysicalDeviceVulkan11Properties
的成员与 VkPhysicalDeviceIDProperties、VkPhysicalDeviceSubgroupProperties、VkPhysicalDevicePointClippingProperties、VkPhysicalDeviceMultiviewProperties、VkPhysicalDeviceProtectedMemoryProperties 和 VkPhysicalDeviceMaintenance3Properties 的相应成员具有相同的值。
此结构的 |
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
driverID
是物理设备驱动程序的唯一标识符。 -
driverName
是一个包含VK_MAX_DRIVER_NAME_SIZE
个char
的数组,其中包含以 null 结尾的 UTF-8 字符串,该字符串是驱动程序的名称。 -
driverInfo
是一个包含VK_MAX_DRIVER_INFO_SIZE
个char
的数组,其中包含以 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
是否可以在设备上与descriptorBindingUniformBufferUpdateAfterBind
、descriptorBindingStorageBufferUpdateAfterBind
、descriptorBindingUniformTexelBufferUpdateAfterBind
和/或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
位设置创建的描述符集中获取的描述符。 -
maxDescriptorSetUpdateAfterBindStorageBuffersDynamic
与maxDescriptorSetStorageBuffersDynamic
类似,但它会计算使用或不使用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
创建的绑定的描述符集布局中。 -
maxDescriptorSetUpdateAfterBindSampledImages
与maxDescriptorSetSampledImages
类似,但它会计算使用或不使用VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT
位设置创建的描述符集中的描述符。 -
maxDescriptorSetUpdateAfterBindStorageImages
与maxDescriptorSetStorageImages
类似,但它会计算使用或不使用VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT
位设置创建的描述符集中的描述符。 -
maxDescriptorSetUpdateAfterBindInputAttachments
与maxDescriptorSetInputAttachments
类似,但它会计算使用或不使用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
时,实现支持将深度和模板解析模式设置为不同的值,则independentResolveNone
为VK_TRUE
。否则,实现仅支持将两种模式设置为相同的值。 -
如果实现支持所有支持的深度和模板解析模式的组合,包括将深度或模板解析模式设置为
VK_RESOLVE_MODE_NONE
,则independentResolve
为VK_TRUE
。支持independentResolve
的实现必须也支持independentResolveNone
。 -
filterMinmaxSingleComponentFormats
是一个布尔值,指示是否有一组最小的所需格式支持最小/最大滤波。 -
filterMinmaxImageComponentMapping
是一个布尔值,指示在执行最小/最大滤波时,实现是否支持图像的非恒等组件映射。 -
maxTimelineSemaphoreValueDifference
指示实现允许的时间线信号量当前值与任何挂起的信号或等待操作之间的最大差异。 -
framebufferIntegerColorSampleCounts
是一个 VkSampleCountFlagBits 的位掩码,指示所有使用整数格式的帧缓冲区颜色附件支持的颜色采样计数。
如果 VkPhysicalDeviceVulkan12Properties 结构包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则会填充每个对应的实现相关的属性。
这些属性对应于 Vulkan 1.2 功能。
VkPhysicalDeviceVulkan12Properties
的成员必须与 VkPhysicalDeviceDriverProperties、VkPhysicalDeviceFloatControlsProperties、VkPhysicalDeviceDescriptorIndexingProperties、VkPhysicalDeviceDepthStencilResolveProperties、VkPhysicalDeviceSamplerFilterMinmaxProperties 和 VkPhysicalDeviceTimelineSemaphoreProperties 的对应成员具有相同的值。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
minSubgroupSize
是此设备支持的最小子组大小。如果任何物理设备的队列支持VK_QUEUE_GRAPHICS_BIT
或VK_QUEUE_COMPUTE_BIT
,则minSubgroupSize
至少为 1。minSubgroupSize
是 2 的幂。minSubgroupSize
小于或等于maxSubgroupSize
。minSubgroupSize
小于或等于subgroupSize
。 -
maxSubgroupSize
是此设备支持的最大子组大小。如果任何物理设备的队列支持VK_QUEUE_GRAPHICS_BIT
或VK_QUEUE_COMPUTE_BIT
,则maxSubgroupSize
至少为 1。maxSubgroupSize
是 2 的幂。maxSubgroupSize
大于或等于minSubgroupSize
。maxSubgroupSize
大于或等于subgroupSize
。 -
maxInlineUniformBlockSize
是一个 内联统一块绑定的最大字节大小。 -
maxPerStageDescriptorInlineUniformBlocks
是管道布局中单个着色器阶段可以访问的最大内联统一块绑定数量。描述符类型为VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK
的描述符绑定计入此限制。只有在不使用VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT
位设置创建的描述符集布局中的描述符绑定才计入此限制。 -
maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
与maxPerStageDescriptorInlineUniformBlocks
类似,但它会计算使用或不使用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
位的情况下,描述符绑定才会计入此限制。 -
maxDescriptorSetUpdateAfterBindInlineUniformBlocks
与maxDescriptorSetInlineUniformBlocks
类似,但它会统计通过设置或不设置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
指示对于任何格式的统一纹理缓冲区,单纹素对齐是否足够。
如果 VkPhysicalDeviceVulkan13Properties
结构包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则它将填充每个对应的、依赖于实现的属性。
这些属性对应于 Vulkan 1.3 的功能。
VkPhysicalDeviceVulkan13Properties
的成员必须与 VkPhysicalDeviceInlineUniformBlockProperties 和 VkPhysicalDeviceSubgroupSizeControlProperties 的相应成员具有相同的值。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
lineSubPixelPrecisionBits
是光栅化线段时,帧缓冲坐标 xf 和 yf 中的亚像素精度位数。 -
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
的图像视图,其中subresourceRange
的layerCount
成员大于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
结构包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则它将填充每个对应的、依赖于实现的属性。
这些属性对应于 Vulkan 1.4 的功能。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
deviceUUID
是一个包含VK_UUID_SIZE
个uint8_t
值的数组,表示设备的通用唯一标识符。 -
driverUUID
是一个包含VK_UUID_SIZE
个uint8_t
值的数组,表示设备正在使用的驱动程序构建版本的通用唯一标识符。 -
deviceLUID
是一个包含VK_LUID_SIZE
个uint8_t
值的数组,表示设备的本地唯一标识符。 -
deviceNodeMask
是一个uint32_t
位域,标识链接设备适配器中与该设备对应的节点。 -
deviceLUIDValid
是一个布尔值,如果deviceLUID
包含有效的 LUID 并且deviceNodeMask
包含有效的节点掩码,则为VK_TRUE
;否则为VK_FALSE
。
如果 VkPhysicalDeviceIDProperties
结构包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则会填充每个对应的、与实现相关的属性。
对于给定的设备,deviceUUID
必须在实例、进程、驱动程序 API、驱动程序版本和系统重启之间保持不变。
应用程序 可以跨实例和进程边界比较 driverUUID
的值,并且 可以在外部 API 中进行类似的查询,以确定它们是否能够使用该设备共享内存对象和资源。
deviceUUID
和/或 driverUUID
必须用于确定特定的外部对象是否可以在驱动程序组件之间共享,其中存在针对特定对象类型的兼容性表中所定义的此类限制。
如果 deviceLUIDValid
为 VK_FALSE
,则 deviceLUID
和 deviceNodeMask
的值是 未定义的。如果 deviceLUIDValid
为 VK_TRUE
且 Vulkan 正在 Windows 操作系统上运行,则 deviceLUID
的内容 可以被转换为 LUID
对象,并且 必须等于与 physicalDevice
对应的 IDXGIAdapter1
对象的本地唯一标识符。如果 deviceLUIDValid
为 VK_TRUE
,则 deviceNodeMask
必须仅包含一位。如果 Vulkan 正在支持 Direct3D 12 API 的操作系统上运行,并且 physicalDevice
对应于链接设备适配器中的单个设备,则 deviceNodeMask
标识与 physicalDevice
对应的 Direct3D 12 节点。否则,deviceNodeMask
必须为 1
。
尽管它们的描述相同,但 VkPhysicalDeviceIDProperties:: 即使存在多个 Vulkan 实现(例如 GPU 驱动程序和软件渲染器;两个用于不同 GPU 的驱动程序;或在两个逻辑上不同的设备上运行的同一 Vulkan 驱动程序),实现 应该返回可能唯一的 Khronos 的一致性测试无法保证 可以使用对供应商、驱动程序和硬件环境唯一的值的组合来提供高度确定的唯一
|
虽然指定了 VkPhysicalDeviceIDProperties:: |
VK_UUID_SIZE
是一个数组的 uint8_t
值的长度,该数组包含一个全局唯一的设备或驱动程序构建标识符,如 VkPhysicalDeviceIDProperties::deviceUUID
和 VkPhysicalDeviceIDProperties::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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
driverID
是物理设备驱动程序的唯一标识符。 -
driverName
是一个包含VK_MAX_DRIVER_NAME_SIZE
个char
的数组,其中包含以 null 结尾的 UTF-8 字符串,该字符串是驱动程序的名称。 -
driverInfo
是一个包含VK_MAX_DRIVER_INFO_SIZE
个char
的数组,其中包含以 null 结尾的 UTF-8 字符串,其中包含有关驱动程序的其他信息。 -
conformanceVersion
是实施者在发布之前成功测试此驱动程序所依据的最新版本 Vulkan 一致性测试(请参阅 VkConformanceVersion)。
如果 VkPhysicalDeviceDriverProperties
结构包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则会填充每个对应的、与实现相关的属性。
这些是对应于物理设备的驱动程序的属性。
对于给定的驱动程序,driverID
必须在实例、进程、驱动程序版本和系统重启之间保持不变。
在 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,代表不同的驱动程序(例如,不同的平台、专有或开源等)。只有本规范的最新规范版本、对应的 只有在 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
pciDomain
是 PCI 总线域。 -
pciBus
是 PCI 总线标识符。 -
pciDevice
是 PCI 设备标识符。 -
pciFunction
是 PCI 设备功能标识符。
如果 VkPhysicalDevicePCIBusInfoPropertiesEXT
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构体的 pNext
链中,则会填充每个相应的实现相关的属性。
这些是物理设备的 PCI 总线信息的属性。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
hasPrimary
是一个布尔值,指示物理设备是否具有 DRM 主节点。 -
hasRender
是一个布尔值,指示物理设备是否具有 DRM 渲染节点。 -
primaryMajor
是 DRM 主节点的主设备号(如果有)。 -
primaryMinor
是 DRM 主节点的次设备号(如果有)。 -
renderMajor
是 DRM 渲染节点的主设备号(如果有)。 -
renderMinor
是 DRM 渲染节点的次设备号(如果有)。
如果 VkPhysicalDeviceDrmPropertiesEXT
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构体的 pNext
链中,则会填充每个相应的实现相关的属性。
这些是物理设备的 DRM 信息的属性。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。
-
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
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构体的 pNext
链中,则会填充每个相应的实现相关的属性。
这些是物理设备的整数点积加速信息的属性。
如果点积运算的实现提供了比由基本指令和/或其他点积指令组成的应用程序代码更高的性能优势,则认为该点积运算是加速的,原因可能是该实现使用了优化的机器代码序列,无法保证从应用程序代码生成该序列,或者因为它使用了应用程序代码无法以其他方式定位的硬件功能。 |
VkPhysicalDeviceImageProcessingPropertiesQCOM
结构体定义如下:
// Provided by VK_QCOM_image_processing
typedef struct VkPhysicalDeviceImageProcessingPropertiesQCOM {
VkStructureType sType;
void* pNext;
uint32_t maxWeightFilterPhases;
VkExtent2D maxWeightFilterDimension;
VkExtent2D maxBlockMatchRegion;
VkExtent2D maxBoxFilterBlockSize;
} VkPhysicalDeviceImageProcessingPropertiesQCOM;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
maxWeightFilterPhases
是 VkImageViewSampleWeightCreateInfoQCOM::numPhases
在权重图像采样操作中可以指定的最大值。 -
maxWeightFilterDimension
是一个 VkExtent2D,描述了 VkImageViewSampleWeightCreateInfoQCOM::filterSize
可以指定的最大维度(width
和height
)。 -
maxBlockMatchRegion
是一个 VkExtent2D,描述了在 块匹配操作中blockSize
可以指定的最大维度(width
和height
)。 -
maxBoxFilterBlockSize
是一个 VkExtent2D,描述了在 盒式滤波采样操作中blocksize
可以指定的最大维度(width
和height
)。
如果 VkPhysicalDeviceImageProcessingPropertiesQCOM
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构体的 pNext
链中,则会填充每个相应的实现相关的属性。
这些是物理设备的图像处理信息的属性。
VkPhysicalDeviceShaderTileImagePropertiesEXT
结构体定义如下:
// Provided by VK_EXT_shader_tile_image
typedef struct VkPhysicalDeviceShaderTileImagePropertiesEXT {
VkStructureType sType;
void* pNext;
VkBool32 shaderTileImageCoherentReadAccelerated;
VkBool32 shaderTileImageReadSampleFromPixelRateInvocation;
VkBool32 shaderTileImageReadFromHelperInvocation;
} VkPhysicalDeviceShaderTileImagePropertiesEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
shaderTileImageCoherentReadAccelerated
是一个布尔值,如果加速读取图块图像数据,则为VK_TRUE
。 -
shaderTileImageReadSampleFromPixelRateInvocation
是一个布尔值,如果当 VkPipelineMultisampleStateCreateInfo::rasterizationSamples
> 1 时,支持从像素速率片段调用中读取样本,则为VK_TRUE
。 -
shaderTileImageReadFromHelperInvocation
是一个布尔值,如果从辅助片段调用中读取图块图像数据会产生有效值,则为VK_TRUE
。
如果 VkPhysicalDeviceShaderTileImagePropertiesEXT
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构体的 pNext
链中,则会填充每个相应的实现相关的属性。
这些是物理设备的图块图像信息的属性。
VkPhysicalDeviceImageProcessing2PropertiesQCOM
结构体定义如下:
// Provided by VK_QCOM_image_processing2
typedef struct VkPhysicalDeviceImageProcessing2PropertiesQCOM {
VkStructureType sType;
void* pNext;
VkExtent2D maxBlockMatchWindow;
} VkPhysicalDeviceImageProcessing2PropertiesQCOM;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
maxBlockMatchWindow
是一个 VkExtent2D,描述了块匹配窗口可以指定的最大维度(width
和height
)。
如果 VkPhysicalDeviceImageProcessing2PropertiesQCOM
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构体的 pNext
链中,则会填充每个相应的实现相关的属性。
这些是物理设备的图像处理2信息的属性。
VkPhysicalDeviceLayeredDriverPropertiesMSFT
结构体定义如下:
// Provided by VK_MSFT_layered_driver
typedef struct VkPhysicalDeviceLayeredDriverPropertiesMSFT {
VkStructureType sType;
void* pNext;
VkLayeredDriverUnderlyingApiMSFT underlyingAPI;
} VkPhysicalDeviceLayeredDriverPropertiesMSFT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
underlyingAPI
是一个 VkLayeredDriverUnderlyingApiMSFT 值,指示用于实现分层驱动程序的底层 API,如果驱动程序不是分层的,则为VK_LAYERED_DRIVER_UNDERLYING_API_NONE_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;
如果 VkPhysicalDeviceSchedulingControlsPropertiesARM
结构体包含在传递给 vkGetPhysicalDeviceProperties2 的 VkPhysicalDeviceProperties2 结构的 pNext
链中,则会填充每个相应的实现相关的属性。
可以在 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;
-
VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM
指定 VkDeviceQueueShaderCoreControlCreateInfoARM 结构体可以包含在 VkDeviceQueueCreateInfo 或 VkDeviceCreateInfo 结构体的pNext
链中。
// 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 结构体数组的指针。
如果 pQueueFamilyProperties
为 NULL
,则可用队列族的数量将在 pQueueFamilyPropertyCount
中返回。实现必须至少支持一个队列族。否则,pQueueFamilyPropertyCount
必须指向应用程序设置为 pQueueFamilyProperties
数组中元素数量的变量,并且在返回时,该变量将被实际写入 pQueueFamilyProperties
的结构体数量覆盖。如果 pQueueFamilyPropertyCount
小于可用队列族的数量,则最多写入 pQueueFamilyPropertyCount
个结构体。
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
是通过 vkCmdWriteTimestamp2 或 vkCmdWriteTimestamp 写入的时间戳中有意义的位数。有效范围为 36 到 64 位,或者值为 0,表示不支持时间戳。有效范围之外的位保证为零。 -
minImageTransferGranularity
是此队列族中队列支持的图像传输操作的最小粒度。
minImageTransferGranularity
中返回的值,对于具有块压缩格式的图像,单位为压缩纹素块,否则单位为纹素。
minImageTransferGranularity
的可能值为:
-
(0,0,0) 指定只能使用相应队列上的图像传输操作传输整个 mip 级别。在这种情况下,以下限制适用于图像传输操作的所有偏移和范围参数:
-
VkOffset3D 参数的
x
、y
和z
成员必须始终为零。 -
VkExtent3D 参数的
width
、height
和depth
成员必须始终分别与该参数对应的图像子资源的宽度、高度和深度相匹配。
-
-
(Ax, Ay, Az),其中 Ax、Ay 和 Az 均为 2 的整数次幂。在这种情况下,以下限制适用于所有图像传输操作:
-
VkOffset3D 参数的
x
、y
和z
必须分别是 Ax、Ay 和 Az 的整数倍。 -
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
物理设备特性,则该实现公开的至少一个物理设备的至少一个队列族必须支持图形操作、计算操作和受保护的内存操作。
所有允许在支持传输操作的队列上执行的命令也允许在支持图形或计算操作的队列上执行。因此,如果队列族的功能包括 |
有关更多详细信息,请参阅队列。
// 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
链中返回扩展信息。
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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
queueFamilyProperties
是一个VkQueueFamilyProperties结构,其填充的值与vkGetPhysicalDeviceQueueFamilyProperties中的值相同。
// 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
priorityCount
是此队列族中支持的全局队列优先级数,它必须大于0。 -
priorities
是VK_MAX_GLOBAL_PRIORITY_SIZE
个VkQueueGlobalPriority枚举的数组,表示此队列族中所有支持的全局队列优先级。数组的前priorityCount
个元素将有效。
如果将VkQueueFamilyGlobalPriorityProperties
结构包含在传递给vkGetPhysicalDeviceQueueFamilyProperties2的VkQueueFamilyProperties2结构的pNext
链中,则将使用指示族的受支持的全局队列优先级列表进行填充。
priorities
的有效元素必须不包含任何重复值。
priorities
的有效元素必须是按升序排列的VkQueueGlobalPriority枚举的连续序列。
例如,返回 |
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
// 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
checkpointExecutionStageMask
是一个掩码,指示实现可以在其中执行检查点标记的管道阶段。
可以通过设置VkQueueFamilyProperties2::pNext
指向VkQueueFamilyCheckpointProperties2NV
结构来查询其他队列族信息。
// Provided by VK_NV_device_diagnostic_checkpoints
typedef struct VkQueueFamilyCheckpointPropertiesNV {
VkStructureType sType;
void* pNext;
VkPipelineStageFlags checkpointExecutionStageMask;
} VkQueueFamilyCheckpointPropertiesNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
checkpointExecutionStageMask
是一个掩码,指示实现可以在其中执行检查点标记的管道阶段。
可以通过设置 VkQueueFamilyProperties2::pNext
指向一个 VkQueueFamilyCheckpointPropertiesNV
结构来查询额外的队列族信息。
VkQueueFamilyVideoPropertiesKHR 结构定义如下:
// Provided by VK_KHR_video_queue
typedef struct VkQueueFamilyVideoPropertiesKHR {
VkStructureType sType;
void* pNext;
VkVideoCodecOperationFlagsKHR videoCodecOperations;
} VkQueueFamilyVideoPropertiesKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
videoCodecOperations
是一个 VkVideoCodecOperationFlagBitsKHR 的位掩码,指示队列族支持的视频编解码操作集合。
如果此结构包含在传递给 vkGetPhysicalDeviceQueueFamilyProperties2 的 VkQueueFamilyProperties2 结构的 pNext
链中,则会填充指定队列族支持的视频编解码操作集合。
// Provided by VK_KHR_video_queue
typedef struct VkQueueFamilyQueryResultStatusPropertiesKHR {
VkStructureType sType;
void* pNext;
VkBool32 queryResultStatusSupport;
} VkQueueFamilyQueryResultStatusPropertiesKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
如果支持查询类型
VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR
和使用VK_QUERY_RESULT_WITH_STATUS_BIT_KHR
,则queryResultStatusSupport
报告VK_TRUE
。
如果此结构包含在传递给 vkGetPhysicalDeviceQueueFamilyProperties2 的 VkQueueFamilyProperties2 结构的 pNext
链中,则会填充有关指定队列族是否支持结果状态查询的信息。
要枚举物理设备的队列族上可用的性能查询计数器,请调用:
// 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 结构数组的指针。
如果 pCounters
为 NULL
并且 pCounterDescriptions
为 NULL
,则可用计数器的数量将在 pCounterCount
中返回。否则,pCounterCount
必须 指向应用程序设置的变量,该变量表示 pCounters
、pCounterDescriptions
或两个数组中的元素数量,并且在返回时,该变量将被实际写入的结构数量覆盖。如果 pCounterCount
小于可用计数器的数量,则最多将写入 pCounterCount
个结构,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有可用的计数器都已返回。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
unit
是一个 VkPerformanceCounterUnitKHR,指定计数器数据将记录的单位。 -
scope
是一个 VkPerformanceCounterScopeKHR,指定计数器所属的范围。 -
storage
是一个 VkPerformanceCounterStorageKHR,指定计数器数据使用的存储类型。 -
uuid
是一个大小为VK_UUID_SIZE
的数组,包含 8 位值,表示物理设备计数器的通用唯一标识符。
性能计数器具有关联的单位。此单位描述如何解释性能计数器结果。
可在 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
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 字符串,指定计数器的描述。
在 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 传递物理设备,可以从设备组中的物理设备子集创建逻辑设备。为了使两个物理设备在同一个设备组中,它们必须支持相同的扩展、特性和属性。
同一设备组中的物理设备必须如此相似,因为没有关于不同特性/属性如何交互的规则。它们必须为几乎所有不变的 |
要检索系统中存在的设备组列表,请调用
// 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
是一个指向整数的指针,该整数与可用或查询的设备组数量相关,如下所述。 -
pPhysicalDeviceGroupProperties
是NULL
或指向 VkPhysicalDeviceGroupProperties 结构数组的指针。
如果 pPhysicalDeviceGroupProperties
是 NULL
,则可用设备组的数量将在 pPhysicalDeviceGroupCount
中返回。否则,pPhysicalDeviceGroupCount
必须指向一个由应用程序设置为 pPhysicalDeviceGroupProperties
数组中元素数量的变量,并且在返回时,该变量会被实际写入 pPhysicalDeviceGroupProperties
的结构数量覆盖。如果 pPhysicalDeviceGroupCount
小于可用设备组的数量,则最多会写入 pPhysicalDeviceGroupCount
个结构,并且会返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有可用的设备组都被返回。
每个物理设备必须恰好在一个设备组中。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
physicalDeviceCount
是组中物理设备的数量。 -
physicalDevices
是一个VK_MAX_DEVICE_GROUP_SIZE
VkPhysicalDevice 句柄的数组,表示组中的所有物理设备。数组的前physicalDeviceCount
个元素将是有效的。 -
subsetAllocation
指定从该组创建的逻辑设备是否支持在设备子集上分配设备内存,通过 VkMemoryAllocateFlagsInfo 的deviceMask
成员。如果此值为VK_FALSE
,则所有设备内存分配都将在组中的所有物理设备上进行。如果physicalDeviceCount
为1
,则subsetAllocation
必须为VK_FALSE
。
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
验证 pCreateInfo
的 ppEnabledExtensionNames
和 pEnabledFeatures
成员中分别请求的扩展和功能是否受实现支持。如果任何请求的扩展不受支持,vkCreateDevice
必须返回 VK_ERROR_EXTENSION_NOT_PRESENT
。如果任何请求的功能不受支持,vkCreateDevice
必须返回 VK_ERROR_FEATURE_NOT_PRESENT
。可以通过查询 vkEnumerateDeviceExtensionProperties,在创建设备之前检查对扩展的支持。可以通过查询 vkGetPhysicalDeviceFeatures,类似地检查对功能的支持。
在验证并启用扩展后,将创建 VkDevice
对象并返回给应用程序。
可以从同一物理设备创建多个逻辑设备。逻辑设备的创建 可能 会因缺少设备特定资源(以及其他错误)而失败。如果发生这种情况,vkCreateDevice
将返回 VK_ERROR_TOO_MANY_OBJECTS
。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
queueCreateInfoCount
是pQueueCreateInfos
数组的无符号整数大小。有关更多详细信息,请参阅下面的队列创建部分。 -
pQueueCreateInfos
是指向 VkDeviceQueueCreateInfo 结构数组的指针,该数组描述了与逻辑设备一起请求创建的队列。有关更多详细信息,请参阅下面的队列创建部分。 -
enabledLayerCount
已弃用并被忽略。 -
ppEnabledLayerNames
已弃用并被忽略。请参阅设备层弃用。 -
enabledExtensionCount
是要启用的设备扩展的数量。 -
ppEnabledExtensionNames
是一个指针,指向一个包含enabledExtensionCount
个以 null 结尾的 UTF-8 字符串的数组,这些字符串包含要为创建的设备启用的扩展的名称。有关更多详细信息,请参阅扩展部分。 -
pEnabledFeatures
是NULL
或指向 VkPhysicalDeviceFeatures 结构的指针,该结构包含所有要启用的功能的布尔指示器。有关更多详细信息,请参阅功能部分。
// Provided by VK_VERSION_1_0
typedef VkFlags VkDeviceCreateFlags;
VkDeviceCreateFlags
是用于设置掩码的位掩码类型,但目前保留供将来使用。
通过将 VkDeviceGroupDeviceCreateInfo
结构添加到 VkDeviceCreateInfo 的 pNext
链,可以创建一个连接到一个或多个物理设备的逻辑设备。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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
physicalDeviceCount
是pPhysicalDevices
数组中的元素数量。 -
pPhysicalDevices
是指向属于同一设备组的物理设备句柄数组的指针。
pPhysicalDevices
数组的元素是逻辑设备表示的物理设备的有序列表。 这些必须是单个设备组的子集,并且无需与枚举它们的顺序相同。 pPhysicalDevices
数组中物理设备的顺序决定了每个物理设备的设备索引,其中元素 i 被分配的设备索引为 i。某些命令和结构通过使用设备索引或使用设备索引形成的设备掩码来引用一个或多个物理设备。
创建时不使用 VkDeviceGroupDeviceCreateInfo
或 physicalDeviceCount
等于零的逻辑设备,等效于 physicalDeviceCount
为 1,并且 pPhysicalDevices
指向 vkCreateDevice 的 physicalDevice
参数。 特别地,该物理设备的设备索引为零。
要指定是否允许设备内存分配超出 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
overallocationBehavior
是所需的过度分配行为。
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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
flags
为 0,保留供将来使用。 -
pfnUserCallback
是要调用的应用程序回调函数。 -
pUserData
是要传递给回调的用户数据。
回调函数可能会被多个线程同时调用。
当发生 VkDeviceMemoryReportEventTypeEXT 事件时,实现必须只调用一次回调函数。
回调函数可以从调用 Vulkan 命令的线程以外的后台线程调用。 |
应用程序实现的 VkDeviceDeviceMemoryReportCreateInfoEXT::pfnUserCallback
函数的原型是
// Provided by VK_EXT_device_memory_report
typedef void (VKAPI_PTR *PFN_vkDeviceMemoryReportCallbackEXT)(
const VkDeviceMemoryReportCallbackDataEXT* pCallbackData,
void* pUserData);
-
pCallbackData
包含 VkDeviceMemoryReportCallbackDataEXT 结构中的所有回调相关数据。 -
pUserData
是创建 VkDeviceDeviceMemoryReportCreateInfoEXT 时提供的用户数据。
回调函数必须不能调用任何 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
flags
为 0,保留供将来使用。 -
type
是一个 VkDeviceMemoryReportEventTypeEXT 类型,指定此VkDeviceMemoryReportCallbackDataEXT
结构中报告的事件类型。 -
memoryObjectId
是底层内存对象的唯一 ID,如下所述。 -
size
是内存对象的大小,以字节为单位。如果type
是VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT
、VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT
或VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT
,则size
是一个有效的VkDeviceSize
值。否则,size
是未定义的。 -
objectType
是一个 VkObjectType 值,指定与此设备内存报告事件关联的对象的类型。如果type
是VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT
、VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT
、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
,则objectType
是一个有效的 VkObjectType 枚举。否则,objectType
是未定义的。 -
objectHandle
是此设备内存报告事件归属的对象。如果type
是VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT
、VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT
、VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT
或VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT
,则objectHandle
是一个有效的 Vulkan 句柄,其类型与VkObjectType
和 Vulkan 句柄关系表中定义的objectType
关联。否则,objectHandle
是未定义的。 -
heapIndex
描述了此设备内存分配来自哪个内存堆。如果type
是VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT
或VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT
,则heapIndex
对应于 VkPhysicalDeviceMemoryProperties 结构中的一个有效堆。否则,heapIndex
是未定义的。
memoryObjectId
用于避免在同一内存对象上重复计数。
如果无法导出内部分配的设备内存对象或 VkDeviceMemory,则 memoryObjectId
在 VkDevice 中必须是唯一的。
如果内部分配的设备内存对象或 VkDeviceMemory 支持导出,则 memoryObjectId
在系统范围内必须是唯一的。
如果内部设备内存对象或 VkDeviceMemory 由导入的外部内存对象支持,则 memoryObjectId
在系统范围内必须是唯一的。
此结构仅在触发的回调的生命周期内被视为有效。 对于 |
// 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
privateDataSlotRequestCount
是要保留的槽的数量。
要禁用实现内部管道缓存,请将 VkDevicePipelineBinaryInternalCacheControlKHR 结构添加到 VkDeviceCreateInfo 结构的 pNext
链中。
// Provided by VK_KHR_pipeline_binary
typedef struct VkDevicePipelineBinaryInternalCacheControlKHR {
VkStructureType sType;
const void* pNext;
VkBool32 disableInternalCache;
} VkDevicePipelineBinaryInternalCacheControlKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
disableInternalCache
指定是否禁用实现的内部管道缓存。
如果 VkDeviceCreateInfo
::pNext
链不包含此结构,则 disableInternalCache
默认为 VK_FALSE
。
设备的所有队列使用的着色器核心数量可以通过将 VkDeviceQueueShaderCoreControlCreateInfoARM
结构添加到 VkDeviceCreateInfo 结构的 pNext
链中来控制。
丢失的设备
由于许多特定于实现的原因,逻辑设备可能会变得丢失,这表示挂起和将来的命令执行可能会失败,并导致资源和后备内存变得未定义。
设备丢失的典型原因包括执行超时(以防止拒绝服务)、电源管理事件、平台资源管理和实现错误。 应用程序不遵守有效使用也可能导致报告设备丢失,但这不能保证。即使报告了设备丢失,系统也可能处于无法恢复的状态,进一步使用 API 仍然被认为是无效的。 |
当发生这种情况时,某些命令将返回 VK_ERROR_DEVICE_LOST
。在发生任何此类事件后,逻辑设备被认为是丢失的。不可能将逻辑设备重置为非丢失状态,但是丢失状态特定于逻辑设备 (VkDevice
),并且相应的物理设备 (VkPhysicalDevice
) 可能在其他方面不受影响。
在某些情况下,物理设备可能也会丢失,尝试创建新的逻辑设备将失败,并返回 VK_ERROR_DEVICE_LOST
。这通常表明底层实现或其与主机的连接存在问题。如果物理设备没有丢失,并且从该物理设备成功创建了新的逻辑设备,则它必须处于非丢失状态。
虽然逻辑设备丢失可能是可恢复的,但在物理设备丢失的情况下,除非系统上存在其他不受影响的物理设备,否则应用程序不太可能恢复。此错误主要是信息性的,仅旨在告知应用程序发生了平台问题,并且应该进一步调查。例如,底层硬件可能已出现故障或与系统的其余部分物理断开连接。在许多情况下,物理设备丢失可能会导致其他更严重的问题,例如操作系统崩溃;在这种情况下,它可能不会通过 Vulkan API 报告。 |
当设备丢失时,其子对象不会被隐式销毁,并且它们的句柄仍然有效。这些对象在它们的父对象或设备可以被销毁之前必须仍然被销毁(请参阅对象生命周期部分)。使用 vkMapMemory 映射的设备内存对应的主机地址空间仍然有效,并且对这些映射区域的主机内存访问仍然有效,但内容是未定义的。在设备和子对象上调用任何 API 命令仍然是合法的。
一旦设备丢失,命令执行可能会失败,并且某些返回 VkResult 的命令可能会返回 VK_ERROR_DEVICE_LOST
。这些命令可以通过每个命令的“返回代码”部分中包含 VK_ERROR_DEVICE_LOST
来识别。不允许运行时错误的命令对于有效使用必须仍然正确运行,并且如果适用,则返回有效数据。
无限期等待设备执行的命令(即 vkDeviceWaitIdle、vkQueueWaitIdle、vkWaitForFences 或 vkAcquireNextImageKHR 带有最大 timeout
,以及 vkGetQueryPoolResults 在 flags
中设置了 VK_QUERY_RESULT_WAIT_BIT
位)即使在设备丢失的情况下必须在有限的时间内返回,并且返回 VK_SUCCESS
或 VK_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 对象。
这些对象的生命周期受 |
队列
队列族属性
如上面的物理设备枚举部分所述,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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
flags
是一个位掩码,指示队列的行为。 -
queueFamilyIndex
是一个无符号整数,表示要在该设备上创建队列的队列族的索引。此索引与vkGetPhysicalDeviceQueueFamilyProperties
返回的pQueueFamilyProperties
数组的元素的索引相对应。 -
queueCount
是一个无符号整数,指定要在由queueFamilyIndex
指示的队列族中创建的队列的数量,以及由flags
指定的行为。 -
pQueuePriorities
是一个指向queueCount
个归一化浮点值的数组的指针,指定将提交到每个创建队列的工作的优先级。有关更多信息,请参阅队列优先级。
可以在 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
结构体添加到 VkDeviceQueueCreateInfo 的 pNext
链中,可以创建具有系统级优先级的队列。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
globalPriority
是与这些队列关联的系统级优先级,由 VkQueueGlobalPriority 指定。
创建队列时,如果没有指定 VkDeviceQueueGlobalPriorityCreateInfo
,则默认优先级为 VK_QUEUE_GLOBAL_PRIORITY_MEDIUM
。
以下是 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
shaderCoreCount
是此队列使用的着色器核心数量。
创建队列时,如果没有指定 VkDeviceQueueShaderCoreControlCreateInfoARM
,则默认使用所有可用的着色器核心。
要检索 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
必须仅用于获取使用 VkDeviceQueueCreateInfo 的 flags
参数设置为零创建的队列。要获取使用非零 flags
参数创建的队列,请使用 vkGetDeviceQueue2。
要检索具有特定 VkDeviceQueueCreateFlags 创建标志的 VkQueue 对象的句柄,请调用:
// Provided by VK_VERSION_1_1
void vkGetDeviceQueue2(
VkDevice device,
const VkDeviceQueueInfo2* pQueueInfo,
VkQueue* pQueue);
-
device
是拥有队列的逻辑设备。 -
pQueueInfo
是一个指向 VkDeviceQueueInfo2 结构体的指针,该结构体描述了要检索的设备队列的参数。 -
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。VkDeviceQueueInfo2
的pNext
链可以用于为vkGetDeviceQueue2
提供额外的设备队列参数。 -
flags
是一个 VkDeviceQueueCreateFlags 值,指示用于创建设备队列的标志。 -
queueFamilyIndex
是队列所属的队列族索引。 -
queueIndex
是要从共享指定的队列族和标志的队列集中检索的队列的索引。
vkGetDeviceQueue2
返回的队列必须具有与设备创建时在 VkDeviceQueueCreateInfo 结构中使用的此结构相同的 flags
值。
通常,如果您使用相同的族创建了受保护和不受保护的队列,它们将被视为单独的队列列表,并且 对于此类不同的实现, 当调用 在任何通过 Vulkan 一致性测试套件 1.3.3.0 版本或任何后续版本的驱动程序上都不会观察到此行为。可以通过查询 |
队列族索引
队列族索引在 Vulkan 中的多个位置使用,以便将操作与特定的队列族关联起来。
当通过 vkGetDeviceQueue
检索队列句柄时,队列族索引用于选择从哪个队列族检索 VkQueue
句柄,如上一节所述。
当创建 VkCommandPool
对象时(请参阅 命令池),在 VkCommandPoolCreateInfo 结构中指定一个队列族索引。来自此池的命令缓冲区只能在与此队列族对应的队列上提交。
当创建 VkImage
(请参阅 图像)和 VkBuffer
(请参阅 缓冲区)资源时,一组队列族包含在 VkImageCreateInfo 和 VkBufferCreateInfo 结构中,以指定可以访问资源的队列族。
当插入 VkBufferMemoryBarrier 或 VkImageMemoryBarrier(请参阅 管线屏障)时,将指定源和目标队列族索引,以允许将缓冲区或图像的所有权从一个队列族转移到另一个队列族。有关详细信息,请参阅 资源共享 部分。
队列优先级
每个队列都分配了一个优先级,该优先级在创建设备时在 VkDeviceQueueCreateInfo 结构中设置。每个队列的优先级是一个介于 0.0 和 1.0 之间的归一化浮点值,然后由实现转换为离散优先级级别。较高的值表示较高的优先级,其中 0.0 是最低优先级,1.0 是最高优先级。
在同一设备中,具有较高优先级的队列可能比具有较低优先级的队列分配更多的处理时间。该实现不保证相同优先级的队列之间的排序或调度,除了任何 显式同步原语定义的约束之外。该实现不保证不同设备之间的队列。
在同一个 VkDevice
上,实现可能允许高优先级队列使低优先级队列处于饥饿状态,直到高优先级队列没有进一步的命令要执行。队列优先级的关系必须不会导致一个 VkDevice
上的队列使另一个 VkDevice
上的队列处于饥饿状态。
不保证较高优先级的队列比较低优先级的队列获得更多的处理时间或更好的服务质量。
队列提交
通过队列提交命令(如 vkQueueSubmit2 或 vkQueueSubmit)将工作提交到队列。队列提交命令定义了底层物理设备要执行的一组队列操作,包括与信号量和栅栏的同步。
提交命令将目标队列、零个或多个工作批次以及一个可选的在完成时发出信号的栅栏作为参数。每个批次由三个不同的部分组成:
如果队列提交中存在栅栏,则它描述了一个 栅栏信号操作。
队列提交命令描述的所有工作必须在命令返回之前提交到队列。