附加功能

本章描述了超出限制格式章节中描述的最低功能的附加功能,包括

附加图像功能

本节描述了附加的图像功能,例如更大的尺寸或某些图像类型的额外样本计数,或线性平铺格式图像的附加功能。

要查询特定于图像类型的附加功能,请调用

// Provided by VK_VERSION_1_0
VkResult vkGetPhysicalDeviceImageFormatProperties(
    VkPhysicalDevice                            physicalDevice,
    VkFormat                                    format,
    VkImageType                                 type,
    VkImageTiling                               tiling,
    VkImageUsageFlags                           usage,
    VkImageCreateFlags                          flags,
    VkImageFormatProperties*                    pImageFormatProperties);

formattypetilingusageflags 参数对应于 vkCreateImage(作为 VkImageCreateInfo 的成员)将使用的参数。

如果 format 不是支持的图像格式,或者如果 formattypetilingusageflags 的组合不支持图像,则 vkGetPhysicalDeviceImageFormatProperties 返回 VK_ERROR_FORMAT_NOT_SUPPORTED

vkGetPhysicalDeviceImageFormatProperties 报告的图像格式的限制具有以下属性:如果 VkImageUsageFlags 类型的 usage1usage2 使得 usage1 中设置的位是 usage2 中设置的位的子集,并且 VkImageCreateFlags 类型的 flags1flags2 使得 flags1 中设置的位是 flags2 中设置的位的子集,则对于 formattypetiling 的所有值,usage1flags1 的限制必须不比 usage2flags2 的限制更严格。

如果支持 hostImageCopy 功能,则 usage 包括 VK_IMAGE_USAGE_SAMPLED_BIT,并且 flags 不包括 VK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BITVK_IMAGE_CREATE_SPARSE_ALIASED_BIT 中的任何一个,则对 vkGetPhysicalDeviceImageFormatProperties 的调用结果,除了在 usage 中包含 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 之外,其他参数都相同,则结果必须相同。

有效使用
有效使用(隐式)
  • VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceImageFormatProperties-format-parameter
    format 必须是一个有效的 VkFormat

  • VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter
    type 必须是一个有效的 VkImageType

  • VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-parameter
    tiling 必须是一个有效的 VkImageTiling

  • VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter
    usage 必须VkImageUsageFlagBits 值的有效组合

  • VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask
    usage 不能0

  • VUID-vkGetPhysicalDeviceImageFormatProperties-flags-parameter
    flags 必须VkImageCreateFlagBits 值的有效组合

  • VUID-vkGetPhysicalDeviceImageFormatProperties-pImageFormatProperties-parameter
    pImageFormatProperties 必须是一个指向 VkImageFormatProperties 结构的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_FORMAT_NOT_SUPPORTED

VkImageFormatProperties 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkImageFormatProperties {
    VkExtent3D            maxExtent;
    uint32_t              maxMipLevels;
    uint32_t              maxArrayLayers;
    VkSampleCountFlags    sampleCounts;
    VkDeviceSize          maxResourceSize;
} VkImageFormatProperties;
  • maxExtent 是图像的最大维度。 请参阅下面的 允许的范围值 部分,了解这些值如何受 type 约束。

  • maxMipLevels 是最大mipmap级别数。 maxMipLevels 必须等于基于 maxExtent.widthmaxExtent.heightmaxExtent.depth 的完整mipmap链中的级别数,除非满足以下条件之一,在这种情况下,它可以改为 1

  • maxArrayLayers 是最大数组层数。 maxArrayLayers 必须不小于 VkPhysicalDeviceLimits::maxImageArrayLayers,除非满足以下条件之一,在这种情况下,它可以改为 1

  • 如果 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 maxArrayLayers 不能为 0。

  • sampleCountsVkSampleCountFlagBits 的位掩码,指定此图像的所有支持采样计数,如 下文所述。

  • maxResourceSize 是所有图像子资源(包括所有图像子资源)的总图像大小(以字节为单位)的上限。 实现可以对资源的总大小设置地址空间限制,该限制由此属性进行通告。 maxResourceSize 必须至少为 231

没有机制可以在创建图像之前查询图像的大小,以便将该大小与 maxResourceSize 进行比较。 如果应用程序尝试创建超出此限制的图像,则创建将失败,并且 vkCreateImage 将返回 VK_ERROR_OUT_OF_DEVICE_MEMORY。 虽然通告的限制必须至少为 231,但可能无法创建接近该大小的图像,特别是对于 VK_IMAGE_TYPE_1D

如果 vkGetPhysicalDeviceImageFormatProperties 的参数组合不受实现支持,无法在 vkCreateImage 中使用,则 VkImageFormatProperties 的所有成员都将填充为零。

对于不支持的格式,将 VkImageFormatProperties 填充为零是错误时输出结构具有未定义内容的通常规则的例外。 此例外是无意的,但为了向后兼容而保留。

要确定与外部内存句柄类型兼容的图像功能,请调用

// Provided by VK_NV_external_memory_capabilities
VkResult vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
    VkPhysicalDevice                            physicalDevice,
    VkFormat                                    format,
    VkImageType                                 type,
    VkImageTiling                               tiling,
    VkImageUsageFlags                           usage,
    VkImageCreateFlags                          flags,
    VkExternalMemoryHandleTypeFlagsNV           externalHandleType,
    VkExternalImageFormatPropertiesNV*          pExternalImageFormatProperties);

如果 externalHandleType 为 0,则 pExternalImageFormatProperties->imageFormatProperties 将返回与调用 vkGetPhysicalDeviceImageFormatProperties 相同的值,并且 pExternalImageFormatProperties 的其他成员都将为 0。 否则,它们将按 VkExternalImageFormatPropertiesNV 所述进行填充。

有效使用
  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-07721
    externalHandleType 不能设置多个位

有效使用(隐式)
  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter
    format 必须是一个有效的 VkFormat

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter
    type 必须是一个有效的 VkImageType

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-tiling-parameter
    tiling 必须是一个有效的 VkImageTiling

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter
    usage 必须VkImageUsageFlagBits 值的有效组合

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask
    usage 不能0

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter
    flags 必须VkImageCreateFlagBits 值的有效组合

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter
    externalHandleType 必须VkExternalMemoryHandleTypeFlagBitsNV 值的有效组合。

  • VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-pExternalImageFormatProperties-parameter
    pExternalImageFormatProperties 必须是指向 VkExternalImageFormatPropertiesNV 结构的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_FORMAT_NOT_SUPPORTED

VkExternalImageFormatPropertiesNV 结构定义如下:

// Provided by VK_NV_external_memory_capabilities
typedef struct VkExternalImageFormatPropertiesNV {
    VkImageFormatProperties              imageFormatProperties;
    VkExternalMemoryFeatureFlagsNV       externalMemoryFeatures;
    VkExternalMemoryHandleTypeFlagsNV    exportFromImportedHandleTypes;
    VkExternalMemoryHandleTypeFlagsNV    compatibleHandleTypes;
} VkExternalImageFormatPropertiesNV;

以下位可以VkExternalImageFormatPropertiesNV::externalMemoryFeatures 中设置,指示外部内存句柄类型的属性:

// Provided by VK_NV_external_memory_capabilities
typedef enum VkExternalMemoryFeatureFlagBitsNV {
    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV = 0x00000001,
    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV = 0x00000002,
    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV = 0x00000004,
} VkExternalMemoryFeatureFlagBitsNV;
  • VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV 指定在以指定的方式使用时,指定类型的外部内存必须创建为专用分配。

  • VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV 指定实现支持导出指定类型的句柄。

  • VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV 指定实现支持导入指定类型的句柄。

// Provided by VK_NV_external_memory_capabilities
typedef VkFlags VkExternalMemoryFeatureFlagsNV;

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

要查询特定于图像类型的附加功能,请调用

// Provided by VK_VERSION_1_1
VkResult vkGetPhysicalDeviceImageFormatProperties2(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceImageFormatInfo2*     pImageFormatInfo,
    VkImageFormatProperties2*                   pImageFormatProperties);

或等效命令:

// Provided by VK_KHR_get_physical_device_properties2
VkResult vkGetPhysicalDeviceImageFormatProperties2KHR(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceImageFormatInfo2*     pImageFormatInfo,
    VkImageFormatProperties2*                   pImageFormatProperties);

vkGetPhysicalDeviceImageFormatProperties2 的行为类似于 vkGetPhysicalDeviceImageFormatProperties,并且能够以输出结构的 pNext 链的形式返回扩展信息。

如果 pImageFormatInfopNext 链包含一个 VkVideoProfileListInfoKHR 结构,且其 profileCount 成员大于 0,则此命令返回特定于与指定视频配置文件结合使用的图像类型的格式功能。在这种情况下,如果通过 VkVideoProfileListInfoKHR::pProfiles 指定的任何配置文件不受支持,则此命令将返回特定于视频配置文件的错误代码之一。此外,如果 VkPhysicalDeviceImageFormatInfo2::usage 包含任何指定视频配置文件不支持的图像用法标志,则此命令将返回 VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR

有效使用
  • VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868
    如果 pImageFormatPropertiespNext 链包含一个 VkAndroidHardwareBufferUsageANDROID 结构,则 pImageFormatInfopNext必须包含一个 VkPhysicalDeviceExternalImageFormatInfo 结构,并且其 handleType 设置为 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID

  • VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-09004
    如果 pImageFormatPropertiespNext 链包含一个 VkHostImageCopyDevicePerformanceQuery 结构,则 pImageFormatInfo->usage 必须包含 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

有效使用(隐式)
  • VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter
    pImageFormatInfo 必须是指向有效 VkPhysicalDeviceImageFormatInfo2 结构的有效指针。

  • VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter
    pImageFormatProperties 必须是指向 VkImageFormatProperties2 结构的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_FORMAT_NOT_SUPPORTED

  • VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR

VkPhysicalDeviceImageFormatInfo2 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceImageFormatInfo2 {
    VkStructureType       sType;
    const void*           pNext;
    VkFormat              format;
    VkImageType           type;
    VkImageTiling         tiling;
    VkImageUsageFlags     usage;
    VkImageCreateFlags    flags;
} VkPhysicalDeviceImageFormatInfo2;

或等效的:

// Provided by VK_KHR_get_physical_device_properties2
typedef VkPhysicalDeviceImageFormatInfo2 VkPhysicalDeviceImageFormatInfo2KHR;

VkPhysicalDeviceImageFormatInfo2 的成员对应于 vkGetPhysicalDeviceImageFormatProperties 的参数,并添加了 sTypepNext 以实现可扩展性。

有效使用
  • VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02249
    当且仅当 pNext 链包含 VkPhysicalDeviceImageDrmFormatModifierInfoEXT 时,tiling 必须VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT

  • VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02313
    如果 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXTflags 包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT,则 pNext必须包含一个 viewFormatCount 非零的 VkImageFormatListCreateInfo 结构。

有效使用(隐式)

VkImageFormatProperties2 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkImageFormatProperties2 {
    VkStructureType            sType;
    void*                      pNext;
    VkImageFormatProperties    imageFormatProperties;
} VkImageFormatProperties2;

或等效的:

// Provided by VK_KHR_get_physical_device_properties2
typedef VkImageFormatProperties2 VkImageFormatProperties2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。VkImageFormatProperties2pNext 链用于允许指定从 vkGetPhysicalDeviceImageFormatProperties2 返回的附加功能。

  • imageFormatProperties 是一个 VkImageFormatProperties 结构,其中返回功能。

如果 vkGetPhysicalDeviceImageFormatProperties2 的参数组合不受实现支持以用于 vkCreateImage,则 imageFormatProperties 的所有成员都将填充为零。

对于不支持的格式,将 imageFormatProperties 填充为零是输出结构在发生错误时通常具有未定义内容的规则的例外情况。此例外情况是无意的,但为了向后兼容性而保留。此例外情况仅适用于 imageFormatProperties,而不适用于 sTypepNext 或从 pNext 链接的任何结构。

有效使用(隐式)

要确定接受显式 LOD 和/或偏差参数值的纹理采集函数是否可以与给定的图像格式一起使用,请在调用 vkGetPhysicalDeviceImageFormatProperties2 时,将 VkTextureLODGatherFormatPropertiesAMD 结构添加到 VkImageFormatProperties2 结构的 pNext 链。

VkTextureLODGatherFormatPropertiesAMD 结构定义如下:

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

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

  • supportsTextureGatherLODBiasAMD 指示图像格式是否可以与由 VK_AMD_texture_gather_bias_lod 扩展引入的纹理采集偏差/LOD 函数一起使用。此字段由实现设置。应用程序指定的值将被忽略。

有效使用(隐式)
  • VUID-VkTextureLODGatherFormatPropertiesAMD-sType-sType
    sType 必须VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD

要确定与外部内存句柄类型兼容的图像功能,请将 VkPhysicalDeviceExternalImageFormatInfo 结构添加到 VkPhysicalDeviceImageFormatInfo2 结构的 pNext 链,并将 VkExternalImageFormatProperties 结构添加到 VkImageFormatProperties2 结构的 pNext 链。

VkPhysicalDeviceExternalImageFormatInfo 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceExternalImageFormatInfo {
    VkStructureType                       sType;
    const void*                           pNext;
    VkExternalMemoryHandleTypeFlagBits    handleType;
} VkPhysicalDeviceExternalImageFormatInfo;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkPhysicalDeviceExternalImageFormatInfo VkPhysicalDeviceExternalImageFormatInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • handleType 是一个 VkExternalMemoryHandleTypeFlagBits 值,指定将与图像关联的内存一起使用的内存句柄类型。

如果 handleType 为 0,则 vkGetPhysicalDeviceImageFormatProperties2 的行为将如同不存在 VkPhysicalDeviceExternalImageFormatInfo,并且 VkExternalImageFormatProperties 将被忽略。

如果 handleTypeVkPhysicalDeviceImageFormatInfo2 中指定的 formattypetilingusageflags 不兼容,则 vkGetPhysicalDeviceImageFormatProperties2 返回 VK_ERROR_FORMAT_NOT_SUPPORTED

有效使用(隐式)
  • VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO

  • VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter
    如果 handleType 不为 0,则 handleType 必须是有效的 VkExternalMemoryHandleTypeFlagBits 值。

指定外部内存句柄类型的 VkPhysicalDeviceExternalImageFormatInfo::handleType 的可能值为:

// Provided by VK_VERSION_1_1
typedef enum VkExternalMemoryHandleTypeFlagBits {
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001,
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002,
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT = 0x00000008,
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT = 0x00000010,
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT = 0x00000020,
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT = 0x00000040,
  // Provided by VK_EXT_external_memory_dma_buf
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT = 0x00000200,
  // Provided by VK_ANDROID_external_memory_android_hardware_buffer
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400,
  // Provided by VK_EXT_external_memory_host
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080,
  // Provided by VK_EXT_external_memory_host
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100,
  // Provided by VK_FUCHSIA_external_memory
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0x00000800,
  // Provided by VK_NV_external_memory_rdma
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV = 0x00001000,
  // Provided by VK_QNX_external_memory_screen_buffer
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX = 0x00004000,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT,
} VkExternalMemoryHandleTypeFlagBits;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalMemoryHandleTypeFlagBits VkExternalMemoryHandleTypeFlagBitsKHR;
  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT 指定一个 POSIX 文件描述符句柄,该句柄在 Vulkan 和其他兼容 API 之外的使用受到限制。它必须与 POSIX 系统调用 dupdup2close 和非标准系统调用 dup3 兼容。此外,它必须能够通过使用 SCM_RIGHTS 控制消息的套接字进行传输。它拥有对其 Vulkan 内存对象所代表的底层内存资源的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT 指定一个 NT 句柄,该句柄在 Vulkan 和其他兼容 API 之外的使用受到限制。它必须与函数 DuplicateHandleCloseHandleCompareObjectHandlesGetHandleInformationSetHandleInformation 兼容。它拥有对其 Vulkan 内存对象所代表的底层内存资源的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT 指定一个全局共享句柄,该句柄在 Vulkan 和其他兼容 API 之外的使用受到限制。它与任何原生 API 都不兼容。它不拥有对其 Vulkan 内存对象所代表的底层内存资源的引用,因此当所有与之关联的 Vulkan 内存对象被销毁时,它将变为无效。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT 指定一个由 IDXGIResource1::CreateSharedHandle 返回的 NT 句柄,该句柄引用一个 Direct3D 10 或 11 纹理资源。它拥有对 Direct3D 资源使用的内存的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT 指定一个由 IDXGIResource::GetSharedHandle 返回的全局共享句柄,该句柄引用一个 Direct3D 10 或 11 纹理资源。它不拥有对底层 Direct3D 资源的引用,因此当所有与之关联的 Vulkan 内存对象和 Direct3D 资源被销毁时,它将变为无效。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT 指定一个由 ID3D12Device::CreateSharedHandle 返回的 NT 句柄,该句柄引用一个 Direct3D 12 堆资源。它拥有对 Direct3D 堆使用的资源的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT 指定一个由 ID3D12Device::CreateSharedHandle 返回的 NT 句柄,该句柄引用一个 Direct3D 12 提交的资源。它拥有对 Direct3D 资源使用的内存的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT 指定一个由主机内存分配命令返回的主机指针。它不拥有对底层内存资源的引用,因此如果主机内存被释放,它将变为无效。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT 指定一个指向主机映射的外部内存的主机指针。它不拥有对底层内存资源的引用,因此如果外部内存被取消映射或以其他方式不再可用,它将变为无效。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT 是一个 Linux dma_buf 的文件描述符。它拥有对其 Vulkan 内存对象所代表的底层内存资源的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 指定一个由 Android NDK 定义的 AHardwareBuffer 对象。有关此句柄类型的更多详细信息,请参阅Android 硬件缓冲区

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA 是一个指向虚拟内存对象的 Zircon 句柄。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV 是一个可由远程设备访问的分配的句柄。它拥有对其 Vulkan 内存对象所代表的底层内存资源的引用。

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX 指定一个由 QNX SDP 定义的 _screen_buffer 对象。有关此句柄类型的更多详细信息,请参阅QNX 屏幕缓冲区

某些外部内存句柄类型只能在同一个底层物理设备和/或同一个驱动程序版本内共享,如下表定义

表 1. 外部内存句柄类型兼容性

句柄类型

VkPhysicalDeviceIDProperties::driverUUID

VkPhysicalDeviceIDProperties::deviceUUID

VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT

必须匹配

必须匹配

VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT

无限制

无限制

VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT

无限制

无限制

VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT

无限制

无限制

VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID

无限制

无限制

VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA

无限制

无限制

VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV

无限制

无限制

VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX

无限制

无限制

上表不限制 VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXTVK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT 可以共享的驱动程序和设备,因为这些句柄类型本质上意味着内存并非来自同一设备,因为它们分别从主机或外部设备导入内存。

即使上表不限制 VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT 可以共享的驱动程序和设备,Vulkan API 中也存在查询机制,可防止导入不兼容的 dma-buf(例如 vkGetMemoryFdPropertiesKHR),并防止不兼容地使用 dma-buf(例如 VkPhysicalDeviceExternalBufferInfoVkPhysicalDeviceExternalImageFormatInfo)。

// Provided by VK_VERSION_1_1
typedef VkFlags VkExternalMemoryHandleTypeFlags;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalMemoryHandleTypeFlags VkExternalMemoryHandleTypeFlagsKHR;

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

VkExternalImageFormatProperties 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkExternalImageFormatProperties {
    VkStructureType               sType;
    void*                         pNext;
    VkExternalMemoryProperties    externalMemoryProperties;
} VkExternalImageFormatProperties;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalImageFormatProperties VkExternalImageFormatPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • externalMemoryProperties 是一个 VkExternalMemoryProperties 结构,指定当与指定的图像创建参数一起使用时,外部句柄类型的各种功能。

有效使用(隐式)
  • VUID-VkExternalImageFormatProperties-sType-sType
    sType必须VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES

VkExternalMemoryProperties 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkExternalMemoryProperties {
    VkExternalMemoryFeatureFlags       externalMemoryFeatures;
    VkExternalMemoryHandleTypeFlags    exportFromImportedHandleTypes;
    VkExternalMemoryHandleTypeFlags    compatibleHandleTypes;
} VkExternalMemoryProperties;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalMemoryProperties VkExternalMemoryPropertiesKHR;

compatibleHandleTypes必须至少包含 handleType。在 compatibleHandleTypes 中包含句柄类型并不意味着当 VkPhysicalDeviceExternalImageFormatInfo::handleType 设置为该类型时,在 VkImageFormatProperties2 中返回的值将相同。应用程序负责查询单个图像中所有打算同时使用的句柄类型的功能,并对其求交以获得兼容的功能集。

VkExternalMemoryProperties::externalMemoryFeatures 中**可能**设置的位,用于指定外部内存句柄类型的特性,包括:

// Provided by VK_VERSION_1_1
typedef enum VkExternalMemoryFeatureFlagBits {
    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT = 0x00000001,
    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT = 0x00000002,
    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT = 0x00000004,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT,
  // Provided by VK_KHR_external_memory_capabilities
    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT,
} VkExternalMemoryFeatureFlagBits;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalMemoryFeatureFlagBits VkExternalMemoryFeatureFlagBitsKHR;
  • VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT 指定使用指定参数和句柄类型创建的图像或缓冲区**必须**使用 VkMemoryDedicatedRequirementsVkMemoryDedicatedAllocateInfo 定义的机制来创建(或导入)该图像或缓冲区的专用分配。

  • VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT 指定此类型的句柄**可以**从 Vulkan 内存对象导出。

  • VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT 指定此类型的句柄**可以**作为 Vulkan 内存对象导入。

由于它们在外部 API 中的语义与 Vulkan 中具有专用分配的图像或缓冲区大致一致,因此实现**必须**为以下外部句柄类型报告 VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,仅适用于图像

  • VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX,仅适用于图像

对于具有外部句柄类型 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 的缓冲区,实现**不得**报告 VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT。对于具有外部句柄类型 VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX 的缓冲区,实现**不得**报告 VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT。对于具有外部句柄类型 VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXTVK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT 的图像或缓冲区,实现**不得**报告 VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT

// Provided by VK_VERSION_1_1
typedef VkFlags VkExternalMemoryFeatureFlags;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalMemoryFeatureFlags VkExternalMemoryFeatureFlagsKHR;

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

要查询与 Linux DRM 格式修饰符 兼容的图像功能,请将 VkPhysicalDeviceImageFormatInfo2::tiling 设置为 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,并将 VkPhysicalDeviceImageDrmFormatModifierInfoEXT 结构添加到 VkPhysicalDeviceImageFormatInfo2pNext 链中。

VkPhysicalDeviceImageDrmFormatModifierInfoEXT 结构定义如下:

// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkPhysicalDeviceImageDrmFormatModifierInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    uint64_t           drmFormatModifier;
    VkSharingMode      sharingMode;
    uint32_t           queueFamilyIndexCount;
    const uint32_t*    pQueueFamilyIndices;
} VkPhysicalDeviceImageDrmFormatModifierInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • drmFormatModifier 是图像的 _Linux DRM 格式修饰符_,对应于 VkImageDrmFormatModifierExplicitCreateInfoEXT::modifierVkImageDrmFormatModifierListCreateInfoEXT::pModifiers

  • sharingMode 指定多个队列族如何访问该图像。

  • queueFamilyIndexCountpQueueFamilyIndices 数组中的条目数。

  • pQueueFamilyIndices 是指向将访问该图像的队列族数组的指针。如果 sharingMode 不是 VK_SHARING_MODE_CONCURRENT,则忽略该指针。

如果 drmFormatModifierVkPhysicalDeviceImageFormatInfo2 及其 pNext 链中指定的参数不兼容,则 vkGetPhysicalDeviceImageFormatProperties2 返回 VK_ERROR_FORMAT_NOT_SUPPORTED。实现**必须**支持查询任何 drmFormatModifier,包括未知和无效的修饰符值。

有效使用
  • VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02314
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 pQueueFamilyIndices **必须**是指向 queueFamilyIndexCountuint32_t 值的数组的有效指针

  • VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02315
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 queueFamilyIndexCount **必须**大于 1

  • VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02316
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 pQueueFamilyIndices 的每个元素**必须**是唯一的,并且**必须**小于 vkGetPhysicalDeviceQueueFamilyProperties2 为用于创建 devicephysicalDevice 返回的 pQueueFamilyPropertyCount

有效使用(隐式)
  • VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sType-sType
    sType **必须**为 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT

  • VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-parameter
    sharingMode **必须**是一个有效的 VkSharingMode

要确定支持多平面格式所需的组合图像采样器数量,请在调用 vkGetPhysicalDeviceImageFormatProperties2 时,将 VkSamplerYcbcrConversionImageFormatProperties 添加到 VkImageFormatProperties2 结构的 pNext 链中。

VkSamplerYcbcrConversionImageFormatProperties 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkSamplerYcbcrConversionImageFormatProperties {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           combinedImageSamplerDescriptorCount;
} VkSamplerYcbcrConversionImageFormatProperties;

或等效的:

// Provided by VK_KHR_sampler_ycbcr_conversion
typedef VkSamplerYcbcrConversionImageFormatProperties VkSamplerYcbcrConversionImageFormatPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • combinedImageSamplerDescriptorCount 是实现用来访问该格式的组合图像采样器描述符的数量。

有效使用(隐式)
  • VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType
    sType **必须**为 VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES

combinedImageSamplerDescriptorCount 是一个介于 1 和格式中的平面数之间的数字。具有不可变的 Y′CBCR 转换采样器的描述符集布局绑定将具有一个最大 combinedImageSamplerDescriptorCount,该值是其采样器支持的所有格式的每个格式的 combinedImageSamplerDescriptorCount 的最大值。具有该布局的描述符集将在内部为绑定中的每个描述符使用该最大 combinedImageSamplerDescriptorCount 个描述符。当分配描述符集时,将从描述符池中使用这个扩展的描述符数量,并计入 maxDescriptorSetSamplersmaxDescriptorSetSampledImagesmaxPerStageDescriptorSamplersmaxPerStageDescriptorSampledImages 限制。

绑定中的所有描述符都使用相同的最大 combinedImageSamplerDescriptorCount 个描述符,以允许实现对绑定中描述符进行动态索引时使用统一的步幅。

例如,考虑一个具有两个描述符和多平面格式的不可变采样器的描述符集布局绑定,它们的 VkSamplerYcbcrConversionImageFormatProperties::combinedImageSamplerDescriptorCount 值分别为 23。绑定中有两个描述符,最大 combinedImageSamplerDescriptorCount3,因此具有此布局的描述符集将从描述符池中消耗 6 个描述符。要创建一个允许分配具有此布局的四个描述符集的描述符池,descriptorCount 必须至少为 24

应用程序可以使用 VkPhysicalDeviceMaintenance6Properties::maxCombinedImageSamplerDescriptorCount 属性来确定最大描述符大小,该大小可容纳实现支持的任何和所有需要采样器 Y′CBCR 转换的格式,而不是查询描述符布局中应用程序可能使用的所有潜在格式。

要获取特定图像创建参数的最佳 Android 硬件缓冲区使用标志,请将 VkAndroidHardwareBufferUsageANDROID 结构添加到传递给 vkGetPhysicalDeviceImageFormatProperties2VkImageFormatProperties2 结构的 pNext 链中。此结构的定义如下:

// Provided by VK_ANDROID_external_memory_android_hardware_buffer
typedef struct VkAndroidHardwareBufferUsageANDROID {
    VkStructureType    sType;
    void*              pNext;
    uint64_t           androidHardwareBufferUsage;
} VkAndroidHardwareBufferUsageANDROID;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • androidHardwareBufferUsage 返回 Android 硬件缓冲区使用标志。

当相应的 Vulkan 图像使用或图像创建标志包含在 VkPhysicalDeviceImageFormatInfo2usageflags 字段中时,androidHardwareBufferUsage 字段必须包含AHardwareBuffer 使用等效表中列出的 Android 硬件缓冲区使用标志。它必须至少包含一个 GPU 使用标志 (AHARDWAREBUFFER_USAGE_GPU_*),即使没有请求相应的 Vulkan 使用或标志。

要求至少一个 GPU 使用标志可确保 Android 硬件缓冲区内存将在 Vulkan 实现可访问的内存池中分配,并且基于使用标志专门化内存布局不会阻止它与 Vulkan 兼容。实现可能通过使用供应商使用标志来指示仅需要 VkImageFormatProperties2 中指示的 Vulkan 用途,从而避免由此要求引起的不必要的限制。

有效使用(隐式)
  • VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID

要查询当访问图像时使用 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 是否会对设备性能产生负面影响,请将 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 添加到 VkPhysicalDeviceImageFormatInfo2::usage,并将 VkHostImageCopyDevicePerformanceQuery 结构添加到传递给 vkGetPhysicalDeviceImageFormatProperties2VkImageFormatProperties2 结构的 pNext 链中。此结构的定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkHostImageCopyDevicePerformanceQuery {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           optimalDeviceAccess;
    VkBool32           identicalMemoryLayout;
} VkHostImageCopyDevicePerformanceQuery;

或等效的:

// Provided by VK_EXT_host_image_copy
typedef VkHostImageCopyDevicePerformanceQuery VkHostImageCopyDevicePerformanceQueryEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • 如果使用主机图像复制与具有相同创建参数,并绑定到相同 VkDeviceMemory 的图像相比,对设备访问性能没有不利影响(除了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 被替换为 VK_IMAGE_USAGE_TRANSFER_SRC_BITVK_IMAGE_USAGE_TRANSFER_DST_BIT 之外),则 optimalDeviceAccess 返回 VK_TRUE

  • 如果使用主机图像复制对内存布局没有影响,与具有相同创建参数,并绑定到相同 VkDeviceMemory 的图像相比(除了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 被替换为 VK_IMAGE_USAGE_TRANSFER_SRC_BITVK_IMAGE_USAGE_TRANSFER_DST_BIT 之外),则 identicalMemoryLayout 返回 VK_TRUE

如果 identicalMemoryLayoutVK_FALSE,则实现可能optimalDeviceAccess 中返回 VK_FALSE。如果 identicalMemoryLayoutVK_TRUE,则 optimalDeviceAccess 必须VK_TRUE

实现可能optimalDeviceAccess 中返回 VK_TRUE,而 identicalMemoryLayoutVK_FALSE。在这种情况下,任何设备性能影响应该是不可衡量的。

如果 VkPhysicalDeviceImageFormatInfo2::format 是块压缩格式,并且 vkGetPhysicalDeviceImageFormatProperties2 返回 VK_SUCCESS,则实现必须optimalDeviceAccess 中返回 VK_TRUE

应用程序可以利用 optimalDeviceAccess 来确定其资源复制策略。如果期望资源在设备上的访问次数多于在主机上的访问次数,并且实现认为资源的访问不是最优的,则最好使用设备复制来代替。

如果实现具有不同的内存布局模式,其中一些模式在主机上更容易访问,则内存布局可能不相同,但仍然被认为对设备访问是最佳的。

optimalDeviceAccessVK_FALSE 最实际的原因是,主机图像访问可能会禁用帧缓冲区压缩,否则它本可以启用。这表示更高效的主机图像访问,因为不需要压缩算法来读取或写入图像,但这会影响设备访问性能。某些实现可能仅在满足特定条件(例如,特定的图像使用标志或创建标志)时才将 optimalDeviceAccess 设置为 VK_FALSE

有效使用(隐式)
  • VUID-VkHostImageCopyDevicePerformanceQuery-sType-sType
    sType 必须VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY

要确定立方滤波是否可以与给定的图像格式和给定的图像视图类型一起使用,请将 VkPhysicalDeviceImageViewImageFormatInfoEXT 结构添加到 VkPhysicalDeviceImageFormatInfo2 结构的 pNext 链中,并将 VkFilterCubicImageViewImageFormatPropertiesEXT 结构添加到 VkImageFormatProperties2 结构的 pNext 链中。

VkPhysicalDeviceImageViewImageFormatInfoEXT 结构的定义如下:

// Provided by VK_EXT_filter_cubic
typedef struct VkPhysicalDeviceImageViewImageFormatInfoEXT {
    VkStructureType    sType;
    void*              pNext;
    VkImageViewType    imageViewType;
} VkPhysicalDeviceImageViewImageFormatInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • imageViewType 是指定图像视图类型的 VkImageViewType 值。

有效使用(隐式)
  • VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT

  • VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-imageViewType-parameter
    imageViewType 必须是有效的 VkImageViewType

VkFilterCubicImageViewImageFormatPropertiesEXT 结构的定义如下:

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

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

  • filterCubic 指示图像格式、图像类型和图像视图类型是否可以与立方滤波一起使用。此字段由实现设置。将忽略应用程序指定的值。

  • filterCubicMinmax 指示图像格式、图像类型和图像视图类型是否可以与立方滤波和最小值最大值滤波一起使用。此字段由实现设置。将忽略应用程序指定的值。

有效使用(隐式)
  • VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT

有效使用

支持的采样计数

vkGetPhysicalDeviceImageFormatPropertiessampleCounts 中返回一个 VkSampleCountFlagBits 的位掩码,指定图像参数支持的采样计数。

如果以下至少一个条件为真,则 sampleCounts 将为 VK_SAMPLE_COUNT_1_BIT

  • tilingVK_IMAGE_TILING_LINEAR

  • type 不是 VK_IMAGE_TYPE_2D

  • flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT

  • vkGetPhysicalDeviceFormatProperties 返回的 VkFormatProperties::optimalTilingFeatures 中的 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT 标志和 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT 标志均未设置

  • VkPhysicalDeviceExternalImageFormatInfo::handleType 是一个外部句柄类型,该类型不需要多采样图像支持。

  • format需要采样器 Y′CBCR 转换的格式之一

  • usage 包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • usage 包含 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT

否则,sampleCounts 中设置的位将是指定的 usageformat 值支持的采样计数。对于 usage 中设置的每个位,支持的采样计数与 VkPhysicalDeviceLimits 中的限制相关,如下所示

  • 如果 usage 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITformat 是浮点或定点颜色格式,则为 VkPhysicalDeviceLimits::framebufferColorSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITformat 是整数格式,则为 VkPhysicalDeviceVulkan12Properties::framebufferIntegerColorSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITformat 包含深度分量,则为 VkPhysicalDeviceLimits::framebufferDepthSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITformat 包含模板分量,则为 VkPhysicalDeviceLimits::framebufferStencilSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_SAMPLED_BITformat 包含颜色分量,则为 VkPhysicalDeviceLimits::sampledImageColorSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_SAMPLED_BITformat 包含深度分量,则为 VkPhysicalDeviceLimits::sampledImageDepthSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_SAMPLED_BITformat 是整数格式,则为 VkPhysicalDeviceLimits::sampledImageIntegerSampleCounts 的超集

  • 如果 usage 包含 VK_IMAGE_USAGE_STORAGE_BIT,则为 VkPhysicalDeviceLimits::storageImageSampleCounts 的超集

如果在 usage 中设置了多个位,则 sampleCounts 将是上述每个使用情况值的交集。

如果 usage 中未设置上述任何位,则 VkPhysicalDeviceLimits 中没有相应的限制。在这种情况下,sampleCounts 必须至少包含 VK_SAMPLE_COUNT_1_BIT

基于图像类型允许的范围值

对于某些类型的图像,实现可能支持大于 要求的最小/最大值的范围值。VkImageFormatProperties::maxExtent 对于每种类型都受以下约束的约束。

实现必须支持所有类型的图像,其尺寸大小上限为 要求的最小/最大值。因此,对附加功能的查询必须返回至少与要求值一样大的范围值。

对于 VK_IMAGE_TYPE_1D

对于 VK_IMAGE_TYPE_2D,当 flags 不包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT

对于 VK_IMAGE_TYPE_2D,当 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT

对于 VK_IMAGE_TYPE_3D

附加缓冲区功能

要查询缓冲区支持的外部句柄类型,请调用

// Provided by VK_VERSION_1_1
void vkGetPhysicalDeviceExternalBufferProperties(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,
    VkExternalBufferProperties*                 pExternalBufferProperties);

或等效命令:

// Provided by VK_KHR_external_memory_capabilities
void vkGetPhysicalDeviceExternalBufferPropertiesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,
    VkExternalBufferProperties*                 pExternalBufferProperties);
有效使用(隐式)
  • VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter
    pExternalBufferInfo 必须是指向有效 VkPhysicalDeviceExternalBufferInfo 结构的有效指针

  • VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter
    pExternalBufferProperties 必须是指向 VkExternalBufferProperties 结构的有效指针

VkPhysicalDeviceExternalBufferInfo 结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceExternalBufferInfo {
    VkStructureType                       sType;
    const void*                           pNext;
    VkBufferCreateFlags                   flags;
    VkBufferUsageFlags                    usage;
    VkExternalMemoryHandleTypeFlagBits    handleType;
} VkPhysicalDeviceExternalBufferInfo;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkPhysicalDeviceExternalBufferInfo VkPhysicalDeviceExternalBufferInfoKHR;

在此结构的 usage 中仅返回 VkBufferUsageFlagBits 中可表示的使用标志。如果 pNext 链包含 VkBufferUsageFlags2CreateInfo 结构,则缓冲区的全部使用标志都会在 VkBufferUsageFlags2CreateInfo::usage 中返回。

有效使用
有效使用(隐式)
  • VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO

  • VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext
    pNext 必须NULL 或指向 VkBufferUsageFlags2CreateInfo 有效实例的指针

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

  • VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter
    flags 必须VkBufferCreateFlagBits 值的有效组合

  • VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter
    handleType 必须 是一个有效的 VkExternalMemoryHandleTypeFlagBits

VkExternalBufferProperties 结构体定义如下

// Provided by VK_VERSION_1_1
typedef struct VkExternalBufferProperties {
    VkStructureType               sType;
    void*                         pNext;
    VkExternalMemoryProperties    externalMemoryProperties;
} VkExternalBufferProperties;

或等效的:

// Provided by VK_KHR_external_memory_capabilities
typedef VkExternalBufferProperties VkExternalBufferPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • externalMemoryProperties 是一个 VkExternalMemoryProperties 结构体,指定外部句柄类型在与指定缓冲区创建参数一起使用时的各种功能。

有效使用(隐式)
  • VUID-VkExternalBufferProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES

  • VUID-VkExternalBufferProperties-pNext-pNext
    pNext 必须NULL

可选的信号量功能

信号量可能支持将其 有效负载 导入和导出到外部句柄。要查询信号量支持的外部句柄类型,请调用

// Provided by VK_VERSION_1_1
void vkGetPhysicalDeviceExternalSemaphoreProperties(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
    VkExternalSemaphoreProperties*              pExternalSemaphoreProperties);

或等效命令:

// Provided by VK_KHR_external_semaphore_capabilities
void vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
    VkExternalSemaphoreProperties*              pExternalSemaphoreProperties);
有效使用(隐式)
  • VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter
    pExternalSemaphoreInfo 必须 是指向有效的 VkPhysicalDeviceExternalSemaphoreInfo 结构体的有效指针

  • VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter
    pExternalSemaphoreProperties 必须 是指向 VkExternalSemaphoreProperties 结构体的有效指针

VkPhysicalDeviceExternalSemaphoreInfo 结构体定义如下

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceExternalSemaphoreInfo {
    VkStructureType                          sType;
    const void*                              pNext;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
} VkPhysicalDeviceExternalSemaphoreInfo;

或等效的:

// Provided by VK_KHR_external_semaphore_capabilities
typedef VkPhysicalDeviceExternalSemaphoreInfo VkPhysicalDeviceExternalSemaphoreInfoKHR;
有效使用(隐式)
  • VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO

  • VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext
    pNext 必须NULL 或指向 VkSemaphoreTypeCreateInfo 有效实例的指针

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

  • VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter
    handleType 必须 是一个有效的 VkExternalSemaphoreHandleTypeFlagBits

VkPhysicalDeviceExternalSemaphoreInfo::handleType可能设置的位,指定外部信号量句柄类型,包括

// Provided by VK_VERSION_1_1
typedef enum VkExternalSemaphoreHandleTypeFlagBits {
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001,
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002,
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0x00000008,
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000010,
  // Provided by VK_FUCHSIA_external_semaphore
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA = 0x00000080,
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
} VkExternalSemaphoreHandleTypeFlagBits;

或等效的:

// Provided by VK_KHR_external_semaphore_capabilities
typedef VkExternalSemaphoreHandleTypeFlagBits VkExternalSemaphoreHandleTypeFlagBitsKHR;
  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT 指定一个 POSIX 文件描述符句柄,该句柄在 Vulkan 和其他兼容 API 之外的有效用途有限。它必须与 POSIX 系统调用 dupdup2close 和非标准系统调用 dup3 兼容。此外,它必须可以使用 SCM_RIGHTS 控制消息通过套接字传输。它拥有对其 Vulkan 信号量对象表示的底层同步原语的引用。

  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT 指定一个 NT 句柄,该句柄在 Vulkan 和其他兼容 API 之外的有效用途有限。它必须与函数 DuplicateHandleCloseHandleCompareObjectHandlesGetHandleInformationSetHandleInformation 兼容。它拥有对其 Vulkan 信号量对象表示的底层同步原语的引用。

  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT 指定一个全局共享句柄,该句柄在 Vulkan 和其他兼容 API 之外的有效用途有限。它与任何本机 API 都不兼容。它不拥有对其 Vulkan 信号量对象表示的底层同步原语的引用,因此当与其关联的所有 Vulkan 信号量对象都被销毁时,它将失效。

  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT 指定一个由 ID3D12Device::CreateSharedHandle 返回的 NT 句柄,该句柄引用 Direct3D 12 栅栏,或者由 ID3D11Device5::CreateFence 返回的 NT 句柄,该句柄引用 Direct3D 11 栅栏。它拥有对其 Direct3D 栅栏关联的底层同步原语的引用。

  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BITVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT 的别名,含义相同。它提供了与 D3D11 栅栏交互时的便利性和代码清晰度。

  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT 指定一个指向 Linux 同步文件或 Android 栅栏对象的 POSIX 文件描述符句柄。它可以与任何接受有效的同步文件或栅栏作为输入的本机 API 一起使用。它拥有对其与文件描述符关联的底层同步原语的引用。支持导入此句柄类型的实现必须接受其运行的本机系统支持的任何类型的同步或栅栏 FD。

  • VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA 指定一个指向 Zircon 事件对象的句柄。它可以与任何接受 Zircon 事件句柄的本机 API 一起使用。Zircon 事件句柄使用 ZX_RIGHTS_BASICZX_RIGHTS_SIGNAL 权限创建。Fuchsia 上的 Vulkan 在发出信号或等待时仅使用 ZX_EVENT_SIGNALED 位。

实现生成的 VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT 类型的句柄可能表示 Linux Sync Files 或 Android Fences,具体由实现决定。应用程序应该仅使用为这两种文件描述符类型定义的操作,除非它们通过 Vulkan 外部的方式知道文件描述符的类型,或者准备好处理因使用错误类型而导致的系统定义的操作失败。

某些外部信号量句柄类型只能在同一个底层物理设备和/或同一个驱动程序版本中共享,如下表定义

表 2. 外部信号量句柄类型兼容性

句柄类型

VkPhysicalDeviceIDProperties::driverUUID

VkPhysicalDeviceIDProperties::deviceUUID

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT

必须匹配

必须匹配

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT

必须匹配

必须匹配

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT

必须匹配

必须匹配

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT

必须匹配

必须匹配

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT

无限制

无限制

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA

无限制

无限制

// Provided by VK_VERSION_1_1
typedef VkFlags VkExternalSemaphoreHandleTypeFlags;

或等效的:

// Provided by VK_KHR_external_semaphore_capabilities
typedef VkExternalSemaphoreHandleTypeFlags VkExternalSemaphoreHandleTypeFlagsKHR;

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

VkExternalSemaphoreProperties 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkExternalSemaphoreProperties {
    VkStructureType                       sType;
    void*                                 pNext;
    VkExternalSemaphoreHandleTypeFlags    exportFromImportedHandleTypes;
    VkExternalSemaphoreHandleTypeFlags    compatibleHandleTypes;
    VkExternalSemaphoreFeatureFlags       externalSemaphoreFeatures;
} VkExternalSemaphoreProperties;

或等效的:

// Provided by VK_KHR_external_semaphore_capabilities
typedef VkExternalSemaphoreProperties VkExternalSemaphorePropertiesKHR;

如果实现不支持 handleType,则 VkExternalSemaphoreProperties::externalSemaphoreFeatures 将为零。

有效使用(隐式)
  • VUID-VkExternalSemaphoreProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES

  • VUID-VkExternalSemaphoreProperties-pNext-pNext
    pNext 必须NULL

可以设置在 VkExternalSemaphoreProperties::externalSemaphoreFeatures 中的位,用于指定外部信号量句柄类型的特性,包括

// Provided by VK_VERSION_1_1
typedef enum VkExternalSemaphoreFeatureFlagBits {
    VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT = 0x00000001,
    VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT = 0x00000002,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT,
  // Provided by VK_KHR_external_semaphore_capabilities
    VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT,
} VkExternalSemaphoreFeatureFlagBits;

或等效的:

// Provided by VK_KHR_external_semaphore_capabilities
typedef VkExternalSemaphoreFeatureFlagBits VkExternalSemaphoreFeatureFlagBitsKHR;
  • VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT 指定此类型的句柄可以从 Vulkan 信号量对象导出。

  • VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT 指定此类型的句柄可以作为 Vulkan 信号量对象导入。

// Provided by VK_VERSION_1_1
typedef VkFlags VkExternalSemaphoreFeatureFlags;

或等效的:

// Provided by VK_KHR_external_semaphore_capabilities
typedef VkExternalSemaphoreFeatureFlags VkExternalSemaphoreFeatureFlagsKHR;

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

可选的栅栏功能

栅栏可能支持将其 有效载荷 导入和导出到外部句柄。要查询栅栏支持的外部句柄类型,请调用

// Provided by VK_VERSION_1_1
void vkGetPhysicalDeviceExternalFenceProperties(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalFenceInfo*    pExternalFenceInfo,
    VkExternalFenceProperties*                  pExternalFenceProperties);

或等效命令:

// Provided by VK_KHR_external_fence_capabilities
void vkGetPhysicalDeviceExternalFencePropertiesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalFenceInfo*    pExternalFenceInfo,
    VkExternalFenceProperties*                  pExternalFenceProperties);
有效使用(隐式)
  • VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter
    pExternalFenceInfo 必须是指向有效 VkPhysicalDeviceExternalFenceInfo 结构的有效指针

  • VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter
    pExternalFenceProperties 必须是指向 VkExternalFenceProperties 结构的有效指针

VkPhysicalDeviceExternalFenceInfo 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkPhysicalDeviceExternalFenceInfo {
    VkStructureType                      sType;
    const void*                          pNext;
    VkExternalFenceHandleTypeFlagBits    handleType;
} VkPhysicalDeviceExternalFenceInfo;

或等效的:

// Provided by VK_KHR_external_fence_capabilities
typedef VkPhysicalDeviceExternalFenceInfo VkPhysicalDeviceExternalFenceInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • handleType 是一个 VkExternalFenceHandleTypeFlagBits 值,指定将返回其功能的外部栅栏句柄类型。

实现生成的 VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT 类型的句柄可能表示 Linux Sync Files 或 Android Fences,具体由实现决定。应用程序应该仅使用为这两种文件描述符类型定义的操作,除非它们通过 Vulkan 外部的方式知道文件描述符的类型,或者准备好处理因使用错误类型而导致的系统定义的操作失败。

有效使用(隐式)
  • VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO

  • VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter
    handleType 必须是一个有效的 VkExternalFenceHandleTypeFlagBits

可以设置在

表示外部栅栏句柄类型,它们是

// Provided by VK_VERSION_1_1
typedef enum VkExternalFenceHandleTypeFlagBits {
    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001,
    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002,
    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,
    VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000008,
  // Provided by VK_KHR_external_fence_capabilities
    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT,
  // Provided by VK_KHR_external_fence_capabilities
    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
  // Provided by VK_KHR_external_fence_capabilities
    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
  // Provided by VK_KHR_external_fence_capabilities
    VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,
} VkExternalFenceHandleTypeFlagBits;

或等效的:

// Provided by VK_KHR_external_fence_capabilities
typedef VkExternalFenceHandleTypeFlagBits VkExternalFenceHandleTypeFlagBitsKHR;
  • VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT 指定一个 POSIX 文件描述符句柄,该句柄在 Vulkan 和其他兼容 API 之外只有有限的有效用法。它必须与 POSIX 系统调用 dupdup2close 和非标准系统调用 dup3 兼容。此外,它必须可以使用 SCM_RIGHTS 控制消息通过套接字传输。它拥有其 Vulkan 栅栏对象表示的底层同步原语的引用。

  • VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT 指定一个 NT 句柄,该句柄在 Vulkan 和其他兼容 API 之外只有有限的有效用法。它必须与函数 DuplicateHandleCloseHandleCompareObjectHandlesGetHandleInformationSetHandleInformation 兼容。它拥有其 Vulkan 栅栏对象表示的底层同步原语的引用。

  • VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT 指定一个全局共享句柄,该句柄在 Vulkan 和其他兼容 API 之外只有有限的有效使用。它与任何原生 API 都不兼容。它不拥有对其 Vulkan 栅栏对象表示的底层同步原语的引用,因此当与其关联的所有 Vulkan 栅栏对象都被销毁时,它将失效。

  • VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT 指定一个 POSIX 文件描述符句柄,指向 Linux Sync File 或 Android Fence。它可以与任何接受有效的同步文件或栅栏作为输入的原生 API 一起使用。它拥有对与文件描述符关联的底层同步原语的引用。支持导入此句柄类型的实现必须接受其运行的原生系统支持的任何类型的同步或栅栏 FD。

某些外部栅栏句柄类型只能在同一个底层物理设备和/或同一个驱动程序版本内共享,如下表定义

表 3. 外部栅栏句柄类型兼容性

句柄类型

VkPhysicalDeviceIDProperties::driverUUID

VkPhysicalDeviceIDProperties::deviceUUID

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT

必须匹配

必须匹配

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT

必须匹配

必须匹配

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT

必须匹配

必须匹配

VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT

无限制

无限制

// Provided by VK_VERSION_1_1
typedef VkFlags VkExternalFenceHandleTypeFlags;

或等效的:

// Provided by VK_KHR_external_fence_capabilities
typedef VkExternalFenceHandleTypeFlags VkExternalFenceHandleTypeFlagsKHR;

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

VkExternalFenceProperties 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkExternalFenceProperties {
    VkStructureType                   sType;
    void*                             pNext;
    VkExternalFenceHandleTypeFlags    exportFromImportedHandleTypes;
    VkExternalFenceHandleTypeFlags    compatibleHandleTypes;
    VkExternalFenceFeatureFlags       externalFenceFeatures;
} VkExternalFenceProperties;

或等效的:

// Provided by VK_KHR_external_fence_capabilities
typedef VkExternalFenceProperties VkExternalFencePropertiesKHR;

如果实现不支持 handleType,则 VkExternalFenceProperties::externalFenceFeatures 将为零。

有效使用(隐式)
  • VUID-VkExternalFenceProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES

  • VUID-VkExternalFenceProperties-pNext-pNext
    pNext 必须NULL

可以在 VkExternalFenceProperties::externalFenceFeatures 中设置的位,指示外部栅栏句柄类型的功能,包括:

// Provided by VK_VERSION_1_1
typedef enum VkExternalFenceFeatureFlagBits {
    VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT = 0x00000001,
    VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT = 0x00000002,
  // Provided by VK_KHR_external_fence_capabilities
    VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT,
  // Provided by VK_KHR_external_fence_capabilities
    VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT,
} VkExternalFenceFeatureFlagBits;

或等效的:

// Provided by VK_KHR_external_fence_capabilities
typedef VkExternalFenceFeatureFlagBits VkExternalFenceFeatureFlagBitsKHR;
  • VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT 指定此类型的句柄可以从 Vulkan 栅栏对象导出。

  • VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT 指定此类型的句柄可以导入到 Vulkan 栅栏对象。

// Provided by VK_VERSION_1_1
typedef VkFlags VkExternalFenceFeatureFlags;

或等效的:

// Provided by VK_KHR_external_fence_capabilities
typedef VkExternalFenceFeatureFlags VkExternalFenceFeatureFlagsKHR;

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

时间戳校准能力

要查询物理设备支持时间戳校准的时间域集合,请调用

// Provided by VK_KHR_calibrated_timestamps
VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsKHR(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pTimeDomainCount,
    VkTimeDomainKHR*                            pTimeDomains);

或等效命令:

// Provided by VK_EXT_calibrated_timestamps
VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pTimeDomainCount,
    VkTimeDomainKHR*                            pTimeDomains);
  • physicalDevice 是要从中查询可校准时间域集合的物理设备。

  • pTimeDomainCount 是一个指向整数的指针,该整数与可用或查询的可校准时间域的数量有关,如下所述。

  • pTimeDomains 要么是 NULL,要么是指向 VkTimeDomainKHR 值数组的指针,指示支持的可校准时间域。

如果 pTimeDomainsNULL,则在 pTimeDomainCount 中返回给定 physicalDevice 支持的可校准时间域的数量。否则,pTimeDomainCount 必须指向应用程序设置为 pTimeDomains 数组中元素数量的变量,并且在返回时,该变量会被实际写入 pTimeDomains 的值数量覆盖。如果 pTimeDomainCount 的值小于支持的可校准时间域的数量,则最多将 pTimeDomainCount 个值写入 pTimeDomains,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的时间域都已返回。

有效使用(隐式)
  • VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsKHR-physicalDevice-parameter
    physicalDevice 必须是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsKHR-pTimeDomainCount-parameter
    pTimeDomainCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsKHR-pTimeDomains-parameter
    如果 pTimeDomainCount 引用的值不为 0,并且 pTimeDomains 不为 NULL,则 pTimeDomains 必须是指向 pTimeDomainCountVkTimeDomainKHR 值数组的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY