资源创建

Vulkan 支持两种主要资源类型:缓冲区图像。资源是具有关联格式和维度的内存视图。缓冲区提供对原始字节数组的访问,而图像可以是多维的,并且可能具有关联的元数据。

其他资源类型,例如 加速结构微型映射 使用缓冲区作为不透明数据结构的后备存储。

缓冲区

缓冲区表示数据的线性数组,通过将它们绑定到图形或计算管线(通过描述符集或某些命令),或直接将它们指定为某些命令的参数,从而用于各种目的。

缓冲区由 VkBuffer 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer)

要创建缓冲区,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateBuffer(
    VkDevice                                    device,
    const VkBufferCreateInfo*                   pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkBuffer*                                   pBuffer);
  • device 是创建缓冲区对象的逻辑设备。

  • pCreateInfo 是指向 VkBufferCreateInfo 结构的指针,该结构包含影响缓冲区创建的参数。

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

  • pBuffer 是指向 VkBuffer 句柄的指针,其中返回生成的缓冲区对象。

有效用法
  • VUID-vkCreateBuffer-device-09664
    device 必须支持至少一个队列族,其中具有 VK_QUEUE_VIDEO_ENCODE_BIT_KHRVK_QUEUE_VIDEO_DECODE_BIT_KHRVK_QUEUE_SPARSE_BINDING_BITVK_QUEUE_TRANSFER_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_GRAPHICS_BIT 功能之一

  • VUID-vkCreateBuffer-flags-00911
    如果 pCreateInfoflags 成员包含 VK_BUFFER_CREATE_SPARSE_BINDING_BIT,并且未启用 extendedSparseAddressSpace 功能,则创建此 VkBuffer 必须 不会导致设备上所有当前有效的稀疏资源所需的总稀疏内存超过 VkPhysicalDeviceLimits::sparseAddressSpaceSize

  • VUID-vkCreateBuffer-flags-09383
    如果 pCreateInfoflags 成员包含 VK_BUFFER_CREATE_SPARSE_BINDING_BIT,并且启用了 extendedSparseAddressSpace 功能,且 pCreateInfousage 成员包含不在 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseBufferUsageFlags 中的位,则创建此 VkBuffer 必须 不会导致设备上所有当前有效的稀疏资源所需的总稀疏内存(不包括使用 pCreateInfousage 成员(其中包含 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseBufferUsageFlags 中的位)创建的 VkBuffer 以及使用 pCreateInfousage 成员(其中包含 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseImageUsageFlags 中的位)创建的 VkImage)超过 VkPhysicalDeviceLimits::sparseAddressSpaceSize

  • VUID-vkCreateBuffer-flags-09384
    如果 pCreateInfoflags 成员包含 VK_BUFFER_CREATE_SPARSE_BINDING_BIT,并且启用了 extendedSparseAddressSpace 功能,则创建此 VkBuffer 必须 不会导致设备上所有当前有效的稀疏资源所需的总稀疏内存超过 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseAddressSpaceSize

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

  • VUID-vkCreateBuffer-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效 VkBufferCreateInfo 结构的有效指针

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

  • VUID-vkCreateBuffer-pBuffer-parameter
    pBuffer 必须 是指向 VkBuffer 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

VkBufferCreateInfo 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkBufferCreateInfo {
    VkStructureType        sType;
    const void*            pNext;
    VkBufferCreateFlags    flags;
    VkDeviceSize           size;
    VkBufferUsageFlags     usage;
    VkSharingMode          sharingMode;
    uint32_t               queueFamilyIndexCount;
    const uint32_t*        pQueueFamilyIndices;
} VkBufferCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkBufferCreateFlagBits 的位掩码,指定缓冲区的附加参数。

  • size 是要创建的缓冲区的大小(以字节为单位)。

  • usage 是一个 VkBufferUsageFlagBits 的位掩码,指定缓冲区的允许用法。

  • sharingMode 是一个 VkSharingMode 值,指定当多个队列族访问缓冲区时缓冲区的共享模式。

  • queueFamilyIndexCountpQueueFamilyIndices 数组中的条目数。

  • pQueueFamilyIndices 是指向将访问此缓冲区的队列族数组的指针。如果 sharingMode 不是 VK_SHARING_MODE_CONCURRENT,则忽略此参数。

如果 pNext 链包含 VkBufferUsageFlags2CreateInfo 结构,则使用该结构的 VkBufferUsageFlags2CreateInfo::usage,而不是此结构的 usage

有效用法
  • VUID-VkBufferCreateInfo-None-09499
    如果 pNext 链不包含 VkBufferUsageFlags2CreateInfo 结构,则 usage 必须VkBufferUsageFlagBits 值的有效组合

  • VUID-VkBufferCreateInfo-None-09500
    如果 pNext 链不包含 VkBufferUsageFlags2CreateInfo 结构,则 usage 必须 不为 0

  • VUID-VkBufferCreateInfo-size-00912
    size 必须 大于 0

  • VUID-VkBufferCreateInfo-sharingMode-00913
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 pQueueFamilyIndices 必须 是指向 queueFamilyIndexCountuint32_t 值数组的有效指针

  • VUID-VkBufferCreateInfo-sharingMode-00914
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 queueFamilyIndexCount 必须 大于 1

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

  • VUID-VkBufferCreateInfo-flags-00915
    如果 sparseBinding 特性未启用,则 flags 必须 不包含 VK_BUFFER_CREATE_SPARSE_BINDING_BIT

  • VUID-VkBufferCreateInfo-flags-00916
    如果 sparseResidencyBuffer 特性未启用,则 flags 必须 不包含 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkBufferCreateInfo-flags-00917
    如果 sparseResidencyAliased 特性未启用,则 flags 必须 不包含 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT

  • VUID-VkBufferCreateInfo-flags-00918
    如果 flags 包含 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BITVK_BUFFER_CREATE_SPARSE_ALIASED_BIT,则它 必须 也包含 VK_BUFFER_CREATE_SPARSE_BINDING_BIT

  • VUID-VkBufferCreateInfo-pNext-00920
    如果 pNext 链包含 VkExternalMemoryBufferCreateInfo 结构,则其 handleTypes 成员 必须 仅包含也在 VkExternalBufferProperties::externalMemoryProperties.compatibleHandleTypes 中的位,由 vkGetPhysicalDeviceExternalBufferProperties 返回,其中 pExternalBufferInfo->handleType 等于 VkExternalMemoryBufferCreateInfo::handleTypes 中指定的任何一个句柄类型

  • VUID-VkBufferCreateInfo-flags-01887
    如果 protectedMemory 特性未启用,则 flags 必须 不包含 VK_BUFFER_CREATE_PROTECTED_BIT

  • VUID-VkBufferCreateInfo-None-01888
    如果设置了任何位 VK_BUFFER_CREATE_SPARSE_BINDING_BITVK_BUFFER_CREATE_SPARSE_RESIDENCY_BITVK_BUFFER_CREATE_SPARSE_ALIASED_BIT,则 VK_BUFFER_CREATE_PROTECTED_BIT 必须 也不能被设置

  • VUID-VkBufferCreateInfo-pNext-01571
    如果 pNext 链包含 VkDedicatedAllocationBufferCreateInfoNV 结构,并且链式结构的 dedicatedAllocation 成员为 VK_TRUE,则 flags 必须 不包含 VK_BUFFER_CREATE_SPARSE_BINDING_BITVK_BUFFER_CREATE_SPARSE_RESIDENCY_BITVK_BUFFER_CREATE_SPARSE_ALIASED_BIT

  • VUID-VkBufferCreateInfo-deviceAddress-02604
    如果 VkBufferDeviceAddressCreateInfoEXT::deviceAddress 不为零,则 flags 必须 包含 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT

  • VUID-VkBufferCreateInfo-opaqueCaptureAddress-03337
    如果 VkBufferOpaqueCaptureAddressCreateInfo::opaqueCaptureAddress 不为零,则 flags 必须 包含 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT

  • VUID-VkBufferCreateInfo-flags-03338
    如果 flags 包含 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,则 必须 启用 bufferDeviceAddressCaptureReplay 特性

  • VUID-VkBufferCreateInfo-usage-04813
    如果 usage 包含 VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHRVK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR,并且 flags 不包含 VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则 pNext必须 包含 VkVideoProfileListInfoKHR 结构,其中 profileCount 大于 0 并且 pProfiles 至少包含一个 VkVideoProfileInfoKHR 结构,该结构具有指定解码操作的 videoCodecOperation 成员

  • VUID-VkBufferCreateInfo-usage-04814
    如果 usage 包含 VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHRVK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR,并且 flags 不包含 VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则 pNext必须 包含一个 VkVideoProfileListInfoKHR 结构体,其中 profileCount 大于 0,并且 pProfiles 包含至少一个 VkVideoProfileInfoKHR 结构体,其 videoCodecOperation 成员指定了一个编码操作。

  • VUID-VkBufferCreateInfo-flags-08325
    如果 flags 包含 VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则 videoMaintenance1 必须 启用。

  • VUID-VkBufferCreateInfo-pNext-10249
    如果 pNext 链包含一个 VkVideoProfileListInfoKHR 结构体,并且对于其 pProfiles 成员的任何元素,videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则 videoEncodeAV1 功能 必须 启用。

  • VUID-VkBufferCreateInfo-size-06409
    size 必须 小于或等于 VkPhysicalDeviceMaintenance4Properties::maxBufferSize

  • VUID-VkBufferCreateInfo-usage-08097
    如果 usage 包含 VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT,则创建此 VkBuffer 不得 导致设备上所有当前有效的使用此标志的缓冲区所需的总空间超过 VkPhysicalDeviceDescriptorBufferPropertiesEXT::samplerDescriptorBufferAddressSpaceSizeVkPhysicalDeviceDescriptorBufferPropertiesEXT::descriptorBufferAddressSpaceSize

  • VUID-VkBufferCreateInfo-usage-08098
    如果 usage 包含 VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,则创建此 VkBuffer 不得 导致设备上所有当前有效的使用此标志的缓冲区所需的总空间超过 VkPhysicalDeviceDescriptorBufferPropertiesEXT::resourceDescriptorBufferAddressSpaceSizeVkPhysicalDeviceDescriptorBufferPropertiesEXT::descriptorBufferAddressSpaceSize

  • VUID-VkBufferCreateInfo-flags-08099
    如果 flags 包含 VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,则 descriptorBufferCaptureReplay 功能 必须 启用。

  • VUID-VkBufferCreateInfo-pNext-08100
    如果 pNext 链包含一个 VkOpaqueCaptureDescriptorDataCreateInfoEXT 结构体,则 flags 必须 包含 VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT

  • VUID-VkBufferCreateInfo-usage-08101
    如果 usage 包含 VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT,则 descriptorBufferPushDescriptors 功能 必须 启用。

  • VUID-VkBufferCreateInfo-usage-08102
    如果 usage 包含 VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT,则 VkPhysicalDeviceDescriptorBufferPropertiesEXT::bufferlessPushDescriptors 必须VK_FALSE

  • VUID-VkBufferCreateInfo-usage-08103
    如果 usage 包含 VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT,则 usage 必须 包含 VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXTVK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT 中的至少一个。

  • VUID-VkBufferCreateInfo-flags-09641
    如果 flags 包含 VK_BUFFER_CREATE_PROTECTED_BIT,则 usage 不得 包含以下任何位:

    • VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT

    • VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT

    • VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT

    • VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR

    • VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR

    • VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR

    • VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT

    • VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT

    • VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT

    • VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT

    • VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT

有效用法(隐式)

VkBufferUsageFlags2CreateInfo 结构体定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkBufferUsageFlags2CreateInfo {
    VkStructureType        sType;
    const void*            pNext;
    VkBufferUsageFlags2    usage;
} VkBufferUsageFlags2CreateInfo;

或等效形式:

// Provided by VK_KHR_maintenance5
typedef VkBufferUsageFlags2CreateInfo VkBufferUsageFlags2CreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • usage 是一个 VkBufferUsageFlagBits2 的位掩码,指定缓冲区的允许用法。

如果此结构包含在缓冲区创建结构的 pNext 链中,则使用 usage 来代替该创建结构中传递的相应 usage 值,从而允许指定额外的使用标志。如果此结构包含在缓冲区查询结构的 pNext 链中,则缓冲区的用法标志将在此结构的 usage 中返回,并且在缓冲区查询结构的 usage 中可表示的用法标志也会在该字段中返回。

有效用法(隐式)
  • VUID-VkBufferUsageFlags2CreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO

  • VUID-VkBufferUsageFlags2CreateInfo-usage-parameter
    usage 必须VkBufferUsageFlagBits2 值的有效组合

  • VUID-VkBufferUsageFlags2CreateInfo-usage-requiredbitmask
    usage 必须 不能为 0

以下是在 VkBufferUsageFlags2CreateInfo::usage可以设置的位,用于指定缓冲区的用途行为:

// Provided by VK_VERSION_1_4
// Flag bits for VkBufferUsageFlagBits2
typedef VkFlags64 VkBufferUsageFlagBits2;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT = 0x00000001ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT = 0x00000002ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000008ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT = 0x00000010ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT = 0x00000020ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT = 0x00000040ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT = 0x00000080ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT = 0x00000100ULL;
// Provided by VK_VERSION_1_4
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT = 0x00020000ULL;
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Provided by VK_AMDX_shader_enqueue with VK_KHR_maintenance5 or VK_VERSION_1_4
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000ULL;
#endif
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000004ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR = 0x00000010ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR = 0x00000020ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR = 0x00000040ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR = 0x00000080ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR = 0x00000100ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_conditional_rendering
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400ULL;
// Provided by VK_KHR_maintenance5 with VK_NV_ray_tracing
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV = 0x00000400ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_transform_feedback
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_transform_feedback
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_decode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_decode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00004000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_encode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_encode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000ULL;
// Provided by VK_KHR_maintenance5 with (VK_VERSION_1_2 or VK_KHR_buffer_device_address) or VK_EXT_buffer_device_address
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR = 0x00020000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_opacity_micromap
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_opacity_micromap
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT = 0x01000000ULL;
// Provided by VK_EXT_device_generated_commands
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT = 0x80000000ULL;

或等效形式:

// Provided by VK_KHR_maintenance5
typedef VkBufferUsageFlagBits2 VkBufferUsageFlagBits2KHR;
  • VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT 指定缓冲区可以用作传输命令的源(参见VK_PIPELINE_STAGE_TRANSFER_BIT的定义)。

  • VK_BUFFER_USAGE_2_TRANSFER_DST_BIT 指定缓冲区可以用作传输命令的目标。

  • VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT 指定缓冲区可以用于创建适用于占用类型为 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFERVkDescriptorSet 插槽的 VkBufferView

  • VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT 指定缓冲区可以用于创建适用于占用类型为 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFERVkDescriptorSet 插槽的 VkBufferView

  • VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT 指定缓冲区可以VkDescriptorBufferInfo 中使用,适用于占用类型为 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFERVK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMICVkDescriptorSet 插槽。

  • VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT 指定缓冲区可以VkDescriptorBufferInfo 中使用,适用于占用类型为 VK_DESCRIPTOR_TYPE_STORAGE_BUFFERVK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMICVkDescriptorSet 插槽。

  • VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT 指定缓冲区适用于作为 buffer 参数传递给 vkCmdBindIndexBuffer2vkCmdBindIndexBuffer

  • VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT 指定缓冲区适用于作为 pBuffers 数组的元素传递给 vkCmdBindVertexBuffers

  • VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT 指定缓冲区适用于作为 buffer 参数传递给 vkCmdDrawIndirect, vkCmdDrawIndexedIndirect, vkCmdDrawMeshTasksIndirectNV, vkCmdDrawMeshTasksIndirectCountNV, vkCmdDrawMeshTasksIndirectEXT, vkCmdDrawMeshTasksIndirectCountEXT, vkCmdDrawClusterIndirectHUAWEI, 或 vkCmdDispatchIndirect。它也适用于作为 VkIndirectCommandsStreamNVbuffer 成员,或者 VkGeneratedCommandsInfoNVsequencesCountBuffersequencesIndexBufferpreprocessedBuffer 成员。它也适用于作为 VkGeneratedCommandsInfoEXTpreprocessAddresssequenceCountAddress 成员的底层缓冲区。

  • VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT 指定缓冲区适用于作为 buffer 参数传递给 vkCmdBeginConditionalRenderingEXT

  • VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT 指定缓冲区适用于使用 vkCmdBindTransformFeedbackBuffersEXT 绑定为变换反馈缓冲区。

  • VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT 指定缓冲区适用于使用 vkCmdBeginTransformFeedbackEXTvkCmdEndTransformFeedbackEXT 作为计数器缓冲区。

  • VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT 指定缓冲区在绑定为描述符缓冲区时适合包含采样器和组合图像采样器描述符。包含组合图像采样器描述符的缓冲区必须也指定 VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT

  • VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT 指定缓冲区在绑定为描述符缓冲区时适合包含资源描述符。

  • VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT 指定绑定后,实现可以使用该缓冲区在使用描述符缓冲区时支持推送描述符。

  • VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV 指定缓冲区适用于在 vkCmdTraceRaysNV 中使用。

  • VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR 指定缓冲区适用于作为着色器绑定表使用。

  • VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR 指定缓冲区适用于作为加速结构构建的只读输入。

  • VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR 指定缓冲区适用于作为 VkAccelerationStructureKHR 的存储空间。

  • VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT 指定缓冲区可以用于通过 vkGetBufferDeviceAddress 获取缓冲区设备地址,并使用该地址从着色器访问缓冲区的内存。

  • VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR 指定缓冲区可以视频解码操作中用作源视频码流缓冲区。

  • VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR 保留供将来使用。

  • VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR 指定缓冲区可以视频编码操作中用作目标视频码流缓冲区。

  • VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR 保留供将来使用。

  • VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX 指定缓冲区可以用作执行图调度的临时内存。

  • VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT 指定缓冲区可以用作设备生成命令的预处理缓冲区。

// Provided by VK_VERSION_1_4
typedef VkFlags64 VkBufferUsageFlags2;

或等效形式:

// Provided by VK_KHR_maintenance5
typedef VkBufferUsageFlags2 VkBufferUsageFlags2KHR;

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

以下是在 VkBufferCreateInfo::usage可以设置的位,用于指定缓冲区的用途行为:

// Provided by VK_VERSION_1_0
typedef enum VkBufferUsageFlagBits {
    VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 0x00000001,
    VK_BUFFER_USAGE_TRANSFER_DST_BIT = 0x00000002,
    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004,
    VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0x00000008,
    VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0x00000010,
    VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0x00000020,
    VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,
    VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,
    VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,
  // Provided by VK_VERSION_1_2
    VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,
  // Provided by VK_KHR_video_decode_queue
    VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,
  // Provided by VK_KHR_video_decode_queue
    VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,
  // Provided by VK_EXT_transform_feedback
    VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
  // Provided by VK_EXT_transform_feedback
    VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
  // Provided by VK_EXT_conditional_rendering
    VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
#ifdef VK_ENABLE_BETA_EXTENSIONS
  // Provided by VK_AMDX_shader_enqueue
    VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000,
#endif
  // Provided by VK_KHR_acceleration_structure
    VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000,
  // Provided by VK_KHR_acceleration_structure
    VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400,
  // Provided by VK_KHR_video_encode_queue
    VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000,
  // Provided by VK_KHR_video_encode_queue
    VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000,
  // Provided by VK_EXT_descriptor_buffer
    VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000,
  // Provided by VK_EXT_descriptor_buffer
    VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000,
  // Provided by VK_EXT_descriptor_buffer
    VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000,
  // Provided by VK_EXT_opacity_micromap
    VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000,
  // Provided by VK_EXT_opacity_micromap
    VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT = 0x01000000,
  // Provided by VK_NV_ray_tracing
    VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR,
  // Provided by VK_EXT_buffer_device_address
    VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
  // Provided by VK_KHR_buffer_device_address
    VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
} VkBufferUsageFlagBits;
  • VK_BUFFER_USAGE_TRANSFER_SRC_BIT 指定缓冲区可以用作传输命令的源(参见VK_PIPELINE_STAGE_TRANSFER_BIT的定义)。

  • VK_BUFFER_USAGE_TRANSFER_DST_BIT 指定缓冲区可以用作传输命令的目标。

  • VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT 指定此缓冲区可以用于创建 VkBufferView,该 VkBufferView 适用于占用类型为 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFERVkDescriptorSet 插槽。

  • VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT 指定此缓冲区可以用于创建 VkBufferView,该 VkBufferView 适用于占用类型为 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFERVkDescriptorSet 插槽。

  • VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT 指定此缓冲区可以用于 VkDescriptorBufferInfo,该 VkDescriptorBufferInfo 适用于占用类型为 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFERVK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMICVkDescriptorSet 插槽。

  • VK_BUFFER_USAGE_STORAGE_BUFFER_BIT 指定此缓冲区可以用于 VkDescriptorBufferInfo,该 VkDescriptorBufferInfo 适用于占用类型为 VK_DESCRIPTOR_TYPE_STORAGE_BUFFERVK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMICVkDescriptorSet 插槽。

  • VK_BUFFER_USAGE_INDEX_BUFFER_BIT 指定此缓冲区适合作为 buffer 参数传递给 vkCmdBindIndexBuffer2vkCmdBindIndexBuffer

  • VK_BUFFER_USAGE_VERTEX_BUFFER_BIT 指定此缓冲区适合作为 pBuffers 数组的元素传递给 vkCmdBindVertexBuffers

  • VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 指定此缓冲区适合作为 buffer 参数传递给 vkCmdDrawIndirectvkCmdDrawIndexedIndirectvkCmdDrawMeshTasksIndirectNVvkCmdDrawMeshTasksIndirectCountNVvkCmdDrawMeshTasksIndirectEXTvkCmdDrawMeshTasksIndirectCountEXTvkCmdDrawClusterIndirectHUAWEIvkCmdDispatchIndirect。它也适用于作为 VkIndirectCommandsStreamNVbuffer 成员,或 VkGeneratedCommandsInfoNVsequencesCountBuffersequencesIndexBufferpreprocessedBuffer 成员。它还适用于作为 VkGeneratedCommandsInfoEXTpreprocessAddresssequenceCountAddress 成员的底层缓冲区。

  • VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT 指定此缓冲区适合作为 buffer 参数传递给 vkCmdBeginConditionalRenderingEXT

  • VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT 指定此缓冲区适合用于通过 vkCmdBindTransformFeedbackBuffersEXT 绑定为变换反馈缓冲区。

  • VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT 指定此缓冲区适合用于通过 vkCmdBeginTransformFeedbackEXTvkCmdEndTransformFeedbackEXT 作为计数器缓冲区。

  • VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT 指定当绑定为描述符缓冲区时,此缓冲区适合包含采样器和组合图像采样器描述符。包含组合图像采样器描述符的缓冲区必须同时指定 VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT

  • VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT 指定当绑定为描述符缓冲区时,此缓冲区适合包含资源描述符。

  • VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT 指定当绑定时,此缓冲区可以被实现用于在使用描述符缓冲区时支持推送描述符。

  • VK_BUFFER_USAGE_RAY_TRACING_BIT_NV 指定此缓冲区适合在 vkCmdTraceRaysNV 中使用。

  • VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 指定此缓冲区适合用作着色器绑定表

  • VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR 指定此缓冲区适合用作加速结构构建的只读输入。

  • VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR 指定此缓冲区适合作为 VkAccelerationStructureKHR 的存储空间。

  • VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 指定此缓冲区可以用于通过 vkGetBufferDeviceAddress 检索缓冲区设备地址,并使用该地址从着色器访问缓冲区的内存。

  • VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR 指定此缓冲区可以视频解码操作中用作源视频比特流缓冲区。

  • VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR 保留供将来使用。

  • VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR 指定此缓冲区可以视频编码操作中用作目标视频比特流缓冲区。

  • VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR 保留供将来使用。

  • VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX 指定此缓冲区可以用于 执行图调度的临时内存。

// Provided by VK_VERSION_1_0
typedef VkFlags VkBufferUsageFlags;

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

可以在 VkBufferCreateInfo::flags 中设置的位,用于指定缓冲区的其他参数,包括:

// Provided by VK_VERSION_1_0
typedef enum VkBufferCreateFlagBits {
    VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001,
    VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
    VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
  // Provided by VK_VERSION_1_1
    VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008,
  // Provided by VK_VERSION_1_2
    VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000010,
  // Provided by VK_EXT_descriptor_buffer
    VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000020,
  // Provided by VK_KHR_video_maintenance1
    VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00000040,
  // Provided by VK_EXT_buffer_device_address
    VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
  // Provided by VK_KHR_buffer_device_address
    VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
} VkBufferCreateFlagBits;
  • VK_BUFFER_CREATE_SPARSE_BINDING_BIT 指定此缓冲区将使用稀疏内存绑定进行支持。

  • VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 指定此缓冲区可以使用稀疏内存绑定进行部分支持。使用此标志创建的缓冲区必须同时使用 VK_BUFFER_CREATE_SPARSE_BINDING_BIT 标志创建。

  • VK_BUFFER_CREATE_SPARSE_ALIASED_BIT 指定此缓冲区将使用稀疏内存绑定进行支持,其内存范围可能同时支持另一个缓冲区(或同一缓冲区的另一部分)。使用此标志创建的缓冲区必须同时使用 VK_BUFFER_CREATE_SPARSE_BINDING_BIT 标志创建。

  • VK_BUFFER_CREATE_PROTECTED_BIT 指定此缓冲区是一个受保护的缓冲区。

  • VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 指定此缓冲区的地址可以被保存并在后续运行中重用(例如,用于跟踪捕获和重放),有关更多详细信息,请参阅 VkBufferOpaqueCaptureAddressCreateInfo

  • VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 指定当捕获和重放时,此缓冲区可以与描述符缓冲区一起使用(例如,用于跟踪捕获和重放),有关更多详细信息,请参阅 VkOpaqueCaptureDescriptorDataCreateInfoEXT

  • VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR 指定此缓冲区可以视频编码操作中使用,而无需在缓冲区创建时指定将使用此缓冲区的视频配置文件集。

有关设备上支持的稀疏内存功能的详细信息,请参阅 稀疏资源功能物理设备功能

// Provided by VK_VERSION_1_0
typedef VkFlags VkBufferCreateFlags;

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

如果 pNext 链包含 VkDedicatedAllocationBufferCreateInfoNV 结构,那么该结构包含一个启用控制,用于确定缓冲区是否将绑定到专用的内存分配。

VkDedicatedAllocationBufferCreateInfoNV 结构的定义如下:

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

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

  • dedicatedAllocation 指定缓冲区是否将绑定到专用分配。

有效用法(隐式)
  • VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV

要定义一组**可以**用作缓冲区后备存储的外部内存句柄类型,请将 VkExternalMemoryBufferCreateInfo 结构添加到 VkBufferCreateInfo 结构的 pNext 链中。VkExternalMemoryBufferCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkExternalMemoryBufferCreateInfo {
    VkStructureType                    sType;
    const void*                        pNext;
    VkExternalMemoryHandleTypeFlags    handleTypes;
} VkExternalMemoryBufferCreateInfo;

或等效形式:

// Provided by VK_KHR_external_memory
typedef VkExternalMemoryBufferCreateInfo VkExternalMemoryBufferCreateInfoKHR;

如果一个缓冲区将绑定到导出或导入的内存,则必须在创建参数中包含具有非零 handleTypes 字段的 VkExternalMemoryBufferCreateInfo 结构。

  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • handleTypes 是零或 VkExternalMemoryHandleTypeFlagBits 的位掩码,指定一个或多个外部内存句柄类型。

有效用法(隐式)
  • VUID-VkExternalMemoryBufferCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO

  • VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter
    handleTypes 必须VkExternalMemoryHandleTypeFlagBits 值的有效组合。

要为缓冲区请求特定的设备地址,请将 VkBufferOpaqueCaptureAddressCreateInfo 结构添加到 VkBufferCreateInfo 结构的 pNext 链中。VkBufferOpaqueCaptureAddressCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkBufferOpaqueCaptureAddressCreateInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint64_t           opaqueCaptureAddress;
} VkBufferOpaqueCaptureAddressCreateInfo;

或等效形式:

// Provided by VK_KHR_buffer_device_address
typedef VkBufferOpaqueCaptureAddressCreateInfo VkBufferOpaqueCaptureAddressCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • opaqueCaptureAddress 是为缓冲区请求的不透明捕获地址。

如果 opaqueCaptureAddress 为零,则不请求特定地址。

如果 opaqueCaptureAddress 不为零,则它**应该**是从同一实现上以相同方式创建的缓冲区的 vkGetBufferOpaqueCaptureAddress 获取的地址。

如果不存在此结构,则相当于 opaqueCaptureAddress 为零。

应用程序**应该**避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的缓冲区,以减少 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS 错误的发生。

此功能的预期用途是,跟踪捕获/重放工具会将 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 标志添加到所有使用 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 的缓冲区,并在捕获期间将查询到的不透明设备地址保存在跟踪中。在重放期间,将创建指定原始地址的缓冲区,以便存储在跟踪数据中的任何地址值都保持有效。

实现预期会将此类缓冲区在 GPU 地址空间中分隔开,以便正常分配避免使用这些地址。应用程序和工具应避免混合使用为使用 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 创建的缓冲区提供的应用程序地址和实现提供的地址,以避免地址空间分配冲突。

有效用法(隐式)
  • VUID-VkBufferOpaqueCaptureAddressCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO

或者,要为缓冲区请求特定的设备地址,请将 VkBufferDeviceAddressCreateInfoEXT 结构添加到 VkBufferCreateInfo 结构的 pNext 链中。VkBufferDeviceAddressCreateInfoEXT 结构定义如下:

// Provided by VK_EXT_buffer_device_address
typedef struct VkBufferDeviceAddressCreateInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkDeviceAddress    deviceAddress;
} VkBufferDeviceAddressCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • deviceAddress 是为缓冲区请求的设备地址。

如果 deviceAddress 为零,则不请求特定地址。

如果 deviceAddress 不为零,则它**必须**是从同一实现上以相同方式创建的缓冲区检索的地址。该缓冲区**必须**还绑定到以相同方式创建的 VkDeviceMemory 对象。

如果不存在此结构,则相当于 deviceAddress 为零。

应用程序**应该**避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的缓冲区,以减少 VK_ERROR_INVALID_DEVICE_ADDRESS_EXT 错误的发生。

有效用法(隐式)
  • VUID-VkBufferDeviceAddressCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT

VkBufferCollectionBufferCreateInfoFUCHSIA 结构定义如下:

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionBufferCreateInfoFUCHSIA {
    VkStructureType              sType;
    const void*                  pNext;
    VkBufferCollectionFUCHSIA    collection;
    uint32_t                     index;
} VkBufferCollectionBufferCreateInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • collectionVkBufferCollectionFUCHSIA 句柄

  • index 是从中导入内存的缓冲区集合中缓冲区的索引

有效用法
有效用法(隐式)
  • VUID-VkBufferCollectionBufferCreateInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA

  • VUID-VkBufferCollectionBufferCreateInfoFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

要销毁缓冲区,请调用

// Provided by VK_VERSION_1_0
void vkDestroyBuffer(
    VkDevice                                    device,
    VkBuffer                                    buffer,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁缓冲区的逻辑设备。

  • buffer 是要销毁的缓冲区。

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

有效用法
  • VUID-vkDestroyBuffer-buffer-00922
    所有引用 buffer 的已提交命令,无论是直接引用还是通过 VkBufferView 引用,**必须**已完成执行

  • VUID-vkDestroyBuffer-buffer-00923
    如果创建 buffer 时提供了 VkAllocationCallbacks,则此处**必须**提供一组兼容的回调

  • VUID-vkDestroyBuffer-buffer-00924
    如果在创建 buffer 时未提供 VkAllocationCallbacks,则 pAllocator **必须**为 NULL

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

  • VUID-vkDestroyBuffer-buffer-parameter
    如果 buffer 不是 VK_NULL_HANDLE,则 buffer **必须**是有效的 VkBuffer 句柄

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

  • VUID-vkDestroyBuffer-buffer-parent
    如果 buffer 是有效句柄,则它**必须**已从 device 创建、分配或检索

主机同步
  • buffer 的主机访问**必须**进行外部同步

缓冲区视图

缓冲区视图 表示缓冲区的连续范围以及用于解释数据的特定格式。缓冲区视图用于使着色器能够使用 图像操作访问缓冲区内容。为了创建有效的缓冲区视图,必须使用以下至少一个使用标志创建缓冲区

  • VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT

  • VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT

缓冲区视图由 VkBufferView 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView)

要创建缓冲区视图,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateBufferView(
    VkDevice                                    device,
    const VkBufferViewCreateInfo*               pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkBufferView*                               pView);
  • device 是创建缓冲区视图的逻辑设备。

  • pCreateInfo 是一个指向 VkBufferViewCreateInfo 结构的指针,该结构包含用于创建缓冲区视图的参数。

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

  • pView 是一个指向 VkBufferView 句柄的指针,其中返回生成的缓冲区视图对象。

有效用法
  • VUID-vkCreateBufferView-device-09665
    device 必须至少支持一个具有 VK_QUEUE_COMPUTE_BITVK_QUEUE_GRAPHICS_BIT 功能的队列族

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

  • VUID-vkCreateBufferView-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkBufferViewCreateInfo 结构的有效指针

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

  • VUID-vkCreateBufferView-pView-parameter
    pView 必须是指向 VkBufferView 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkBufferViewCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkBufferViewCreateInfo {
    VkStructureType            sType;
    const void*                pNext;
    VkBufferViewCreateFlags    flags;
    VkBuffer                   buffer;
    VkFormat                   format;
    VkDeviceSize               offset;
    VkDeviceSize               range;
} VkBufferViewCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 保留供将来使用。

  • buffer 是将在其上创建视图的 VkBuffer

  • format 是一个 VkFormat,描述缓冲区中数据元素的格式。

  • offset 是从缓冲区基址开始的字节偏移量。着色器对缓冲区视图的访问使用相对于此起始偏移量的寻址方式。

  • range 是缓冲区视图的大小(以字节为单位)。如果 range 等于 VK_WHOLE_SIZE,则使用从 offset 到缓冲区末尾的范围。如果使用了 VK_WHOLE_SIZE 并且缓冲区的剩余大小不是 format纹素块大小的倍数,则使用最接近的较小倍数。

缓冲区视图具有缓冲区视图用途,用于标识可以从中创建哪些描述符类型。此用途可以通过在 pNext 链中包含 VkBufferUsageFlags2CreateInfo 结构并在其中指定 usage 值来定义。如果未包含此结构,则它等于用于创建 bufferVkBufferCreateInfo::usage 值。

有效用法
  • VUID-VkBufferViewCreateInfo-offset-00925
    offset 必须小于 buffer 的大小

  • VUID-VkBufferViewCreateInfo-range-00928
    如果 range 不等于 VK_WHOLE_SIZE,则 range 必须大于 0

  • VUID-VkBufferViewCreateInfo-range-00929
    如果 range 不等于 VK_WHOLE_SIZE,则 range 必须format 的纹素块大小的整数倍

  • VUID-VkBufferViewCreateInfo-range-00930
    如果 range 不等于 VK_WHOLE_SIZE,则由 (⌊range / (纹素块大小)⌋ × (每个块的纹素数)) 给出的纹素缓冲区元素数,其中纹素块大小和每个块的纹素数在 兼容格式表中为 format 定义,必须小于或等于 VkPhysicalDeviceLimits::maxTexelBufferElements

  • VUID-VkBufferViewCreateInfo-offset-00931
    如果 range 不等于 VK_WHOLE_SIZE,则 offsetrange 之和必须小于或等于 buffer 的大小

  • VUID-VkBufferViewCreateInfo-range-04059
    如果 range 等于 VK_WHOLE_SIZE,则由 (⌊(size - offset) / (纹素块大小)⌋ × (每个块的纹素数)) 给出的纹素缓冲区元素数,其中 size 是 buffer 的大小,纹素块大小和每个块的纹素数在 兼容格式表中为 format 定义,必须小于或等于 VkPhysicalDeviceLimits::maxTexelBufferElements

  • VUID-VkBufferViewCreateInfo-buffer-00932
    创建 buffer 时,其 usage必须至少包含 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BITVK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT 中的一个

  • VUID-VkBufferViewCreateInfo-format-08778
    如果缓冲区视图用途包含 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,则 format格式特性必须包含 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT

  • VUID-VkBufferViewCreateInfo-format-08779
    如果缓冲区视图用途包含 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,则 format格式特性必须包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT

  • VUID-VkBufferViewCreateInfo-buffer-00935
    如果 buffer 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkBufferViewCreateInfo-offset-02749
    如果未启用texelBufferAlignment功能,则 offset 必须VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment 的倍数

  • VUID-VkBufferViewCreateInfo-buffer-02750
    如果启用了 texelBufferAlignment 特性,并且如果 buffer 是使用包含 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BITusage 创建的,则 offset 必须VkPhysicalDeviceTexelBufferAlignmentProperties::storageTexelBufferOffsetAlignmentBytes 或,如果 VkPhysicalDeviceTexelBufferAlignmentProperties::storageTexelBufferOffsetSingleTexelAlignmentVK_TRUE,则为所请求 format 的纹素大小的较小值的倍数。如果纹素的大小是三个字节的倍数,则改为使用 format 的单个组件的大小。

  • VUID-VkBufferViewCreateInfo-buffer-02751
    如果启用了 texelBufferAlignment 特性,并且如果 buffer 是使用包含 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BITusage 创建的,则 offset 必须VkPhysicalDeviceTexelBufferAlignmentProperties::uniformTexelBufferOffsetAlignmentBytes 或,如果 VkPhysicalDeviceTexelBufferAlignmentProperties::uniformTexelBufferOffsetSingleTexelAlignmentVK_TRUE,则为所请求 format 的纹素大小的较小值的倍数。如果纹素的大小是三个字节的倍数,则改为使用 format 的单个组件的大小。

  • VUID-VkBufferViewCreateInfo-pNext-06782
    如果 pNext 链包含 VkExportMetalObjectCreateInfoEXT 结构,则其 exportObjectType 成员必须VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT

  • VUID-VkBufferViewCreateInfo-pNext-08780
    如果 pNext 链包含 VkBufferUsageFlags2CreateInfo,则其 usage 必须不包含 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BITVK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT 之外的任何其他位。

  • VUID-VkBufferViewCreateInfo-pNext-08781
    如果 pNext 链包含 VkBufferUsageFlags2CreateInfo,则其 usage 必须是创建 buffer 时指定的 VkBufferCreateInfo::usageVkBufferCreateInfo::pNext 中的 VkBufferUsageFlags2CreateInfo::usage 的子集。

有效用法(隐式)
  • VUID-VkBufferViewCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO

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

  • VUID-VkBufferViewCreateInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的,类型为 VkExportMetalObjectCreateInfoEXT 的结构除外。

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

  • VUID-VkBufferViewCreateInfo-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkBufferViewCreateInfo-format-parameter
    format 必须是有效的 VkFormat 值。

// Provided by VK_VERSION_1_0
typedef VkFlags VkBufferViewCreateFlags;

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

要销毁缓冲区视图,请调用

// Provided by VK_VERSION_1_0
void vkDestroyBufferView(
    VkDevice                                    device,
    VkBufferView                                bufferView,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁缓冲区视图的逻辑设备。

  • bufferView 是要销毁的缓冲区视图。

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

有效用法
  • VUID-vkDestroyBufferView-bufferView-00936
    所有引用 bufferView 的已提交命令必须已完成执行。

  • VUID-vkDestroyBufferView-bufferView-00937
    如果在创建 bufferView 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调。

  • VUID-vkDestroyBufferView-bufferView-00938
    如果在创建 bufferView 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyBufferView-bufferView-parameter
    如果 bufferView 不是 VK_NULL_HANDLE,则 bufferView 必须是有效的 VkBufferView 句柄。

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

  • VUID-vkDestroyBufferView-bufferView-parent
    如果 bufferView 是有效句柄,则它必须是从 device 创建、分配或检索的。

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

缓冲区视图格式特性

VkBufferView 的有效使用可能取决于缓冲区视图的格式特性,如下定义。此类约束在受影响的有效使用声明中进行了说明。

图像

图像表示多维(最多 3 个)数据数组,这些数组可以用于各种目的(例如,附件、纹理),通过将它们通过描述符集绑定到图形或计算管线,或者通过直接将它们指定为某些命令的参数来使用。

图像由 VkImage 句柄表示。

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)

要创建图像,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateImage(
    VkDevice                                    device,
    const VkImageCreateInfo*                    pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkImage*                                    pImage);
  • device 是创建图像的逻辑设备。

  • pCreateInfo 是指向 VkImageCreateInfo 结构的指针,其中包含用于创建图像的参数。

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

  • pImage 是指向 VkImage 句柄的指针,其中返回生成的图像对象。

有效用法
  • VUID-vkCreateImage-device-09666
    device 必须支持至少一个队列族,该队列族具有 VK_QUEUE_VIDEO_ENCODE_BIT_KHRVK_QUEUE_VIDEO_DECODE_BIT_KHRVK_QUEUE_OPTICAL_FLOW_BIT_NVVK_QUEUE_SPARSE_BINDING_BITVK_QUEUE_TRANSFER_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_GRAPHICS_BIT 功能之一。

  • VUID-vkCreateImage-flags-00939
    如果 pCreateInfoflags 成员包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT,并且extendedSparseAddressSpace 功能未启用,则创建此 VkImage 必须 不能导致设备上所有当前有效的稀疏资源的所需稀疏内存总量超过 VkPhysicalDeviceLimits::sparseAddressSpaceSize

  • VUID-vkCreateImage-flags-09385
    如果 pCreateInfoflags 成员包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT,并且启用了extendedSparseAddressSpace 功能,并且 pCreateInfousage 成员包含的位不在 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseImageUsageFlags 中,则创建此 VkImage 必须 不能导致设备上所有当前有效的稀疏资源的所需稀疏内存总量,不包括使用 pCreateInfousage 成员中包含 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseBufferUsageFlags 中的位创建的 VkBuffer,以及使用 pCreateInfousage 成员中包含 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseImageUsageFlags 中的位创建的 VkImage,超过 VkPhysicalDeviceLimits::sparseAddressSpaceSize

  • VUID-vkCreateImage-flags-09386
    如果 pCreateInfoflags 成员包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT 并且启用了extendedSparseAddressSpace 功能,则创建此 VkImage 必须 不能导致设备上所有当前有效的稀疏资源的所需稀疏内存总量超过 VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV::extendedSparseAddressSpaceSize

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

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

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

  • VUID-vkCreateImage-pImage-parameter
    pImage 必须 是指向 VkImage 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_COMPRESSION_EXHAUSTED_EXT

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

VkImageCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkImageCreateInfo {
    VkStructureType          sType;
    const void*              pNext;
    VkImageCreateFlags       flags;
    VkImageType              imageType;
    VkFormat                 format;
    VkExtent3D               extent;
    uint32_t                 mipLevels;
    uint32_t                 arrayLayers;
    VkSampleCountFlagBits    samples;
    VkImageTiling            tiling;
    VkImageUsageFlags        usage;
    VkSharingMode            sharingMode;
    uint32_t                 queueFamilyIndexCount;
    const uint32_t*          pQueueFamilyIndices;
    VkImageLayout            initialLayout;
} VkImageCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkImageCreateFlagBits 的位掩码,描述了图像的附加参数。

  • imageType 是一个 VkImageType 值,指定图像的基本维度。数组纹理中的图层不计为图像类型的维度。

  • format 是一个 VkFormat,描述图像中包含的纹素块的格式和类型。

  • extent 是一个 VkExtent3D,描述基本级别每个维度中的数据元素数量。

  • mipLevels 描述了可用于图像缩小采样的细节级别数。

  • arrayLayers 是图像中的图层数。

  • samples 是一个 VkSampleCountFlagBits 值,指定每个纹素的采样数

  • tiling 是一个 VkImageTiling 值,指定内存中纹素块的平铺排列。

  • usage 是一个 VkImageUsageFlagBits 的位掩码,描述图像的预期用途。

  • sharingMode 是一个 VkSharingMode 值,指定当多个队列族访问图像时图像的共享模式。

  • queueFamilyIndexCountpQueueFamilyIndices 数组中的条目数。

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

  • initialLayout 是一个 VkImageLayout 值,指定图像的所有图像子资源的初始 VkImageLayout。请参见图像布局

与使用 tiling 等于 VK_IMAGE_TILING_OPTIMAL 创建的图像相比,使用 tiling 等于 VK_IMAGE_TILING_LINEAR 创建的图像对其限制和功能有更多的限制。除非其他参数满足所有约束,否则 可能 不支持使用平铺 VK_IMAGE_TILING_LINEAR 创建图像。

  • imageTypeVK_IMAGE_TYPE_2D

  • format 不是深度/模板格式。

  • mipLevels 为 1。

  • arrayLayers 为 1。

  • samplesVK_SAMPLE_COUNT_1_BIT

  • usage 仅包括 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 和/或 VK_IMAGE_USAGE_TRANSFER_DST_BIT

与使用其他格式创建的图像相比,使用需要采样器 Y′CBCR 转换的格式之一创建的图像,对其限制和功能有更多的限制。除非其他参数满足所有约束,否则 可能 不支持使用需要 Y′CBCR 转换的格式创建图像。

实现 可能 支持超出上述列出的其他限制和功能。

要确定给定格式的有效 usage 位集合,请调用 vkGetPhysicalDeviceFormatProperties

如果生成的图像的大小将超过 maxResourceSize,则 vkCreateImage 必须 失败并返回 VK_ERROR_OUT_OF_DEVICE_MEMORY。即使所有图像创建参数都满足其有效使用要求,也 可能 发生此失败。

如果在 VkPhysicalDeviceHostImageCopyProperties::identicalMemoryTypeRequirements 中,实现报告 VK_TRUE,则使用 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 必须 不会影响图像的内存类型要求,如 稀疏资源内存要求资源内存关联 中所述。

对于未创建 VK_IMAGE_CREATE_EXTENDED_USAGE_BIT 的图像,如果该格式支持,则 usage 位有效。

对于使用 VK_IMAGE_CREATE_EXTENDED_USAGE_BIT 创建的图像,如果某个 usage 位对于从该图像创建的 VkImageView 可以拥有的至少一种格式支持(详见图像视图),则该位有效。

图像创建限制

某些图像创建参数的有效值受到数值上限或包含在位集中的限制。例如,VkImageCreateInfo::arrayLayers 受限于 imageCreateMaxArrayLayers(定义如下);VkImageCreateInfo::samples 受限于 imageCreateSampleCounts(也定义如下)。

以下定义了几个限制值,以及从中派生限制值的辅助值。限制值在 VkImageCreateInfo 的相关有效用法语句中引用。

有效用法
  • VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251
    以下每个值(如图像创建限制中所述)必须不是未定义imageCreateMaxMipLevelsimageCreateMaxArrayLayersimageCreateMaxExtentimageCreateSampleCounts

  • VUID-VkImageCreateInfo-sharingMode-00941
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 pQueueFamilyIndices 必须 是指向 queueFamilyIndexCountuint32_t 值数组的有效指针

  • VUID-VkImageCreateInfo-sharingMode-00942
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 queueFamilyIndexCount 必须 大于 1

  • VUID-VkImageCreateInfo-sharingMode-01420
    如果 sharingModeVK_SHARING_MODE_CONCURRENT,则 pQueueFamilyIndices 的每个元素必须是唯一的,并且必须小于通过 vkGetPhysicalDeviceQueueFamilyPropertiesvkGetPhysicalDeviceQueueFamilyProperties2 为用于创建 devicephysicalDevice 返回的 pQueueFamilyPropertyCount

  • VUID-VkImageCreateInfo-pNext-01974
    如果 pNext 链包含 VkExternalFormatANDROID 结构,并且其 externalFormat 成员为非零值,则 format 必须VK_FORMAT_UNDEFINED

  • VUID-VkImageCreateInfo-pNext-01975
    如果 pNext 链不包含 VkExternalFormatANDROID 结构体,或者包含但其 externalFormat 成员为 0,则 format 必须 不能是 VK_FORMAT_UNDEFINED

  • VUID-VkImageCreateInfo-extent-00944
    extent.width 必须 大于 0

  • VUID-VkImageCreateInfo-extent-00945
    extent.height 必须 大于 0

  • VUID-VkImageCreateInfo-extent-00946
    extent.depth 必须 大于 0

  • VUID-VkImageCreateInfo-mipLevels-00947
    mipLevels 必须 大于 0

  • VUID-VkImageCreateInfo-arrayLayers-00948
    arrayLayers 必须 大于 0

  • VUID-VkImageCreateInfo-flags-00949
    如果 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-flags-08865
    如果 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,则 extent.widthextent.height 必须 相等。

  • VUID-VkImageCreateInfo-flags-08866
    如果 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,则 arrayLayers 必须 大于或等于 6。

  • VUID-VkImageCreateInfo-flags-02557
    如果 flags 包含 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-flags-00950
    如果 flags 包含 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,则 imageType 必须VK_IMAGE_TYPE_3D

  • VUID-VkImageCreateInfo-flags-09403
    如果 flags 包含 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_ALIASED_BITVK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-flags-07755
    如果 flags 包含 VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT,则 imageType 必须VK_IMAGE_TYPE_3D

  • VUID-VkImageCreateInfo-imageType-10197
    如果 flags 包含 VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_ALIASED_BITVK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-extent-02252
    extent.width 必须 小于或等于 imageCreateMaxExtent.width (定义在 图像创建限制 中)。

  • VUID-VkImageCreateInfo-extent-02253
    extent.height 必须 小于或等于 imageCreateMaxExtent.height (定义在 图像创建限制 中)。

  • VUID-VkImageCreateInfo-extent-02254
    extent.depth 必须 小于或等于 imageCreateMaxExtent.depth (定义在 图像创建限制 中)。

  • VUID-VkImageCreateInfo-imageType-00956
    如果 imageTypeVK_IMAGE_TYPE_1D,则 extent.heightextent.depth 必须 都为 1

  • VUID-VkImageCreateInfo-imageType-00957
    如果 imageTypeVK_IMAGE_TYPE_2D,则 extent.depth 必须1

  • VUID-VkImageCreateInfo-mipLevels-00958
    mipLevels 必须 小于或等于基于 extent.widthextent.heightextent.depth 的完整mipmap链中的层级数。

  • VUID-VkImageCreateInfo-mipLevels-02255
    mipLevels 必须 小于或等于 imageCreateMaxMipLevels (定义在 图像创建限制 中)。

  • VUID-VkImageCreateInfo-arrayLayers-02256
    arrayLayers 必须 小于或等于 imageCreateMaxArrayLayers (定义在 图像创建限制 中)。

  • VUID-VkImageCreateInfo-imageType-00961
    如果 imageTypeVK_IMAGE_TYPE_3D,则 arrayLayers 必须1

  • VUID-VkImageCreateInfo-samples-02257
    如果 samples 不是 VK_SAMPLE_COUNT_1_BIT,则 imageType 必须VK_IMAGE_TYPE_2Dflags 必须 不包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BITmipLevels 必须 等于 1,并且 imageCreateMaybeLinear (定义在 图像创建限制 中) 必须VK_FALSE

  • VUID-VkImageCreateInfo-samples-02558
    如果 samples 不是 VK_SAMPLE_COUNT_1_BIT,则 usage 必须 不包含 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT

  • VUID-VkImageCreateInfo-usage-00963
    如果 usage 包括 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,则除了 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 之外的位 必须 不被设置。

  • VUID-VkImageCreateInfo-usage-00964
    如果 usage 包括 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,则 extent.width 必须 小于或等于 VkPhysicalDeviceLimits::maxFramebufferWidth

  • VUID-VkImageCreateInfo-usage-00965
    如果 usage 包括 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,则 extent.height 必须 小于或等于 VkPhysicalDeviceLimits::maxFramebufferHeight

  • VUID-VkImageCreateInfo-fragmentDensityMapOffset-06514
    If the fragmentDensityMapOffset feature is not enabled and usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, extent.width must be less than or equal to

  • VUID-VkImageCreateInfo-fragmentDensityMapOffset-06515
    If the fragmentDensityMapOffset feature is not enabled and usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, extent.height must be less than or equal to

  • VUID-VkImageCreateInfo-usage-00966
    如果 usage 包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,则 usage 必须 至少包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 中的一个。

  • VUID-VkImageCreateInfo-samples-02258
    samples 必须 是一个有效的 VkSampleCountFlagBits 值,该值在 imageCreateSampleCounts 中设置(定义在 图像创建限制 中)。

  • VUID-VkImageCreateInfo-usage-00968
    如果 shaderStorageImageMultisample 功能未启用,且 usage 包含 VK_IMAGE_USAGE_STORAGE_BIT,则 samples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkImageCreateInfo-flags-00969
    如果 sparseBinding 功能未启用,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT

  • VUID-VkImageCreateInfo-flags-01924
    如果 sparseResidencyAliased 功能未启用,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT

  • VUID-VkImageCreateInfo-tiling-04121
    如果 tilingVK_IMAGE_TILING_LINEAR,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00970
    如果 imageTypeVK_IMAGE_TYPE_1D,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00971
    如果 sparseResidencyImage2D 功能未启用,且 imageTypeVK_IMAGE_TYPE_2D,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00972
    如果 sparseResidencyImage3D 功能未启用,且 imageTypeVK_IMAGE_TYPE_3D,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00973
    如果 sparseResidency2Samples 功能未启用,imageTypeVK_IMAGE_TYPE_2D,且 samplesVK_SAMPLE_COUNT_2_BIT,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00974
    如果 sparseResidency4Samples 功能未启用,imageTypeVK_IMAGE_TYPE_2D,且 samplesVK_SAMPLE_COUNT_4_BIT,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00975
    如果 sparseResidency8Samples 功能未启用,imageTypeVK_IMAGE_TYPE_2D,且 samplesVK_SAMPLE_COUNT_8_BIT,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-imageType-00976
    如果 sparseResidency16Samples 功能未启用,imageTypeVK_IMAGE_TYPE_2D,且 samplesVK_SAMPLE_COUNT_16_BIT,则 flags 必须 不包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • VUID-VkImageCreateInfo-flags-00987
    如果 flags 包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BITVK_IMAGE_CREATE_SPARSE_ALIASED_BIT,则它必须也包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT

  • VUID-VkImageCreateInfo-None-01925
    如果设置了任何位 VK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BITVK_IMAGE_CREATE_SPARSE_ALIASED_BIT,则 必须 也不能设置 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT

  • VUID-VkImageCreateInfo-flags-01890
    如果 protectedMemory 功能未启用,则 flags 必须 不包含 VK_IMAGE_CREATE_PROTECTED_BIT

  • VUID-VkImageCreateInfo-None-01891
    如果设置了任何位 VK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BITVK_IMAGE_CREATE_SPARSE_ALIASED_BIT,则 必须 也不能设置 VK_IMAGE_CREATE_PROTECTED_BIT

  • VUID-VkImageCreateInfo-pNext-00988
    如果 pNext 链包含 VkExternalMemoryImageCreateInfoNV 结构,则它必须不包含 VkExternalMemoryImageCreateInfo 结构。

  • VUID-VkImageCreateInfo-pNext-00990
    如果 pNext 链包含 VkExternalMemoryImageCreateInfo 结构,则其 handleTypes 成员必须仅包含 VkExternalImageFormatProperties::externalMemoryProperties.compatibleHandleTypes 中也存在的位,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回,其中 formatimageTypetilingusageflags 等于此结构中的值,并且 pNext 链中包含 VkPhysicalDeviceExternalImageFormatInfo 结构,其中 handleType 等于 VkExternalMemoryImageCreateInfo::handleTypes 中指定的任何一个句柄类型。

  • VUID-VkImageCreateInfo-pNext-00991
    如果 pNext 链包含 VkExternalMemoryImageCreateInfoNV 结构,则其 handleTypes 成员必须仅包含 VkExternalImageFormatPropertiesNV::externalMemoryProperties.compatibleHandleTypes 中也存在的位,该值由 vkGetPhysicalDeviceExternalImageFormatPropertiesNV 返回,其中 formatimageTypetilingusageflags 等于此结构中的值,并且 externalHandleType 等于 VkExternalMemoryImageCreateInfoNV::handleTypes 中指定的任何一个句柄类型。

  • VUID-VkImageCreateInfo-physicalDeviceCount-01421
    如果逻辑设备是使用 VkDeviceGroupDeviceCreateInfo::physicalDeviceCount 等于 1 创建的,则 flags 必须 不包含 VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT

  • VUID-VkImageCreateInfo-flags-02259
    如果 flags 包含 VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT,则 mipLevels 必须 为 1,arrayLayers 必须 为 1,imageType 必须VK_IMAGE_TYPE_2D,且 imageCreateMaybeLinear(定义在 图像创建限制 中)必须VK_FALSE

  • VUID-VkImageCreateInfo-flags-01572
    如果 flags 包含 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,则 format 必须 是一个 压缩图像格式

  • VUID-VkImageCreateInfo-flags-01573
    如果 flags 包含 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,则 flags 必须同时包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT

  • VUID-VkImageCreateInfo-initialLayout-00993
    initialLayout 必须VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkImageCreateInfo-pNext-01443
    如果 pNext 链包含一个 VkExternalMemoryImageCreateInfoVkExternalMemoryImageCreateInfoNV 结构,且其 handleTypes 成员不为 0,则 initialLayout 必须VK_IMAGE_LAYOUT_UNDEFINED

  • VUID-VkImageCreateInfo-format-06410
    如果图像 format需要采样器 Y′CBCR 转换的格式之一,则 mipLevels 必须为 1

  • VUID-VkImageCreateInfo-format-06411
    如果图像 format需要采样器 Y′CBCR 转换的格式之一,则 samples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkImageCreateInfo-format-06412
    如果图像 format需要采样器 Y′CBCR 转换的格式之一,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260
    如果 format 是一个多平面格式,并且如果 imageCreateFormatFeatures(如 图像创建限制 中所定义)不包含 VK_FORMAT_FEATURE_DISJOINT_BIT,则 flags 必须不包含 VK_IMAGE_CREATE_DISJOINT_BIT

  • VUID-VkImageCreateInfo-format-01577
    如果 format 不是多平面格式,并且 flags 不包含 VK_IMAGE_CREATE_ALIAS_BIT,则 flags 必须不包含 VK_IMAGE_CREATE_DISJOINT_BIT

  • VUID-VkImageCreateInfo-format-04712
    如果 format 具有 _422_420 后缀,则 extent.width 必须是 2 的倍数

  • VUID-VkImageCreateInfo-format-04713
    如果 format 具有 _420 后缀,则 extent.height 必须是 2 的倍数

  • VUID-VkImageCreateInfo-format-09583
    如果 formatVK_FORMAT_PVTRC1_*_IMG 格式之一,则 extent.width 必须是 2 的幂

  • VUID-VkImageCreateInfo-format-09584
    如果 formatVK_FORMAT_PVTRC1_*_IMG 格式之一,则 extent.height 必须是 2 的幂

  • VUID-VkImageCreateInfo-tiling-02261
    如果 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 pNext必须恰好包含一个 VkImageDrmFormatModifierListCreateInfoEXTVkImageDrmFormatModifierExplicitCreateInfoEXT 结构

  • VUID-VkImageCreateInfo-pNext-02262
    如果 pNext 链包含一个 VkImageDrmFormatModifierListCreateInfoEXTVkImageDrmFormatModifierExplicitCreateInfoEXT 结构,则 tiling 必须VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT

  • VUID-VkImageCreateInfo-tiling-02353
    如果 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 并且 flags 包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT,则 pNext必须包含一个具有非零 viewFormatCountVkImageFormatListCreateInfo 结构

  • VUID-VkImageCreateInfo-flags-01533
    如果 flags 包含 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT,则 format 必须是深度或深度/模板格式

  • VUID-VkImageCreateInfo-pNext-02393
    如果 pNext 链包含一个 VkExternalMemoryImageCreateInfo 结构,且其 handleTypes 成员包含 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-pNext-02394
    如果 pNext 链包含一个 VkExternalMemoryImageCreateInfo 结构,且其 handleTypes 成员包含 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,则 mipLevels 必须1 或等于基于 extent.widthextent.heightextent.depth 的完整 mipmap 链中的层级数

  • VUID-VkImageCreateInfo-pNext-02396
    如果 pNext 链包含一个 VkExternalFormatANDROID 结构,且其 externalFormat 成员不为 0,则 flags 必须不包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT

  • VUID-VkImageCreateInfo-pNext-02397
    如果 pNext 链包含一个 VkExternalFormatANDROID 结构,且其 externalFormat 成员不为 0,则 usage 必须不包含除 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT 之外的任何用途

  • VUID-VkImageCreateInfo-pNext-09457
    如果 pNext 链包含一个 VkExternalFormatANDROID 结构,且其 externalFormat 成员不为 0,并且 externalFormatResolve 功能未启用,则 usage 必须不包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT

  • VUID-VkImageCreateInfo-pNext-02398
    如果 pNext 链包含一个 VkExternalFormatANDROID 结构,且其 externalFormat 成员不为 0,则 tiling 必须VK_IMAGE_TILING_OPTIMAL

  • VUID-VkImageCreateInfo-pNext-08951
    如果 pNext 链包含一个 VkExternalMemoryImageCreateInfo 结构,且其 handleTypes 成员包含 VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-pNext-08952
    如果 pNext 链包含一个 VkExternalMemoryImageCreateInfo 结构,且其 handleTypes 成员包含 VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX,则 mipLevels 必须1 或等于基于 extent.widthextent.heightextent.depth 的完整 mipmap 链中的层级数

  • VUID-VkImageCreateInfo-pNext-08953
    如果 pNext 链包含一个 VkExternalFormatQNX 结构,且其 externalFormat 成员不为 0,则 flags 必须不包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT

  • VUID-VkImageCreateInfo-pNext-08954
    如果 pNext 链包含一个 VkExternalFormatQNX 结构,且其 externalFormat 成员不为 0,则 usage 必须不包含除 VK_IMAGE_USAGE_SAMPLED_BIT 之外的任何用途

  • VUID-VkImageCreateInfo-pNext-08955
    如果 pNext 链包含一个 VkExternalFormatQNX 结构体,且该结构体的 externalFormat 成员不为 0,则 tiling 必须VK_IMAGE_TILING_OPTIMAL

  • VUID-VkImageCreateInfo-format-02795
    如果 format 是深度/模板格式,usage 包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,并且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,那么它的 VkImageStencilUsageCreateInfo::stencilUsage 成员必须也包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkImageCreateInfo-format-02796
    如果 format 是深度/模板格式,usage 不包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,并且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,那么它的 VkImageStencilUsageCreateInfo::stencilUsage 成员必须也不包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkImageCreateInfo-format-02797
    如果 format 是深度/模板格式,usage 包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,并且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,那么它的 VkImageStencilUsageCreateInfo::stencilUsage 成员必须也包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT

  • VUID-VkImageCreateInfo-format-02798
    如果 format 是深度/模板格式,usage 不包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,并且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,那么它的 VkImageStencilUsageCreateInfo::stencilUsage 成员必须也不包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT

  • VUID-VkImageCreateInfo-Format-02536
    如果 Format 是深度/模板格式,且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,其 stencilUsage 成员包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,则 extent.width 必须小于或等于 VkPhysicalDeviceLimits::maxFramebufferWidth

  • VUID-VkImageCreateInfo-format-02537
    如果 format 是深度/模板格式,且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,其 stencilUsage 成员包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,则 extent.height 必须小于或等于 VkPhysicalDeviceLimits::maxFramebufferHeight

  • VUID-VkImageCreateInfo-format-02538
    如果 shaderStorageImageMultisample 特性未启用,format 是深度/模板格式,且 pNext 链包含一个 VkImageStencilUsageCreateInfo 结构体,其 stencilUsage 包含 VK_IMAGE_USAGE_STORAGE_BIT,则 samples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkImageCreateInfo-flags-02050
    如果 flags 包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV,则 imageType 必须VK_IMAGE_TYPE_2DVK_IMAGE_TYPE_3D

  • VUID-VkImageCreateInfo-flags-02051
    如果 flags 包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV,则它必须不包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,且 format 必须不是深度/模板格式。

  • VUID-VkImageCreateInfo-flags-02052
    如果 flags 包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVimageTypeVK_IMAGE_TYPE_2D,则 extent.widthextent.height 必须大于 1

  • VUID-VkImageCreateInfo-flags-02053
    如果 flags 包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVimageTypeVK_IMAGE_TYPE_3D,则 extent.widthextent.heightextent.depth 必须大于 1

  • VUID-VkImageCreateInfo-imageType-02082
    如果 usage 包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-samples-02083
    如果 usage 包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,则 samples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkImageCreateInfo-shadingRateImage-07727
    如果 shadingRateImage 特性已启用,并且 usage 包含 VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,则 tiling 必须VK_IMAGE_TILING_OPTIMAL

  • VUID-VkImageCreateInfo-flags-02565
    如果 flags 包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,则 tiling 必须VK_IMAGE_TILING_OPTIMAL

  • VUID-VkImageCreateInfo-flags-02566
    如果 flags 包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-flags-02567
    如果 flags 包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,则 flags 必须不包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT

  • VUID-VkImageCreateInfo-flags-02568
    如果 flags 包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,则 mipLevels 必须1

  • VUID-VkImageCreateInfo-usage-04992
    如果 usage 包含 VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI,则 tiling 必须VK_IMAGE_TILING_LINEAR

  • VUID-VkImageCreateInfo-imageView2DOn3DImage-04459
    如果启用了 VK_KHR_portability_subset 扩展,且 VkPhysicalDevicePortabilitySubsetFeaturesKHR::imageView2DOn3DImageVK_FALSE,则 flags 必须不包含 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT

  • VUID-VkImageCreateInfo-multisampleArrayImage-04460
    如果启用了 VK_KHR_portability_subset 扩展,且 VkPhysicalDevicePortabilitySubsetFeaturesKHR::multisampleArrayImageVK_FALSE,并且 samples 不为 VK_SAMPLE_COUNT_1_BIT,则 arrayLayers 必须1

  • VUID-VkImageCreateInfo-pNext-06722
    如果在 pNext 链中包含 VkImageFormatListCreateInfo 结构体,且 format 不是多平面格式,并且 VkImageFormatListCreateInfo::viewFormatCount 不为零,则 VkImageFormatListCreateInfo::pViewFormats 中的每个格式必须兼容性表中描述的 format 兼容,或者,如果 flags 包含 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,则必须是与 format 大小兼容的未压缩格式。

  • VUID-VkImageCreateInfo-pNext-10062
    如果在 pNext 链中包含 VkImageFormatListCreateInfo 结构体,且 format多平面格式,并且 flags 包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BITVkImageFormatListCreateInfo::viewFormatCount 不为零,则 VkImageFormatListCreateInfo::pViewFormats 中的每个格式必须与图像格式的平面的 VkFormat 兼容。

  • VUID-VkImageCreateInfo-flags-04738
    如果 flags 不包含 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 并且 pNext 链包含 VkImageFormatListCreateInfo 结构体,则 VkImageFormatListCreateInfo::viewFormatCount 必须01

  • VUID-VkImageCreateInfo-usage-04815
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHRVK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHRVK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,并且 flags 不包含 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则 pNext必须包含一个 VkVideoProfileListInfoKHR 结构体,其 profileCount 大于 0,并且 pProfiles 至少包含一个 VkVideoProfileInfoKHR 结构体,该结构体的 videoCodecOperation 成员指定解码操作。

  • VUID-VkImageCreateInfo-usage-04816
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,并且 flags 不包含 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则 pNext必须包含一个 VkVideoProfileListInfoKHR 结构体,其 profileCount 大于 0,并且 pProfiles 至少包含一个 VkVideoProfileInfoKHR 结构体,该结构体的 videoCodecOperation 成员指定编码操作。

  • VUID-VkImageCreateInfo-flags-08328
    如果 flags 包含 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则videoMaintenance1必须启用。

  • VUID-VkImageCreateInfo-flags-08329
    如果 flags 包含 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR 并且 usage 不包含 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,则 usage必须不包含 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR

  • VUID-VkImageCreateInfo-flags-08331
    如果 flags 包含 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则 usage必须不包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR

  • VUID-VkImageCreateInfo-pNext-06811
    如果 pNext 链包含一个 VkVideoProfileListInfoKHR 结构体,其 profileCount 大于 0,则 supportedVideoFormat 必须VK_TRUE

  • VUID-VkImageCreateInfo-pNext-10250
    如果 pNext 链包含一个 VkVideoProfileListInfoKHR 结构体,并且对于其 pProfiles 成员的任何元素,videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则 videoEncodeAV1 功能 必须 启用。

  • VUID-VkImageCreateInfo-usage-10251
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 videoEncodeQuantizationMap 功能必须启用。

  • VUID-VkImageCreateInfo-usage-10252
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 imageType 必须VK_IMAGE_TYPE_2D

  • VUID-VkImageCreateInfo-usage-10253
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 samples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkImageCreateInfo-usage-10254
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 pNext必须包含一个 VkVideoProfileListInfoKHR 结构体,其 profileCount 等于 1,并且 pProfiles 指向一个 VkVideoProfileInfoKHR 结构体,该结构体的 videoCodecOperation 成员指定编码操作。

  • VUID-VkImageCreateInfo-usage-10255
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR,则 VkVideoEncodeCapabilitiesKHR::flags 必须包含 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 返回的,对应于 pNext 链中包含的 VkVideoProfileListInfoKHR 结构体的 pProfiles 成员中指定的视频配置文件。

  • VUID-VkImageCreateInfo-usage-10256
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 VkVideoEncodeCapabilitiesKHR::flags 必须包含 VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 返回的,对应于 pNext 链中包含的 VkVideoProfileListInfoKHR 结构体的 pProfiles 成员中指定的视频配置文件。

  • VUID-VkImageCreateInfo-usage-10257
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 extent.width 必须小于或等于 VkVideoEncodeQuantizationMapCapabilitiesKHR::maxQuantizationMapExtent.width,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 返回的,对应于 pNext 链中包含的 VkVideoProfileListInfoKHR 结构体的 pProfiles 成员中指定的视频配置文件。

  • VUID-VkImageCreateInfo-usage-10258
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 extent.height 必须小于或等于 VkVideoEncodeQuantizationMapCapabilitiesKHR::maxQuantizationMapExtent.height,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 返回的,对应于 pNext 链中包含的 VkVideoProfileListInfoKHR 结构体的 pProfiles 成员中指定的视频配置文件。

  • VUID-VkImageCreateInfo-pNext-06390
    如果 VkImage 将用于从 VkBufferCollectionFUCHSIA 导入内存,则必须VkBufferCollectionImageCreateInfoFUCHSIA 结构体链接到 pNext

  • VUID-VkImageCreateInfo-multisampledRenderToSingleSampled-06882
    如果未启用 multisampledRenderToSingleSampled 特性,则 flags 必须不包含 VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT

  • VUID-VkImageCreateInfo-flags-06883
    如果 flags 包含 VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT,则 samples 必须VK_SAMPLE_COUNT_1_BIT

  • VUID-VkImageCreateInfo-pNext-06743
    如果 pNext 链包含 VkImageCompressionControlEXT 结构体,format 是一个 多平面 格式,并且 VkImageCompressionControlEXT::flags 包含 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,那么 VkImageCompressionControlEXT::compressionControlPlaneCount 必须等于 format 中的平面数量。

  • VUID-VkImageCreateInfo-pNext-06744
    如果 pNext 链包含 VkImageCompressionControlEXT 结构体,format 不是一个 多平面 格式,并且 VkImageCompressionControlEXT::flags 包含 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,那么 VkImageCompressionControlEXT::compressionControlPlaneCount 必须为 1。

  • VUID-VkImageCreateInfo-pNext-06746
    如果 pNext 链包含 VkImageCompressionControlEXT 结构体,则它必须不包含 VkImageDrmFormatModifierExplicitCreateInfoEXT 结构体。

  • VUID-VkImageCreateInfo-flags-08104
    如果 flags 包含 VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,则必须启用 descriptorBufferCaptureReplay 特性。

  • VUID-VkImageCreateInfo-pNext-08105
    如果 pNext 链包含 VkOpaqueCaptureDescriptorDataCreateInfoEXT 结构体,则 flags 必须包含 VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT

  • VUID-VkImageCreateInfo-pNext-06783
    如果 pNext 链包含 VkExportMetalObjectCreateInfoEXT 结构体,则其 exportObjectType 成员必须VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXTVK_EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT

  • VUID-VkImageCreateInfo-pNext-06784
    如果 pNext 链包含 VkImportMetalTextureInfoEXT 结构体,则其 plane 成员必须VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BITVK_IMAGE_ASPECT_PLANE_2_BIT

  • VUID-VkImageCreateInfo-pNext-06785
    如果 pNext 链包含 VkImportMetalTextureInfoEXT 结构体,且图像不具有多平面格式,那么 VkImportMetalTextureInfoEXT::plane 必须VK_IMAGE_ASPECT_PLANE_0_BIT

  • VUID-VkImageCreateInfo-pNext-06786
    如果 pNext 链包含 VkImportMetalTextureInfoEXT 结构体,且图像具有仅包含两个平面的多平面格式,那么 VkImportMetalTextureInfoEXT::plane 必须不为 VK_IMAGE_ASPECT_PLANE_2_BIT

  • VUID-VkImageCreateInfo-imageCreateFormatFeatures-09048
    如果 imageCreateFormatFeatures(如 图像创建限制 中定义)不包含 VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT,则 usage 必须不包含 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkImageCreateInfo-usage-10245
    如果 usage 包含 VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT,则必须启用 hostImageCopy 特性。

  • VUID-VkImageCreateInfo-pNext-09653
    如果 pNext 链包含 VkImageAlignmentControlCreateInfoMESA 结构体,则 tiling 必须VK_IMAGE_TILING_OPTIMAL

  • VUID-VkImageCreateInfo-pNext-09654
    如果 pNext 链包含 VkImageAlignmentControlCreateInfoMESA 结构体,则它必须不包含 VkExternalMemoryImageCreateInfo 结构体。

有效用法(隐式)

VkBufferCollectionImageCreateInfoFUCHSIA 结构定义如下:

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionImageCreateInfoFUCHSIA {
    VkStructureType              sType;
    const void*                  pNext;
    VkBufferCollectionFUCHSIA    collection;
    uint32_t                     index;
} VkBufferCollectionImageCreateInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • collectionVkBufferCollectionFUCHSIA 句柄

  • index 是从中导入内存的缓冲区集合中缓冲区的索引

有效用法
有效用法(隐式)
  • VUID-VkBufferCollectionImageCreateInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA

  • VUID-VkBufferCollectionImageCreateInfoFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

VkImageStencilUsageCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkImageStencilUsageCreateInfo {
    VkStructureType      sType;
    const void*          pNext;
    VkImageUsageFlags    stencilUsage;
} VkImageStencilUsageCreateInfo;

或等效形式:

// Provided by VK_EXT_separate_stencil_usage
typedef VkImageStencilUsageCreateInfo VkImageStencilUsageCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • stencilUsage 是一个 VkImageUsageFlagBits 的位掩码,描述图像模板方面的预期用法。

如果 VkImageCreateInfopNext 链包含 VkImageStencilUsageCreateInfo 结构,那么该结构包含深度模板格式图像的模板方面的特定用法标志。

此结构指定仅适用于深度/模板格式图像的模板方面的图像用法。当此结构包含在 VkImageCreateInfopNext 链中时,图像的模板方面必须仅按照 stencilUsage 指定的方式使用。当此结构未包含在 VkImageCreateInfopNext 链中时,图像的模板方面必须仅按照 VkImageCreateInfo::usage 指定的方式使用。图像的其他方面的使用不受此结构的影响。

此结构可以也包含在 VkPhysicalDeviceImageFormatInfo2pNext 链中,以使用 vkGetPhysicalDeviceImageFormatProperties2 查询特定于图像创建参数组合(包括图像模板方面的一组单独的用法标志)的其他功能。当此结构不包含在 VkPhysicalDeviceImageFormatInfo2pNext 链中时,stencilUsage 的隐式值与 VkPhysicalDeviceImageFormatInfo2::usage 的值匹配。

有效用法
  • VUID-VkImageStencilUsageCreateInfo-stencilUsage-02539
    如果 stencilUsage 包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,则它必须不包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 之外的位

有效用法(隐式)
  • VUID-VkImageStencilUsageCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO

  • VUID-VkImageStencilUsageCreateInfo-stencilUsage-parameter
    stencilUsage 必须VkImageUsageFlagBits 值的有效组合

  • VUID-VkImageStencilUsageCreateInfo-stencilUsage-requiredbitmask
    stencilUsage 必须不能为 0

如果 pNext 链包含 VkDedicatedAllocationImageCreateInfoNV 结构,那么该结构包含一个启用标志,用于控制图像是否具有绑定到它的专用内存分配。

VkDedicatedAllocationImageCreateInfoNV 结构定义如下:

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

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

  • dedicatedAllocation 指定图像是否将具有绑定到它的专用分配。

对颜色和深度/模板附件或其他大型图像使用专用分配可能会提高某些设备上的性能。

有效用法
  • VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994
    如果 dedicatedAllocationVK_TRUE,则 VkImageCreateInfo::flags 必须不包含 VK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BITVK_IMAGE_CREATE_SPARSE_ALIASED_BIT

有效用法(隐式)
  • VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV

要定义一组可以用作图像后备存储的外部内存句柄类型,请将 VkExternalMemoryImageCreateInfo 结构添加到 VkImageCreateInfo 结构的 pNext 链中。VkExternalMemoryImageCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkExternalMemoryImageCreateInfo {
    VkStructureType                    sType;
    const void*                        pNext;
    VkExternalMemoryHandleTypeFlags    handleTypes;
} VkExternalMemoryImageCreateInfo;

或等效形式:

// Provided by VK_KHR_external_memory
typedef VkExternalMemoryImageCreateInfo VkExternalMemoryImageCreateInfoKHR;

对于将绑定到已导出或导入的内存的图像,其创建参数中必须包含具有非零 handleTypes 字段的 VkExternalMemoryImageCreateInfo 结构。

  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • handleTypes 是零或 VkExternalMemoryHandleTypeFlagBits 的位掩码,指定一个或多个外部内存句柄类型。

有效用法(隐式)
  • VUID-VkExternalMemoryImageCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO

  • VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter
    handleTypes 必须VkExternalMemoryHandleTypeFlagBits 值的有效组合。

如果 pNext 链包含 VkExternalMemoryImageCreateInfoNV 结构,则该结构定义一组可以用作图像后备存储的外部内存句柄类型。

VkExternalMemoryImageCreateInfoNV 结构定义如下:

// Provided by VK_NV_external_memory
typedef struct VkExternalMemoryImageCreateInfoNV {
    VkStructureType                      sType;
    const void*                          pNext;
    VkExternalMemoryHandleTypeFlagsNV    handleTypes;
} VkExternalMemoryImageCreateInfoNV;
有效用法(隐式)
  • VUID-VkExternalMemoryImageCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV

  • VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter
    handleTypes 必须VkExternalMemoryHandleTypeFlagBitsNV 值的有效组合

VkExternalFormatANDROID 定义如下:

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

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

  • externalFormat 是外部格式的实现定义标识符

当包含在另一个结构的 pNext 链中时,它表示超出 Android 硬件缓冲区的 VkFormat 值所提供的其他格式信息。如果 externalFormat 为零,则表示不使用任何外部格式,并且实现应仅依赖其他格式信息。如果此结构不存在,则等效于将 externalFormat 设置为零。

有效用法
有效用法(隐式)
  • VUID-VkExternalFormatANDROID-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID

要创建一个使用 QNX 屏幕外部格式 的图像,请在 VkImageCreateInfopNext 链中添加一个 VkExternalFormatQNX 结构体。VkExternalFormatQNX 定义如下:

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

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

  • externalFormat 是外部格式的实现定义标识符

如果 externalFormat 为零,则效果等同于不存在 VkExternalFormatQNX 结构体。否则,image 将具有指定的外部格式。

有效用法
有效用法(隐式)
  • VUID-VkExternalFormatQNX-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX

如果 VkImageCreateInfopNext 链包含一个 VkImageSwapchainCreateInfoKHR 结构体,则该结构体包含一个交换链句柄,指示该图像将绑定到该交换链的内存。

VkImageSwapchainCreateInfoKHR 结构体定义如下:

// Provided by VK_VERSION_1_1 with VK_KHR_swapchain, VK_KHR_device_group with VK_KHR_swapchain
typedef struct VkImageSwapchainCreateInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkSwapchainKHR     swapchain;
} VkImageSwapchainCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • swapchainVK_NULL_HANDLE 或图像将绑定到的交换链的句柄。

有效用法
有效用法(隐式)
  • VUID-VkImageSwapchainCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR

  • VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter
    如果 swapchain 不是 VK_NULL_HANDLE,则 swapchain 必须 是有效的 VkSwapchainKHR 句柄。

如果 VkImageCreateInfopNext 链包含一个 VkImageFormatListCreateInfo 结构体,则该结构体包含一个列表,其中列出了创建此图像的视图时可以使用的所有格式。

VkImageFormatListCreateInfo 结构体定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkImageFormatListCreateInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           viewFormatCount;
    const VkFormat*    pViewFormats;
} VkImageFormatListCreateInfo;

或等效形式:

// Provided by VK_KHR_image_format_list
typedef VkImageFormatListCreateInfo VkImageFormatListCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • viewFormatCountpViewFormats 数组中的条目数。

  • pViewFormats 是指向 VkFormat 值数组的指针,指定创建此图像的视图时可以使用的所有格式。

如果 viewFormatCount 为零,则忽略 pViewFormats,并且创建图像时就像 VkImageCreateInfopNext 链中未包含 VkImageFormatListCreateInfo 结构体一样。

有效用法
  • VUID-VkImageFormatListCreateInfo-viewFormatCount-09540
    如果 viewFormatCount 不为 0,则 pViewFormats 的每个元素必须不是 VK_FORMAT_UNDEFINED

有效用法(隐式)
  • VUID-VkImageFormatListCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO

  • VUID-VkImageFormatListCreateInfo-pViewFormats-parameter
    如果 viewFormatCount 不为 0,则 pViewFormats 必须是指向 viewFormatCount 个有效 VkFormat 值数组的有效指针。

如果 VkImageCreateInfopNext 链包含 VkImageDrmFormatModifierListCreateInfoEXT 结构体,则将使用该结构体中列出的 Linux DRM 格式修饰符之一创建图像。修饰符的选择取决于具体实现。

// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkImageDrmFormatModifierListCreateInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           drmFormatModifierCount;
    const uint64_t*    pDrmFormatModifiers;
} VkImageDrmFormatModifierListCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • drmFormatModifierCountpDrmFormatModifiers 数组的长度。

  • pDrmFormatModifiers 是指向 _Linux DRM 格式修饰符_数组的指针。

有效用法
有效用法(隐式)
  • VUID-VkImageDrmFormatModifierListCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT

  • VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-parameter
    pDrmFormatModifiers 必须 是指向 drmFormatModifierCountuint64_t 值数组的有效指针。

  • VUID-VkImageDrmFormatModifierListCreateInfoEXT-drmFormatModifierCount-arraylength
    drmFormatModifierCount 必须 大于 0

如果 VkImageCreateInfopNext 链包含一个 VkImageDrmFormatModifierExplicitCreateInfoEXT 结构体,则将使用该结构体定义的 Linux DRM 格式修饰符和内存布局创建图像。

// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkImageDrmFormatModifierExplicitCreateInfoEXT {
    VkStructureType               sType;
    const void*                   pNext;
    uint64_t                      drmFormatModifier;
    uint32_t                      drmFormatModifierPlaneCount;
    const VkSubresourceLayout*    pPlaneLayouts;
} VkImageDrmFormatModifierExplicitCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • drmFormatModifier 是将用于创建图像的 _Linux DRM 格式修饰符_。

  • drmFormatModifierPlaneCount 是图像中_内存平面_的数量(由 VkDrmFormatModifierPropertiesEXT 报告),也是 pPlaneLayouts 数组的长度。

  • pPlaneLayouts 是指向描述图像_内存平面_的 VkSubresourceLayout 结构体数组的指针。

pPlaneLayouts 的第 i成员描述图像的第 i_内存平面_的布局(即,VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT)。在 pPlaneLayouts 的每个元素中,实现必须忽略 size。实现计算每个平面大小,应用程序可以使用 vkGetImageSubresourceLayout 查询大小。

当使用 VkImageDrmFormatModifierExplicitCreateInfoEXT 创建图像时,应用程序有责任满足所有有效的使用要求。但是,实现必须验证提供的 pPlaneLayouts,当与提供的 drmFormatModifier 以及 VkImageCreateInfo 及其 pNext 链中的其他创建参数组合时,会生成一个有效的图像。(此验证必然是特定于实现的,并且不在 Vulkan 的范围内,因此没有通过有效的使用要求描述)。如果此验证失败,则 vkCreateImage 返回 VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT

有效用法
  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifier-02264
    drmFormatModifier 必须VkImageCreateInfo 及其 pNext 链中的参数兼容,这由查询扩展了 VkPhysicalDeviceImageDrmFormatModifierInfoEXTVkPhysicalDeviceImageFormatInfo2 确定。

  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifierPlaneCount-02265
    drmFormatModifierPlaneCount 必须等于通过查询VkDrmFormatModifierPropertiesListEXT 得到的与VkImageCreateInfo::formatdrmFormatModifier 相关联的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount

  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-size-02267
    对于 pPlaneLayouts 的每个元素,size 必须为 0。

  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-arrayPitch-02268
    对于 pPlaneLayouts 的每个元素,如果 VkImageCreateInfo::arrayLayers 为 1,则 arrayPitch 必须为 0。

  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-depthPitch-02269
    对于 pPlaneLayouts 的每个元素,如果 VkImageCreateInfo::extent.depth 为 1,则 depthPitch 必须为 0。

有效用法(隐式)
  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT

  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-pPlaneLayouts-parameter
    pPlaneLayouts 必须是指向 drmFormatModifierPlaneCountVkSubresourceLayout 结构的有效指针数组。

  • VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifierPlaneCount-arraylength
    drmFormatModifierPlaneCount 必须大于 0

如果 VkImageCreateInfopNext 列表中包含 VkImageCompressionControlEXT 结构,则该结构描述此图像的压缩控制。

VkImageCompressionControlEXT 结构定义如下:

// Provided by VK_EXT_image_compression_control
typedef struct VkImageCompressionControlEXT {
    VkStructureType                         sType;
    const void*                             pNext;
    VkImageCompressionFlagsEXT              flags;
    uint32_t                                compressionControlPlaneCount;
    VkImageCompressionFixedRateFlagsEXT*    pFixedRateFlags;
} VkImageCompressionControlEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkImageCompressionFlagBitsEXT 的位掩码,描述图像的压缩控制。

  • compressionControlPlaneCountpFixedRateFlags 数组中的条目数。

  • pFixedRateFlagsNULL 或指向 VkImageCompressionFixedRateFlagsEXT 位域数组的指针,描述每个图像平面的允许固定速率压缩率。如果 flags 不包含 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,则忽略此字段。

如果启用,固定速率压缩将以实现定义的方式进行,并且可能以块粒度应用。在这种情况下,写入单个纹素可能会修改同一块中其他纹素的值。

有效用法
  • VUID-VkImageCompressionControlEXT-flags-06747
    flags 必须VK_IMAGE_COMPRESSION_DEFAULT_EXTVK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXTVK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXTVK_IMAGE_COMPRESSION_DISABLED_EXT 之一。

  • VUID-VkImageCompressionControlEXT-flags-06748
    如果 flags 包含 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,则 pFixedRateFlags 必须不为 NULL

有效用法(隐式)
  • VUID-VkImageCompressionControlEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT

某些压缩属性的组合可能不受支持。例如,某些实现可能不支持多平面格式的每个平面具有不同的固定速率压缩率,并且如果请求的速率不同,将无法为任何平面启用固定速率压缩。

VkImageCompressionControlEXT::flags 的可能值,指定图像的压缩控制,包括:

// Provided by VK_EXT_image_compression_control
typedef enum VkImageCompressionFlagBitsEXT {
    VK_IMAGE_COMPRESSION_DEFAULT_EXT = 0,
    VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT = 0x00000001,
    VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT = 0x00000002,
    VK_IMAGE_COMPRESSION_DISABLED_EXT = 0x00000004,
} VkImageCompressionFlagBitsEXT;
  • VK_IMAGE_COMPRESSION_DEFAULT_EXT 指定使用默认图像压缩设置。实现必须不应用固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 指定实现可能以实现定义的方式,根据图像的属性选择任何受支持的固定速率压缩设置。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT 指定可能使用固定速率压缩,并且允许的压缩率由 VkImageCompressionControlEXT::pFixedRateFlags 指定。

  • VK_IMAGE_COMPRESSION_DISABLED_EXT 指定应该禁用所有无损和固定速率压缩。

如果 VkImageCompressionControlEXT::flagsVK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,则 pFixedRateFlags 数组的第 ith 个成员指定图像的第 ith 个平面的允许压缩率。

如果 VkImageCompressionControlEXT::flags 中包含 VK_IMAGE_COMPRESSION_DISABLED_EXT,则将禁用无损和固定速率压缩。这可能会对性能产生负面影响,仅用于调试目的。

// Provided by VK_EXT_image_compression_control
typedef VkFlags VkImageCompressionFlagsEXT;

VkImageCompressionFlagsEXT 是一种用于设置零个或多个 VkImageCompressionFlagBitsEXT 的掩码的位掩码类型。

// Provided by VK_EXT_image_compression_control
typedef VkFlags VkImageCompressionFixedRateFlagsEXT;

VkImageCompressionFixedRateFlagsEXT 是一种用于设置零个或多个 VkImageCompressionFixedRateFlagBitsEXT 的掩码的位掩码类型。

可以在 VkImageCompressionControlEXT::pFixedRateFlags 中设置的位,指定图像平面的允许压缩率,包括:

// Provided by VK_EXT_image_compression_control
typedef enum VkImageCompressionFixedRateFlagBitsEXT {
    VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT = 0,
    VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT = 0x00000001,
    VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT = 0x00000002,
    VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT = 0x00000004,
    VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT = 0x00000008,
    VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT = 0x00000010,
    VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT = 0x00000020,
    VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT = 0x00000040,
    VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT = 0x00000080,
    VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT = 0x00000100,
    VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT = 0x00000200,
    VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT = 0x00000400,
    VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT = 0x00000800,
    VK_IMAGE_COMPRESSION_FIXED_RATE_13BPC_BIT_EXT = 0x00001000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_14BPC_BIT_EXT = 0x00002000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_15BPC_BIT_EXT = 0x00004000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_16BPC_BIT_EXT = 0x00008000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_17BPC_BIT_EXT = 0x00010000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_18BPC_BIT_EXT = 0x00020000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_19BPC_BIT_EXT = 0x00040000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_20BPC_BIT_EXT = 0x00080000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_21BPC_BIT_EXT = 0x00100000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_22BPC_BIT_EXT = 0x00200000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_23BPC_BIT_EXT = 0x00400000,
    VK_IMAGE_COMPRESSION_FIXED_RATE_24BPC_BIT_EXT = 0x00800000,
} VkImageCompressionFixedRateFlagBitsEXT;
  • VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT 指定必须不使用固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT 指定可能使用每分量 [1,2) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT 指定可能使用每分量 [2,3) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT 指定可能使用每分量 [3,4) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT 指定可能使用每分量 [4,5) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT 指定可能使用每分量 [5,6) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT 指定可能使用每分量 [6,7) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT 指定可能使用每分量 [7,8) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT 指定可能使用每分量 [8,9) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT 指定可能使用每分量 [9,10) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT 指定可能使用每分量 [10,11) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT 指定可能使用每分量 [11,12) 位的固定速率压缩。

  • VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT 指定可能使用每分量至少 12 位的固定速率压缩。

如果格式的不同分量具有不同的比特率,则 VkImageCompressionControlEXT::pFixedRateFlags 描述的是分配了最大比特数的分量的速率,按比例缩放。例如,要请求将 VK_FORMAT_A2R10G10B10_UNORM_PACK32 格式以每像素 8 比特的速率存储,请使用 VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT (最大分量为 10 比特,存储为原始大小的四分之一,即 2.5 比特,向下取整)。

如果 flags 包含 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,并且 VkImageCompressionControlEXT::pFixedRateFlags 中为某个平面设置了多个位,则实现 **应该** 应用所支持的最低允许比特率。

选择“每分量比特数”术语是为了让相同的压缩率描述应用于仅在分量数量上不同的格式的相同压缩程度。例如,VK_FORMAT_R8G8_UNORM 压缩到其原始大小的一半,其速率为每分量 4 比特,每像素 8 比特。VK_FORMAT_R8G8B8A8_UNORM 压缩到其原始大小的一半,其速率为每分量 4 比特,每像素 16 比特。这两种情况都可以使用 VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT 请求。

要查询图像的压缩属性,请在调用 vkGetImageSubresourceLayout2vkGetImageSubresourceLayout2 时,将 VkImageCompressionPropertiesEXT 结构添加到 VkSubresourceLayout2 结构的 pNext 链中。

要确定给定图像格式支持的压缩率,请在调用 vkGetPhysicalDeviceImageFormatProperties2 时,将 VkImageCompressionPropertiesEXT 结构添加到 VkImageFormatProperties2 结构的 pNext 链中。

由于默认情况下禁用固定速率压缩,因此传递给 vkGetPhysicalDeviceImageFormatProperties2VkImageCompressionPropertiesEXT 结构不会指示任何固定速率压缩支持,除非 VkPhysicalDeviceImageFormatInfo2 结构的 pNext 链中也包含 VkImageCompressionControlEXT 结构(传递给同一个命令)。

VkImageCompressionPropertiesEXT 结构的定义如下:

// Provided by VK_EXT_image_compression_control
typedef struct VkImageCompressionPropertiesEXT {
    VkStructureType                        sType;
    void*                                  pNext;
    VkImageCompressionFlagsEXT             imageCompressionFlags;
    VkImageCompressionFixedRateFlagsEXT    imageCompressionFixedRateFlags;
} VkImageCompressionPropertiesEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • imageCompressionFlags 返回一个描述应用于图像的压缩控制的值。该值将为 VK_IMAGE_COMPRESSION_DEFAULT_EXT (表示没有固定速率压缩)、VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT (表示固定速率压缩) 或 VK_IMAGE_COMPRESSION_DISABLED_EXT (表示没有压缩)。

  • imageCompressionFixedRateFlags 返回一个 VkImageCompressionFixedRateFlagsEXT 值,描述应用于图像指定方面的压缩率。

有效用法(隐式)
  • VUID-VkImageCompressionPropertiesEXT-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT

如果 VkImageCreateInfopNext 列表中包含 VkImageAlignmentControlCreateInfoMESA 结构,则该结构描述了此图像的所需对齐方式。

VkImageAlignmentControlCreateInfoMESA 结构的定义如下:

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

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

  • maximumRequestedAlignment 指定图像的最大对齐方式。

如果 maximumRequestedAlignment 不为 0,则实现 **应该** 选择一个图像内存布局,该布局要求的对齐方式不大于 VkMemoryRequirements::alignment 中报告的 maximumRequestedAlignment。如果给定图像创建参数不存在这样的布局,则实现 **应该** 返回 VkMemoryRequirements 中支持的最小对齐方式。

如果实现需要禁用图像压缩才能满足 maximumRequestedAlignment(其中更大的对齐方式将启用图像压缩),则实现 **应该** 不使用 maximumRequestedAlignment,并且 **应该** 返回不影响压缩的最小对齐方式。如果启用了 imageCompressionControl 功能,则应用程序 **可以** 将一个带有 VK_IMAGE_COMPRESSION_DISABLED_EXTVkImageCompressionControlEXT 链接起来。在这种情况下,当实现决定对齐方式时,**应该** 不考虑图像压缩。

有效用法
  • VUID-VkImageAlignmentControlCreateInfoMESA-maximumRequestedAlignment-09655
    如果 maximumRequestedAlignment 不为 0,则 maximumRequestedAlignment **必须** 为 2 的幂

  • VUID-VkImageAlignmentControlCreateInfoMESA-maximumRequestedAlignment-09656
    如果 maximumRequestedAlignment 不为 0,则 maximumRequestedAlignmentsupportedImageAlignmentMask 的按位与结果 **必须** 非零

  • VUID-VkImageAlignmentControlCreateInfoMESA-imageAlignmentControl-09657
    imageAlignmentControl **必须** 启用

有效用法(隐式)
  • VUID-VkImageAlignmentControlCreateInfoMESA-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA

以下位 **可以** 在

中设置,用于指定图像的预期用途,并且是

// Provided by VK_VERSION_1_0
typedef enum VkImageUsageFlagBits {
    VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,
    VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,
    VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,
    VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,
    VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,
    VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
    VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
    VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
  // Provided by VK_VERSION_1_4
    VK_IMAGE_USAGE_HOST_TRANSFER_BIT = 0x00400000,
  // Provided by VK_KHR_video_decode_queue
    VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,
  // Provided by VK_KHR_video_decode_queue
    VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,
  // Provided by VK_KHR_video_decode_queue
    VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,
  // Provided by VK_EXT_fragment_density_map
    VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
  // Provided by VK_KHR_fragment_shading_rate
    VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100,
  // Provided by VK_KHR_video_encode_queue
    VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000,
  // Provided by VK_KHR_video_encode_queue
    VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000,
  // Provided by VK_KHR_video_encode_queue
    VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,
  // Provided by VK_EXT_attachment_feedback_loop_layout
    VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x00080000,
  // Provided by VK_HUAWEI_invocation_mask
    VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000,
  // Provided by VK_QCOM_image_processing
    VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM = 0x00100000,
  // Provided by VK_QCOM_image_processing
    VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0x00200000,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x02000000,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x04000000,
  // Provided by VK_NV_shading_rate_image
    VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
  // Provided by VK_EXT_host_image_copy
    VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT = VK_IMAGE_USAGE_HOST_TRANSFER_BIT,
} VkImageUsageFlagBits;
  • VK_IMAGE_USAGE_TRANSFER_SRC_BIT 指定图像 **可以** 用作传输命令的源。

  • VK_IMAGE_USAGE_TRANSFER_DST_BIT 指定图像 **可以** 用作传输命令的目标。

  • VK_IMAGE_USAGE_SAMPLED_BIT 指定图像 **可以** 用于创建适合占用 VK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER 类型的 VkDescriptorSet 插槽的 VkImageView,并由着色器采样。

  • VK_IMAGE_USAGE_STORAGE_BIT 指定图像 **可以** 用于创建适合占用 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE 类型的 VkDescriptorSet 插槽的 VkImageView

  • VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 指定图像 **可以** 用于创建适合用作 VkFramebuffer 中的颜色或解析附件的 VkImageView

  • VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 指定图像 **可以** 用于创建适合用作 VkFramebuffer 中的深度/模板或深度/模板解析附件的 VkImageView

  • VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 指定实现**可能**支持使用带有 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT内存分配来支持具有此用法的图像。对于任何可用于创建适用于用作颜色、解析、深度/模板或输入附件的 VkImageView 的图像,都可以设置此位。

  • VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 指定该图像**可以**用于创建适用于占用 VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 类型的 VkDescriptorSet 插槽的 VkImageView;从着色器中读取为输入附件;并在帧缓冲区中用作输入附件。

  • VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT 指定该图像**可以**用于创建适用于用作片段密度图图像VkImageView

  • VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 指定该图像**可以**用于创建适用于用作片段着色率附件着色率图像VkImageView

  • VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR 指定该图像**可以**在视频解码操作中用作解码输出图片

  • VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR 保留供将来使用。

  • VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR 指定该图像**可以**在视频解码操作中用作输出重建图片或输入参考图片

  • VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR 保留供将来使用。

  • VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR 指定该图像**可以**在视频编码操作中用作编码输入图片

  • VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR 指定该图像**可以**在视频编码操作中用作输出重建图片或输入参考图片

  • VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 指定该图像**可以**转换为 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 布局,以便在 VkFramebuffer 中用作颜色或深度/模板附件,和/或在同一渲染过程中用作着色器中的只读输入资源(采样图像、组合图像采样器或输入附件)。

  • VK_IMAGE_USAGE_HOST_TRANSFER_BIT 指定该图像**可以**与主机复制命令和主机布局转换一起使用。

  • VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR 指定该图像**可以**在视频编码操作中用作量化增量图

  • VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 指定该图像**可以**在视频编码操作中用作强调图

// Provided by VK_VERSION_1_0
typedef VkFlags VkImageUsageFlags;

VkImageUsageFlags 是用于设置零个或多个 VkImageUsageFlagBits 的掩码类型的位掩码。

创建 VkImageView 时,**必须**设置以下 VkImageUsageFlagBits 之一

  • VK_IMAGE_USAGE_SAMPLED_BIT

  • VK_IMAGE_USAGE_STORAGE_BIT

  • VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT

  • VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT

  • VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT

  • VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR

  • VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM

  • VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM

  • VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR

可以在 VkImageCreateInfo::flags 中设置的位,指定图像的附加参数,是

// Provided by VK_VERSION_1_0
typedef enum VkImageCreateFlagBits {
    VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001,
    VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
    VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008,
    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_ALIAS_BIT = 0x00000400,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT = 0x00000040,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT = 0x00000020,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT = 0x00000080,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_EXTENDED_USAGE_BIT = 0x00000100,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_PROTECTED_BIT = 0x00000800,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_CREATE_DISJOINT_BIT = 0x00000200,
  // Provided by VK_NV_corner_sampled_image
    VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV = 0x00002000,
  // Provided by VK_EXT_sample_locations
    VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000,
  // Provided by VK_EXT_fragment_density_map
    VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT = 0x00004000,
  // Provided by VK_EXT_descriptor_buffer
    VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00010000,
  // Provided by VK_EXT_multisampled_render_to_single_sampled
    VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00040000,
  // Provided by VK_EXT_image_2d_view_of_3d
    VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT = 0x00020000,
  // Provided by VK_QCOM_fragment_density_map_offset
    VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = 0x00008000,
  // Provided by VK_KHR_video_maintenance1
    VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00100000,
  // Provided by VK_KHR_bind_memory2 with VK_KHR_device_group
    VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT,
  // Provided by VK_KHR_maintenance1
    VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,
  // Provided by VK_KHR_maintenance2
    VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,
  // Provided by VK_KHR_maintenance2
    VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT,
  // Provided by VK_KHR_sampler_ycbcr_conversion
    VK_IMAGE_CREATE_DISJOINT_BIT_KHR = VK_IMAGE_CREATE_DISJOINT_BIT,
  // Provided by VK_KHR_bind_memory2
    VK_IMAGE_CREATE_ALIAS_BIT_KHR = VK_IMAGE_CREATE_ALIAS_BIT,
} VkImageCreateFlagBits;
  • VK_IMAGE_CREATE_SPARSE_BINDING_BIT 指定该图像将使用稀疏内存绑定进行支持。

  • VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 指定该图像**可以**使用稀疏内存绑定进行部分支持。使用此标志创建的图像**必须**也使用 VK_IMAGE_CREATE_SPARSE_BINDING_BIT 标志创建。

  • VK_IMAGE_CREATE_SPARSE_ALIASED_BIT 指定该图像将使用稀疏内存绑定进行支持,其内存范围可能同时支持另一个图像(或同一图像的另一部分)。使用此标志创建的图像**必须**也使用 VK_IMAGE_CREATE_SPARSE_BINDING_BIT 标志创建。

  • VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 指定该图像**可以**用于创建具有与图像不同格式的 VkImageView。对于多平面格式,VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 指定可以创建图像的_平面_的 VkImageView

  • VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT 指定该图像**可以**用于创建类型为 VK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageView

  • VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT 指定该图像**可以**用于创建类型为 VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAYVkImageView

  • VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT 指定该图像**可以**用于创建类型为 VK_IMAGE_VIEW_TYPE_2DVkImageView

  • VK_IMAGE_CREATE_PROTECTED_BIT 指定该图像是受保护的图像。

  • VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT 指定该图像**可以**与传递给 vkBindImageMemory2VkBindImageMemoryDeviceGroupInfo 结构的 splitInstanceBindRegionCount 成员的非零值一起使用。此标志还具有使图像使用标准稀疏图像块尺寸的效果。

  • VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 指定具有压缩格式的图像**可以**用于创建具有未压缩格式的 VkImageView,其中图像视图中的每个纹素都对应于图像的压缩纹素块。

  • VK_IMAGE_CREATE_EXTENDED_USAGE_BIT 指定该图像**可以**使用不支持为创建图像的格式但支持至少一种从图像创建的 VkImageView **可以**拥有的格式的用法标志创建。

  • VK_IMAGE_CREATE_DISJOINT_BIT 指定具有多平面格式的图像**必须**将每个平面分别绑定到内存,而不是对整个图像进行单个内存绑定;此位的存在将_分离图像_与未设置此位的图像区分开来。

  • VK_IMAGE_CREATE_ALIAS_BIT 指定使用相同创建参数创建且别名到同一内存的两个图像可以彼此一致地解释内存内容,但须遵守内存别名部分中描述的规则。此标志进一步指定不连续图像的每个平面可以与单平面图像共享内存中的非线性表示,并且根据多平面格式的兼容平面中的规则,单平面图像可以与多平面不连续图像的平面共享内存中的非线性表示。如果 pNext 链包含一个 VkExternalMemoryImageCreateInfoVkExternalMemoryImageCreateInfoNV 结构,且其 handleTypes 成员不为 0,则如同设置了 VK_IMAGE_CREATE_ALIAS_BIT

  • VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 指定具有深度或深度/模板格式的图像在用作深度/模板附件时可以与自定义采样位置一起使用。

  • VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV 指定该图像是角采样图像

  • VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT 指定图像可以采用子采样格式,当作为具有片段密度图附件的渲染过程的附件写入时,这种格式可能更优化。访问子采样图像有额外的注意事项

    • 如果采样器创建时 flags 不包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,或者未使用具有 VkDescriptorSetLayoutBinding 中不可变采样器的组合图像采样器进行采样,则作为图像采样器读取的图像数据将具有未定义的值。

    • 如果内容不是在同一渲染过程的较早子过程中作为附件写入的,则使用输入附件读取的图像数据将具有未定义的值。

    • 如果 VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::subsampledCoarseReconstructionEarlyAccessVK_TRUE,并且采样器创建时 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT,则在片段着色器中作为图像采样器读取的图像数据将在 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 期间被设备额外读取。

    • 如果 VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::subsampledLoadsVK_TRUE,则使用加载操作读取的图像数据将被重采样为渲染过程的片段密度。否则,图像数据的值是未定义的

    • 如果图像存储为渲染过程附件,则渲染区域之外的图像内容将采用未定义的值。

  • VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM 指定图像可以在具有非零片段密度图偏移的渲染过程中使用。在具有非零偏移的渲染过程中,片段密度图附件、输入附件、颜色附件、深度/模板附件、解析附件和保留附件必须使用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM 创建。

  • VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 指定当捕获和回放(例如,用于跟踪捕获和回放)时,图像可以与描述符缓冲区一起使用,有关详细信息,请参见 VkOpaqueCaptureDescriptorDataCreateInfoEXT

  • VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT 指定图像可以多采样渲染作为单采样帧缓冲区附件一起使用

  • VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR 指定图像可以视频编码操作中使用,而无需在图像创建时指定将使用该图像的视频配置文件集,但仅用作DPB图片的图像除外,只要该图像在其他方面与相关的视频配置文件兼容

    当用作以下内容时,这使得无需额外复制或转换即可交换视频图片数据:

    这包括使用 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHRVK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR 创建的图像,这对于在支持 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR 的实现上,在视频解码操作中使用相同的视频图片作为重建图片解码输出图片是必需的。

    但是,仅具有 DPB 用途的图像仍然与其创建时使用的视频配置文件绑定,因为此类仅限 DPB 的图像的数据布局可能依赖于实现和编解码器。

    如果应用程序想要共享或重用支持此类图像的设备内存(例如,出于时间别名的目的),那么它应该为每个视频配置文件创建单独的图像对象,并将它们绑定到相同的底层设备内存范围,类似于如何在不同的视频会话或任何其他内存支持的资源之间共享内存资源一样。

有关更多详细信息,请参见稀疏资源特性稀疏物理设备特性

// Provided by VK_VERSION_1_0
typedef VkFlags VkImageCreateFlags;

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

VkImageCreateInfo::imageType 的可能值,指定图像的基本维度为:

// Provided by VK_VERSION_1_0
typedef enum VkImageType {
    VK_IMAGE_TYPE_1D = 0,
    VK_IMAGE_TYPE_2D = 1,
    VK_IMAGE_TYPE_3D = 2,
} VkImageType;
  • VK_IMAGE_TYPE_1D 指定一维图像。

  • VK_IMAGE_TYPE_2D 指定二维图像。

  • VK_IMAGE_TYPE_3D 指定三维图像。

VkImageCreateInfo::tiling 的可能值,指定图像中纹素块的平铺排列为:

// Provided by VK_VERSION_1_0
typedef enum VkImageTiling {
    VK_IMAGE_TILING_OPTIMAL = 0,
    VK_IMAGE_TILING_LINEAR = 1,
  // Provided by VK_EXT_image_drm_format_modifier
    VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT = 1000158000,
} VkImageTiling;

要查询图像子资源的内存布局,请调用

// Provided by VK_VERSION_1_0
void vkGetImageSubresourceLayout(
    VkDevice                                    device,
    VkImage                                     image,
    const VkImageSubresource*                   pSubresource,
    VkSubresourceLayout*                        pLayout);
  • device 是拥有该图像的逻辑设备。

  • image 是要查询布局的图像。

  • pSubresource 是指向 VkImageSubresource 结构的指针,该结构从图像中选择特定的图像子资源。

  • pLayout 是指向 VkSubresourceLayout 结构的指针,其中返回布局。

如果图像是线性的,则返回的布局对于主机访问有效。

如果图像的平铺方式是 VK_IMAGE_TILING_LINEAR 且其格式是多平面格式,则 vkGetImageSubresourceLayout 描述图像的一个格式平面。如果图像的平铺方式是 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 vkGetImageSubresourceLayout 描述图像的一个内存平面。如果图像的平铺方式是 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 并且图像是 非线性的,则返回的布局具有实现相关的含义;图像的 DRM 格式修饰符的供应商可以提供文档来解释如何解释返回的布局。

vkGetImageSubresourceLayout 对于单个图像的生命周期是不变的。但是,在将图像绑定到内存之前,Android 硬件缓冲区或 QNX 屏幕缓冲区外部内存中图像的子资源布局是未知的,因此应用程序在绑定之前必须不要为此类图像调用 vkGetImageSubresourceLayout

有效用法
  • VUID-vkGetImageSubresourceLayout-image-07790
    创建 image 时,其 tiling 必须等于 VK_IMAGE_TILING_LINEARVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT

  • VUID-vkGetImageSubresourceLayout-aspectMask-00997
    pSubresourceaspectMask 成员必须仅设置一个位

  • VUID-vkGetImageSubresourceLayout-mipLevel-01716
    pSubresourcemipLevel 成员必须小于 image 中指定的 mipLevels

  • VUID-vkGetImageSubresourceLayout-arrayLayer-01717
    pSubresourcearrayLayer 成员必须小于 image 中指定的 arrayLayers

  • VUID-vkGetImageSubresourceLayout-format-08886
    如果 imageformat 是不是多平面图像格式的颜色格式,并且 imagetilingVK_IMAGE_TILING_LINEARVK_IMAGE_TILING_OPTIMAL,则 pSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-vkGetImageSubresourceLayout-format-04462
    如果 imageformat 具有深度分量,则 pSubresourceaspectMask 成员必须包含 VK_IMAGE_ASPECT_DEPTH_BIT

  • VUID-vkGetImageSubresourceLayout-format-04463
    如果 imageformat 具有模板分量,则 pSubresourceaspectMask 成员必须包含 VK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkGetImageSubresourceLayout-format-04464
    如果 imageformat 不包含模板或深度分量,则 pSubresourceaspectMask 成员必须不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkGetImageSubresourceLayout-tiling-08717
    如果 imagetilingVK_IMAGE_TILING_LINEAR 并且具有 多平面图像格式,则 pSubresourceaspectMask 成员必须是一个有效的多平面 aspect mask

  • VUID-vkGetImageSubresourceLayout-image-09432
    如果使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 外部内存句柄类型创建 image,则 image 必须绑定到内存

  • VUID-vkGetImageSubresourceLayout-tiling-09433
    如果 imagetilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 pSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT,并且索引 i 必须小于与图像的 formatVkImageDrmFormatModifierPropertiesEXT::drmFormatModifier 关联的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount

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

  • VUID-vkGetImageSubresourceLayout-image-parameter
    image 必须是有效的 VkImage 句柄

  • VUID-vkGetImageSubresourceLayout-pSubresource-parameter
    pSubresource 必须是指向有效的 VkImageSubresource 结构的有效指针

  • VUID-vkGetImageSubresourceLayout-pLayout-parameter
    pLayout 必须是指向 VkSubresourceLayout 结构的有效指针

  • VUID-vkGetImageSubresourceLayout-image-parent
    image 必须是从 device 创建、分配或检索的

VkImageSubresource 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkImageSubresource {
    VkImageAspectFlags    aspectMask;
    uint32_t              mipLevel;
    uint32_t              arrayLayer;
} VkImageSubresource;
  • aspectMask 是一个 VkImageAspectFlags 值,用于选择图像的方面

  • mipLevel 选择 mipmap 级别。

  • arrayLayer 选择数组层。

有效用法(隐式)
  • VUID-VkImageSubresource-aspectMask-parameter
    aspectMask 必须VkImageAspectFlagBits 值的有效组合

  • VUID-VkImageSubresource-aspectMask-requiredbitmask
    aspectMask 必须不能为 0

图像子资源布局的信息在 VkSubresourceLayout 结构体中返回。

// Provided by VK_VERSION_1_0
typedef struct VkSubresourceLayout {
    VkDeviceSize    offset;
    VkDeviceSize    size;
    VkDeviceSize    rowPitch;
    VkDeviceSize    arrayPitch;
    VkDeviceSize    depthPitch;
} VkSubresourceLayout;
  • offset 是从图像或平面的起始位置到图像子资源起始位置的字节偏移量。

  • size 是图像子资源的大小,以字节为单位。size 包括基于 rowPitch 所需的任何额外内存。

  • rowPitch 描述了图像中每行纹素之间的字节数。

  • arrayPitch 描述了图像中每个数组层之间的字节数。

  • depthPitch 描述了 3D 图像中每个切片之间的字节数。

如果图像是线性的,那么 rowPitcharrayPitchdepthPitch 描述了图像子资源在线性内存中的布局。对于未压缩的格式,rowPitch 是相邻行中具有相同 x 坐标的纹素之间的字节数(y 坐标相差 1)。arrayPitch 是图像的相邻数组层中具有相同 x 和 y 坐标的纹素之间的字节数(数组层的值相差 1)。depthPitch 是 3D 图像相邻切片中具有相同 x 和 y 坐标的纹素之间的字节数(z 坐标相差 1)。用寻址公式表示,图像子资源中纹素的起始字节地址为

// (x,y,z,layer) are in texel coordinates
address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*elementSize + offset

对于压缩格式,rowPitch 是相邻行中压缩纹素块之间的字节数。arrayPitch 是相邻数组层中压缩纹素块之间的字节数。depthPitch 是 3D 图像相邻切片中压缩纹素块之间的字节数。

// (x,y,z,layer) are in compressed texel block coordinates
address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*compressedTexelBlockByteSize + offset;

对于不是作为数组创建的图像,arrayPitch 的值是未定义的depthPitch 仅为 3D 图像定义。

如果图像具有单平面颜色格式且其平铺方式为 VK_IMAGE_TILING_LINEAR,则 VkImageSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

如果图像具有深度/模板格式且其平铺方式为 VK_IMAGE_TILING_LINEAR,则 aspectMask 必须VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT。在分别存储深度和模板方面的实现中,查询这些图像子资源布局中的每一个将返回不同的 offsetsize,表示该方面使用的内存区域。在交错存储深度和模板方面的实现中,将返回相同的 offsetsize,表示交错的内存分配。

如果图像具有多平面格式且其平铺方式为 VK_IMAGE_TILING_LINEAR,则 VkImageSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BIT 或(仅适用于三平面格式)VK_IMAGE_ASPECT_PLANE_2_BIT。查询这些图像子资源布局中的每一个将返回不同的 offsetsize,表示该平面使用的内存区域。如果图像是分离的,则 offset 相对于平面的基址。如果图像是非分离的,则 offset 相对于图像的基址。

如果图像的平铺方式为 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 VkImageSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT 之一,其中允许的最大平面索引 i 由与图像的 VkImageCreateInfo::format修饰符 相关的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount 定义。子资源使用的内存范围由 offsetsize 描述。如果图像是分离的,则 offset 相对于内存平面的基址。如果图像是非分离的,则 offset 相对于图像的基址。如果图像是非线性的,那么 rowPitcharrayPitchdepthPitch 具有与实现相关的含义。

要查询图像子资源的内存布局,请调用

// Provided by VK_VERSION_1_4
void vkGetImageSubresourceLayout2(
    VkDevice                                    device,
    VkImage                                     image,
    const VkImageSubresource2*                  pSubresource,
    VkSubresourceLayout2*                       pLayout);

或等效命令

// Provided by VK_KHR_maintenance5
void vkGetImageSubresourceLayout2KHR(
    VkDevice                                    device,
    VkImage                                     image,
    const VkImageSubresource2*                  pSubresource,
    VkSubresourceLayout2*                       pLayout);

或等效命令

// Provided by VK_EXT_host_image_copy, VK_EXT_image_compression_control
void vkGetImageSubresourceLayout2EXT(
    VkDevice                                    device,
    VkImage                                     image,
    const VkImageSubresource2*                  pSubresource,
    VkSubresourceLayout2*                       pLayout);
  • device 是拥有该图像的逻辑设备。

  • image 是要查询布局的图像。

  • pSubresource 是指向 VkImageSubresource2 结构的指针,该结构选择特定图像作为图像子资源。

  • pLayout 是指向 VkSubresourceLayout2 结构的指针,该结构中返回布局信息。

vkGetImageSubresourceLayout2 的行为类似于 vkGetImageSubresourceLayout,可以通过链式输入结构指定扩展输入,并通过链式输出结构返回扩展信息。

可以使用 tiling 等于 VK_IMAGE_TILING_OPTIMAL 创建的 image 调用 vkGetImageSubresourceLayout2,但这情况下 VkSubresourceLayout2::subresourceLayout 的成员值将是未定义的

tiling 等于 VK_IMAGE_TILING_OPTIMAL 时,从 VkImageSubresource2::pNext 链接的结构也会更新。

有效用法
  • VUID-vkGetImageSubresourceLayout2-aspectMask-00997
    pSubresourceaspectMask 成员必须仅设置一个位

  • VUID-vkGetImageSubresourceLayout2-mipLevel-01716
    pSubresourcemipLevel 成员必须小于 image 中指定的 mipLevels

  • VUID-vkGetImageSubresourceLayout2-arrayLayer-01717
    pSubresourcearrayLayer 成员必须小于 image 中指定的 arrayLayers

  • VUID-vkGetImageSubresourceLayout2-format-08886
    如果 imageformat 是不是多平面图像格式的颜色格式,并且 imagetilingVK_IMAGE_TILING_LINEARVK_IMAGE_TILING_OPTIMAL,则 pSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-vkGetImageSubresourceLayout2-format-04462
    如果 imageformat 具有深度分量,则 pSubresourceaspectMask 成员必须包含 VK_IMAGE_ASPECT_DEPTH_BIT

  • VUID-vkGetImageSubresourceLayout2-format-04463
    如果 imageformat 具有模板分量,则 pSubresourceaspectMask 成员必须包含 VK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkGetImageSubresourceLayout2-format-04464
    如果 imageformat 不包含模板或深度分量,则 pSubresourceaspectMask 成员必须不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkGetImageSubresourceLayout2-tiling-08717
    如果 imagetilingVK_IMAGE_TILING_LINEAR 并且具有 多平面图像格式,则 pSubresourceaspectMask 成员必须是一个有效的多平面 aspect mask

  • VUID-vkGetImageSubresourceLayout2-image-09434
    如果使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 外部内存句柄类型创建 image,则 image 必须绑定到内存

  • VUID-vkGetImageSubresourceLayout2-tiling-09435
    如果 imagetilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 pSubresourceaspectMask 成员必须VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT,并且索引 i 必须小于与图像的 formatVkImageDrmFormatModifierPropertiesEXT::drmFormatModifier 关联的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount

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

  • VUID-vkGetImageSubresourceLayout2-image-parameter
    image 必须是有效的 VkImage 句柄

  • VUID-vkGetImageSubresourceLayout2-pSubresource-parameter
    pSubresource 必须是指向有效 VkImageSubresource2 结构的有效指针

  • VUID-vkGetImageSubresourceLayout2-pLayout-parameter
    pLayout 必须是指向 VkSubresourceLayout2 结构的有效指针

  • VUID-vkGetImageSubresourceLayout2-image-parent
    image 必须是从 device 创建、分配或检索的

VkImageSubresource2 结构定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkImageSubresource2 {
    VkStructureType       sType;
    void*                 pNext;
    VkImageSubresource    imageSubresource;
} VkImageSubresource2;

或等效形式:

// Provided by VK_KHR_maintenance5
typedef VkImageSubresource2 VkImageSubresource2KHR;

或等效形式:

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

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

  • imageSubresource 是一个 VkImageSubresource 结构体。

有效用法(隐式)
  • VUID-VkImageSubresource2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2

  • VUID-VkImageSubresource2-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageSubresource2-imageSubresource-parameter
    imageSubresource 必须 是一个有效的 VkImageSubresource 结构体。

关于图像子资源的布局信息,将会在 VkSubresourceLayout2 结构体中返回。

// Provided by VK_VERSION_1_4
typedef struct VkSubresourceLayout2 {
    VkStructureType        sType;
    void*                  pNext;
    VkSubresourceLayout    subresourceLayout;
} VkSubresourceLayout2;

或等效形式:

// Provided by VK_KHR_maintenance5
typedef VkSubresourceLayout2 VkSubresourceLayout2KHR;

或等效形式:

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

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

  • subresourceLayout 是一个 VkSubresourceLayout 结构体。

有效用法(隐式)
  • VUID-VkSubresourceLayout2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2

  • VUID-VkSubresourceLayout2-pNext-pNext
    任何结构体(包括此结构体)的 pNext 成员,在 pNext 链中,必须 要么是 NULL,要么是指向 VkImageCompressionPropertiesEXTVkSubresourceHostMemcpySize 的有效实例的指针。

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

要查询使用 vkCopyMemoryToImagevkCopyImageToMemory 将数据复制到图像或从图像复制数据时所需的内存大小,并且指定了 VK_HOST_IMAGE_COPY_MEMCPY 标志,请在调用 vkGetImageSubresourceLayout2 时,将 VkSubresourceHostMemcpySize 结构体添加到 VkSubresourceLayout2 结构体的 pNext 链中。

VkSubresourceHostMemcpySize 结构体定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkSubresourceHostMemcpySize {
    VkStructureType    sType;
    void*              pNext;
    VkDeviceSize       size;
} VkSubresourceHostMemcpySize;

或等效形式:

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

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

  • size 是图像子资源的大小,以字节为单位。

有效用法(隐式)
  • VUID-VkSubresourceHostMemcpySize-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE

要查询图像子资源的内存布局,而无需图像对象,请调用:

// Provided by VK_VERSION_1_4
void vkGetDeviceImageSubresourceLayout(
    VkDevice                                    device,
    const VkDeviceImageSubresourceInfo*         pInfo,
    VkSubresourceLayout2*                       pLayout);

或等效命令

// Provided by VK_KHR_maintenance5
void vkGetDeviceImageSubresourceLayoutKHR(
    VkDevice                                    device,
    const VkDeviceImageSubresourceInfo*         pInfo,
    VkSubresourceLayout2*                       pLayout);
  • device 是拥有该图像的逻辑设备。

  • pInfo 是一个指向 VkDeviceImageSubresourceInfo 结构体的指针,该结构体包含子资源布局查询所需的参数。

  • pLayout 是指向 VkSubresourceLayout2 结构的指针,该结构中返回布局信息。

vkGetDeviceImageSubresourceLayout 的行为类似于 vkGetImageSubresourceLayout2,但它使用 VkImageCreateInfo 结构体来指定图像,而不是 VkImage 对象。

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

  • VUID-vkGetDeviceImageSubresourceLayout-pInfo-parameter
    pInfo 必须 是指向有效的 VkDeviceImageSubresourceInfo 结构体的有效指针。

  • VUID-vkGetDeviceImageSubresourceLayout-pLayout-parameter
    pLayout 必须是指向 VkSubresourceLayout2 结构的有效指针

VkDeviceImageSubresourceInfo 结构体定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkDeviceImageSubresourceInfo {
    VkStructureType               sType;
    const void*                   pNext;
    const VkImageCreateInfo*      pCreateInfo;
    const VkImageSubresource2*    pSubresource;
} VkDeviceImageSubresourceInfo;

或等效形式:

// Provided by VK_KHR_maintenance5
typedef VkDeviceImageSubresourceInfo VkDeviceImageSubresourceInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pCreateInfo 是一个指向 VkImageCreateInfo 结构体的指针,该结构体包含影响要查询的图像创建的参数。

  • pSubresource 是一个指向 VkImageSubresource2 结构体的指针,用于选择要查询的特定图像子资源。

有效用法
  • VUID-VkDeviceImageSubresourceInfo-aspectMask-00997
    pSubresourceaspectMask 成员必须仅设置一个位

  • VUID-VkDeviceImageSubresourceInfo-mipLevel-01716
    pSubresourcemipLevel 成员 必须 小于 pCreateInfo 中指定的 mipLevels

  • VUID-VkDeviceImageSubresourceInfo-arrayLayer-01717
    pSubresourcearrayLayer 成员 必须 小于 pCreateInfo 中指定的 arrayLayers

  • VUID-VkDeviceImageSubresourceInfo-format-08886
    如果 imageformat 是一个不是 多平面图像格式 的颜色格式,并且 pCreateInfotilingVK_IMAGE_TILING_LINEARVK_IMAGE_TILING_OPTIMAL,则 pSubresourceaspectMask 成员 必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkDeviceImageSubresourceInfo-format-04462
    如果 pCreateInfoformat 有深度分量,则 pSubresourceaspectMask 成员 必须 包含 VK_IMAGE_ASPECT_DEPTH_BIT

  • VUID-VkDeviceImageSubresourceInfo-format-04463
    如果 pCreateInfoformat 有模板分量,则 pSubresourceaspectMask 成员 必须 包含 VK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-VkDeviceImageSubresourceInfo-format-04464
    如果 pCreateInfoformat 不包含模板或深度分量,则 pSubresourceaspectMask 成员 必须 不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-VkDeviceImageSubresourceInfo-tiling-08717
    如果 pCreateInfotilingVK_IMAGE_TILING_LINEAR 并且具有 多平面图像格式,则 pSubresourceaspectMask 成员 必须 是一个有效的 多平面 aspect mask 位。

有效用法(隐式)
  • VUID-VkDeviceImageSubresourceInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO

  • VUID-VkDeviceImageSubresourceInfo-pNext-pNext
    pNext 必须NULL

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

  • VUID-VkDeviceImageSubresourceInfo-pSubresource-parameter
    pSubresource 必须是指向有效 VkImageSubresource2 结构的有效指针

如果图像是使用 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 创建的,则该图像具有 Linux DRM 格式修饰符。要查询 修饰符,请调用:

// Provided by VK_EXT_image_drm_format_modifier
VkResult vkGetImageDrmFormatModifierPropertiesEXT(
    VkDevice                                    device,
    VkImage                                     image,
    VkImageDrmFormatModifierPropertiesEXT*      pProperties);
  • device 是拥有该图像的逻辑设备。

  • image 是被查询的图像。

  • pProperties 是一个指向 VkImageDrmFormatModifierPropertiesEXT 结构体的指针,该结构体返回图像的 DRM 格式修饰符 的属性。

有效用法
  • VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-02272
    image 必须 使用 tiling 等于 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 创建。

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

  • VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parameter
    image 必须是有效的 VkImage 句柄

  • VUID-vkGetImageDrmFormatModifierPropertiesEXT-pProperties-parameter
    pProperties 必须是指向 VkImageDrmFormatModifierPropertiesEXT 结构的有效指针。

  • VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parent
    image 必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkImageDrmFormatModifierPropertiesEXT {
    VkStructureType    sType;
    void*              pNext;
    uint64_t           drmFormatModifier;
} VkImageDrmFormatModifierPropertiesEXT;

如果 image 是使用 VkImageDrmFormatModifierListCreateInfoEXT 创建的,那么返回的 drmFormatModifier 必须属于在图像创建时,在 VkImageDrmFormatModifierListCreateInfoEXT::pDrmFormatModifiers 中提供的修改器列表。如果 image 是使用 VkImageDrmFormatModifierExplicitCreateInfoEXT 创建的,那么返回的 drmFormatModifier 必须是在图像创建时,在 VkImageDrmFormatModifierExplicitCreateInfoEXT::drmFormatModifier 中提供的修改器。

有效用法(隐式)
  • VUID-VkImageDrmFormatModifierPropertiesEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT

  • VUID-VkImageDrmFormatModifierPropertiesEXT-pNext-pNext
    pNext 必须NULL

要销毁图像,请调用:

// Provided by VK_VERSION_1_0
void vkDestroyImage(
    VkDevice                                    device,
    VkImage                                     image,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁图像的逻辑设备。

  • image 是要销毁的图像。

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

有效用法
  • VUID-vkDestroyImage-image-01000
    所有引用 image 的已提交命令,无论是直接引用还是通过 VkImageView 引用,必须已完成执行。

  • VUID-vkDestroyImage-image-01001
    如果在创建 image 时提供了 VkAllocationCallbacks,那么这里必须提供一组兼容的回调。

  • VUID-vkDestroyImage-image-01002
    如果在创建 image 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

  • VUID-vkDestroyImage-image-04882
    image 不得是从 vkGetSwapchainImagesKHR 获取的。

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

  • VUID-vkDestroyImage-image-parameter
    如果 image 不是 VK_NULL_HANDLE,则 image 必须是一个有效的 VkImage 句柄。

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

  • VUID-vkDestroyImage-image-parent
    如果 image 是一个有效的句柄,则它必须已从 device 创建、分配或检索。

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

图像格式特性

VkImage 的有效使用可能取决于图像的格式特性,定义如下。此类约束记录在受影响的有效使用声明中。

角采样图像

角采样图像是指未标准化的纹理坐标以整数值而不是半整数值为中心的图像。

与传统纹理图像相比,角采样图像有许多不同之处。

仅 2D 和 3D 图像支持角采样。当对角采样图像进行采样时,采样器寻址模式必须VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE。角采样图像不支持作为立方体贴图或深度/模板图像。

图像 Mip 级别大小调整

完整的 mipmap 链是 mip 级别的完整集合,从提供的最大 mip 级别到最小 mip 级别大小

传统图像

对于传统图像,每个连续的 mip 级别 n+1 的尺寸为

widthn+1 = max(⌊widthn/2⌋, 1)

heightn+1 = max(⌊heightn/2⌋, 1)

depthn+1 = max(⌊depthn/2⌋, 1)

其中 widthnheightndepthn 是下一个较大 mip 级别 n 的尺寸。

最小 mip 级别大小为

  • 一维图像为 1,

  • 二维图像为 1x1,以及

  • 三维图像为 1x1x1。

完整 mipmap 链中的级别数为

⌊log2(max(width0, height0, depth0))⌋ + 1

其中 width0height0depth0 是最大(最详细)mip 级别 0 的尺寸。

角采样图像

对于角采样图像,每个连续的 mip 级别 n+1 的尺寸为

widthn+1 = max(⌈widthn/2⌉, 2)

heightn+1 = max(⌈heightn/2⌉, 2)

depthn+1 = max(⌈depthn/2⌉, 2)

其中 widthnheightndepthn 是下一个较大 mip 级别 n 的尺寸。

最小 mip 级别大小为

  • 二维图像为 2x2,以及

  • 三维图像为 2x2x2。

完整 mipmap 链中的级别数为

⌈log2(max(width0, height0, depth0))⌉

其中 width0height0depth0 是最大(最详细)mip 级别 0 的尺寸。

图像布局

图像以依赖于实现的 opaque 布局存储在内存中。每个布局都限制了使用该布局的图像子资源支持的操作类型。在任何给定时间,内存中表示图像子资源的数据都存在于特定的布局中,该布局由最近对该图像子资源执行的布局转换确定。应用程序可以控制每个图像子资源使用的布局,并且可以将图像子资源从一个布局转换为另一个布局。转换可以通过图像内存屏障进行,该屏障包含在 vkCmdPipelineBarriervkCmdWaitEvents 命令缓冲区命令中(请参阅图像内存屏障),或者作为渲染通道内的子通道依赖项的一部分(请参阅 VkSubpassDependency)。

图像布局是每个图像子资源的。同一图像的单独图像子资源可以同时处于不同的布局中,但给定图像子资源的深度和模板方面只能在启用了separateDepthStencilLayouts 功能的情况下处于不同的布局中。当设备上访问 VkImageView 描述符时,所有图像子资源必须处于有效的图像布局中。

每个布局可能为图像内存的特定用法提供最佳性能。例如,布局为 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 的图像可能为用作颜色附件提供最佳性能,但不支持用于传输命令。当图像子资源用于多种类型的操作时,应用程序可以将图像子资源从一个布局转换为另一个布局,以实现最佳性能。初始化后,应用程序无需使用通用布局以外的任何布局,尽管这可能在某些实现上产生次优性能。

创建时,图像的所有图像子资源最初都处于相同的布局中,该布局由 VkImageCreateInfo::initialLayout 成员选择。initialLayout必须VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED。如果它是 VK_IMAGE_LAYOUT_PREINITIALIZED,则图像数据可以由主机使用此布局进行预初始化,并且从此布局转换出来将保留该数据。如果它是 VK_IMAGE_LAYOUT_UNDEFINED,则数据的​​内容被认为是未定义的,并且不保证从此布局转换出来会保留该数据。对于这两种初始布局中的任何一种,任何图像子资源在被设备访问之前必须转换为另一种布局。

仅当 线性图像和这些图像中当前处于 VK_IMAGE_LAYOUT_PREINITIALIZEDVK_IMAGE_LAYOUT_GENERAL 布局的图像子资源时,主机对图像内存的访问才是明确定义的。调用 vkGetImageSubresourceLayout 获取线性图像返回的子资源布局映射对于这两种图像布局都是有效的。

图像布局集包括

// Provided by VK_VERSION_1_0
typedef enum VkImageLayout {
    VK_IMAGE_LAYOUT_UNDEFINED = 0,
    VK_IMAGE_LAYOUT_GENERAL = 1,
    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,
    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,
    VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,
    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,
    VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6,
    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,
    VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,
  // Provided by VK_VERSION_1_2
    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,
  // Provided by VK_VERSION_1_2
    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,
  // Provided by VK_VERSION_1_2
    VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,
  // Provided by VK_VERSION_1_2
    VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,
  // Provided by VK_VERSION_1_3
    VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000,
  // Provided by VK_VERSION_1_3
    VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001,
  // Provided by VK_VERSION_1_4
    VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ = 1000232000,
  // Provided by VK_KHR_swapchain
    VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
  // Provided by VK_KHR_video_decode_queue
    VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,
  // Provided by VK_KHR_video_decode_queue
    VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,
  // Provided by VK_KHR_video_decode_queue
    VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,
  // Provided by VK_KHR_shared_presentable_image
    VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
  // Provided by VK_EXT_fragment_density_map
    VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
  // Provided by VK_KHR_fragment_shading_rate
    VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003,
  // Provided by VK_KHR_video_encode_queue
    VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000,
  // Provided by VK_KHR_video_encode_queue
    VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001,
  // Provided by VK_KHR_video_encode_queue
    VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002,
  // Provided by VK_EXT_attachment_feedback_loop_layout
    VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000,
  // Provided by VK_KHR_maintenance2
    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
  // Provided by VK_KHR_maintenance2
    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
  // Provided by VK_NV_shading_rate_image
    VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,
  // Provided by VK_KHR_dynamic_rendering_local_read
    VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,
  // Provided by VK_KHR_separate_depth_stencil_layouts
    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
  // Provided by VK_KHR_separate_depth_stencil_layouts
    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
  // Provided by VK_KHR_separate_depth_stencil_layouts
    VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
  // Provided by VK_KHR_separate_depth_stencil_layouts
    VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
  // Provided by VK_KHR_synchronization2
    VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,
  // Provided by VK_KHR_synchronization2
    VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,
} VkImageLayout;

每个布局支持的设备访问类型是

  • VK_IMAGE_LAYOUT_UNDEFINED 指定布局未知。图像内存不能转换为此布局。此布局可以用作 VkImageCreateInfoinitialLayout 成员。此布局可以在布局转换中代替当前的图像布局使用,但这将导致图像内存的内容未定义

  • VK_IMAGE_LAYOUT_PREINITIALIZED 指定图像的内存处于定义的布局中,并且可以由数据填充,但尚未由驱动程序初始化。图像内存不能转换为此布局。此布局可以用作 VkImageCreateInfoinitialLayout 成员。此布局旨在用作内容由主机写入的图像的初始布局,因此可以直接将数据写入内存,而无需先执行布局转换。目前,VK_IMAGE_LAYOUT_PREINITIALIZED 仅对 线性图像有用,因为没有为 VK_IMAGE_TILING_OPTIMAL 图像定义标准布局。

  • VK_IMAGE_LAYOUT_GENERAL 支持所有类型的设备访问,除非另有说明。

  • VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL 指定的布局必须仅用于图形管道中的附件访问。

  • VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL 指定一个布局,允许只读访问作为附件,或在着色器中作为采样图像、组合图像/采样器或输入附件。

  • VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL必须仅用作 VkFramebuffer 中的颜色或解析附件。此布局仅对启用了 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 用法位的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL 指定深度/模板格式图像的深度和模板方面的布局,允许作为深度/模板附件进行读写访问。它等效于 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL

  • VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL 指定深度/模板格式图像的深度和模板方面的布局,允许只读访问作为深度/模板附件,或在着色器中作为采样图像、组合图像/采样器或输入附件。它等效于 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL 指定深度/模板格式图像的布局,允许以模板附件的形式读取和写入模板方面,并以深度附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问深度方面。它等效于 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL

  • VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL 指定深度/模板格式图像的布局,允许以深度附件的形式读取和写入深度方面,并以模板附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问模板方面。它等效于 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL

  • VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL 指定深度/模板格式图像的深度方面的布局,允许以深度附件的形式读取和写入。

  • VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL 指定深度/模板格式图像的深度方面的布局,允许以深度附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问。

  • VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL 指定深度/模板格式图像的模板方面的布局,允许以模板附件的形式读取和写入。

  • VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL 指定深度/模板格式图像的模板方面的布局,允许以模板附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问。

  • VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL 指定允许在着色器中作为采样图像、组合图像/采样器或输入附件进行只读访问的布局。此布局仅对启用了 VK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 必须仅用作传输命令的源图像(请参阅 VK_PIPELINE_STAGE_TRANSFER_BIT 的定义)。此布局仅对启用了 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 必须仅用作传输命令的目标图像。此布局仅对启用了 VK_IMAGE_USAGE_TRANSFER_DST_BIT 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 必须仅用于呈现可呈现图像以进行显示。

  • VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR 仅对共享的可呈现图像有效,并且必须用于图像支持的任何用法。

  • VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR 必须仅用作片段着色率附件着色率图像。此布局仅对启用了 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT 必须仅在 VkRenderPass 中用作片段密度图附件。此布局仅对启用了 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR 必须仅在视频解码操作中用作解码输出图像。此布局仅对启用了 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR 保留供将来使用。

  • VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 必须仅在视频解码操作中用作输出重建图像或输入参考图像。此布局仅对启用了 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR 保留供将来使用。

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR 必须仅在视频编码操作中用作编码输入图像。此布局仅对启用了 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR 必须仅在视频编码操作中用作输出重建图像或输入参考图像。此布局仅对启用了 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 必须仅用作 VkFramebuffer 中的颜色附件或深度/模板附件,和/或在着色器中作为采样图像、组合图像/采样器或输入附件进行只读访问。此布局仅对启用了 VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 使用标志和 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 以及 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT 使用标志的图像创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ 必须仅用作存储图像,或者颜色或深度/模板附件以及输入附件。此布局仅对使用 VK_IMAGE_USAGE_STORAGE_BIT 或同时使用 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 以及 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建的图像子资源有效。

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR 必须仅在视频编码操作中用作量化图。此布局仅对启用了 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 使用标志的图像创建的图像子资源有效。

每个图像子资源的布局并非图像子资源本身的状态,而是内存中数据组织方式的属性。因此,对于 API 中访问图像的每种机制,应用程序必须指定一个参数或结构成员,指示当图像被访问时,图像子资源被认为处于哪种图像布局。对于传输命令,这是命令的一个参数(参见清除命令复制命令)。对于用作帧缓冲附件,这是VkRenderPassCreateInfo的子结构中的一个成员(参见渲染过程)。对于在描述符集中使用,这是VkDescriptorImageInfo结构中的一个成员(参见描述符集更新)。

VK_IMAGE_LAYOUT_GENERAL 可以是一个有用的通用图像布局,但在某些情况下,必须使用专用的图像布局。一些例子包括

  • VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

  • VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR

  • VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR

  • VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR

  • VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR

虽然 VK_IMAGE_LAYOUT_GENERAL 表明所有类型的设备访问都是可能的,但这并不意味着所有内存访问模式在所有情况下都是安全的。常见的渲染过程数据竞争概述了一些数据竞争不可避免的情况。例如,当一个子资源同时用作附件和采样图像时(即,不是输入附件),VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 增加了 VK_IMAGE_LAYOUT_GENERAL 不具备的额外保证。

图像布局匹配规则

在任何命令缓冲区命令在任何队列上执行访问图像时,被访问的图像子资源的布局必须与通过控制这些访问的 API 指定的布局完全匹配,除非通过仅引用图像的单个方面的描述符访问具有深度/模板格式的图像,在这种情况下,以下宽松的匹配规则适用

  • 仅引用深度/模板图像的深度方面的描述符,只需要在深度方面的图像布局中匹配,因此 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL 被认为是匹配的。

  • 仅引用深度/模板图像的模板方面的描述符,只需要在模板方面的图像布局中匹配,因此 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMALVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL 被认为是匹配的。

当对图像子资源执行布局转换时,旧的布局值必须等于图像子资源的当前布局(在转换执行时),或者为 VK_IMAGE_LAYOUT_UNDEFINED(表示不需要保留图像子资源的内容)。转换中使用的新布局必须不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的每个图像子资源的图像布局取决于最后一次用作深度/模板附件渲染到图像子资源的采样位置,因此,每当发生图像子资源的布局转换时,应用程序必须提供最后一次用于渲染给定图像子资源的相同采样位置,否则图像子资源的深度方面的内容将变为未定义

此外,使用与最后一次对同一图像子资源范围的图像子资源执行深度写入不同的采样位置,从引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的图像子资源范围的深度/模板附件的深度读取,会返回未定义的值。

类似地,使用与最后一次对同一图像子资源范围的图像子资源执行深度写入不同的采样位置,对引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的图像子资源范围的深度/模板附件进行深度写入,会使这些图像子资源的深度方面的内容变为未定义

图像视图

图像对象不会被管道着色器直接访问以进行读取或写入图像数据。相反,使用表示图像子资源的连续范围并包含额外元数据的图像视图来实现此目的。视图必须在兼容类型的图像上创建,并且必须表示图像子资源的有效子集。

图像视图由 VkImageView 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)

VK_REMAINING_ARRAY_LAYERS 是用于图像视图的特殊常量值,表示图像中基础层之后的所有剩余数组层都应包含在视图中。

#define VK_REMAINING_ARRAY_LAYERS         (~0U)

VK_REMAINING_MIP_LEVELS 是用于图像视图的特殊常量值,表示图像中基础级别之后的所有剩余 mipmap 级别都应包含在视图中。

#define VK_REMAINING_MIP_LEVELS           (~0U)

可以创建的图像视图类型是

// Provided by VK_VERSION_1_0
typedef enum VkImageViewType {
    VK_IMAGE_VIEW_TYPE_1D = 0,
    VK_IMAGE_VIEW_TYPE_2D = 1,
    VK_IMAGE_VIEW_TYPE_3D = 2,
    VK_IMAGE_VIEW_TYPE_CUBE = 3,
    VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,
    VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,
    VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,
} VkImageViewType;

要创建图像视图,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateImageView(
    VkDevice                                    device,
    const VkImageViewCreateInfo*                pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkImageView*                                pView);
  • device 是创建图像视图的逻辑设备。

  • pCreateInfo 是一个指向 VkImageViewCreateInfo 结构的指针,该结构包含用于创建图像视图的参数。

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

  • pView 是一个指向 VkImageView 句柄的指针,其中返回生成的图像视图对象。

有效用法
  • VUID-vkCreateImageView-device-09667
    device 必须至少支持一个队列族,其中具有 VK_QUEUE_VIDEO_ENCODE_BIT_KHRVK_QUEUE_VIDEO_DECODE_BIT_KHRVK_QUEUE_COMPUTE_BITVK_QUEUE_GRAPHICS_BIT 功能之一

  • VUID-vkCreateImageView-image-09179
    VkImageViewCreateInfo::image 必须是从 device 创建的

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

  • VUID-vkCreateImageView-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkImageViewCreateInfo 结构的有效指针

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

  • VUID-vkCreateImageView-pView-parameter
    pView 必须是指向 VkImageView 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

VkImageViewCreateInfo 结构的定义如下

// Provided by VK_VERSION_1_0
typedef struct VkImageViewCreateInfo {
    VkStructureType            sType;
    const void*                pNext;
    VkImageViewCreateFlags     flags;
    VkImage                    image;
    VkImageViewType            viewType;
    VkFormat                   format;
    VkComponentMapping         components;
    VkImageSubresourceRange    subresourceRange;
} VkImageViewCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flagsVkImageViewCreateFlagBits 的位掩码,指定图像视图的其他参数。

  • image 是将要创建视图的 VkImage

  • viewType 是一个 VkImageViewType 值,指定图像视图的类型。

  • format 是一个 VkFormat,指定用于解释图像纹理块的格式和类型。

  • components 是一个 VkComponentMapping 结构,指定颜色分量的重新映射(或者深度或模板分量在转换为颜色分量之后)。

  • subresourceRange 是一个 VkImageSubresourceRange 结构,选择视图可访问的 mipmap 级别和数组层集。

某些 image 创建参数会被视图继承。特别是,图像视图的创建会继承隐式参数 usage,该参数指定了图像视图的允许用途,默认情况下,它采用在图像创建时 VkImageCreateInfo 中指定的对应 usage 参数的值。隐式 usage 可以通过向 pNext 链添加 VkImageViewUsageCreateInfo 结构体来覆盖,但视图的用途必须是图像用途的子集。如果 image 具有深度模板格式,并且在 VkImageCreateInfopNext 链中包含 VkImageStencilUsageCreateInfo 结构体创建,则用途将根据提供的 subresource.aspectMask 进行计算。

如果 image 是一个 3D 图像,则可以通过向 pNext 链添加 VkImageViewSlicedCreateInfoEXT 将其 Z 范围限制为子集。

如果 image 是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标志创建的,并且如果图像的 format 不是多平面,则 format 可以与图像的格式不同,但是如果 image 在创建时没有使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志,并且它们不相等,则它们必须兼容的。图像格式兼容性在格式兼容性类部分中定义。兼容格式的视图在像素坐标和内存位置之间将具有相同的映射,而不管 format 如何,只有位模式的解释会发生变化。

如果 image 是使用多平面格式创建的,并且图像视图的 aspectMaskVK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BITVK_IMAGE_ASPECT_PLANE_2_BIT 中的一个,则当用作帧缓冲附件时,该视图的方面掩码被认为等同于 VK_IMAGE_ASPECT_COLOR_BIT

当通过不同格式写入或读取时,旨在与一种视图格式一起使用的值可能不会被精确保留。例如,碰巧具有浮点数非规范值或 NaN 位模式的整数值,在通过浮点格式的视图写入或读取时可能会被刷新或规范化。类似地,通过带符号归一化格式写入的值,其位模式恰好等于 -2b 时,可能会更改为 -2b + 1,如 从归一化定点到浮点转换中所述。

如果 image 是使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志创建的,则 format 必须与图像的格式兼容,如上所述;或者必须是一种未压缩的格式,在这种情况下,它必须与图像的格式尺寸兼容。在这种情况下,生成的图像视图的像素尺寸等于所选 mip 级别尺寸除以压缩像素块大小并向上取整。

VkComponentMapping components 成员描述了从图像组件到着色器图像指令返回的向量组件的重新映射。此重新映射必须是存储图像描述符、输入附件描述符、帧缓冲附件以及任何使用组合图像采样器并启用 采样器 Y′CBCR 转换VkImageView 的恒等置换。

如果图像视图将与支持 采样器 Y′CBCR 转换的采样器一起使用,则与创建采样器时使用的类型为 VkSamplerYcbcrConversion相同定义对象必须通过包含在 VkImageViewCreateInfopNext 链中的 VkSamplerYcbcrConversionInfo 传递给 vkCreateImageView。相反,如果将 VkSamplerYcbcrConversion 对象传递给 vkCreateImageView,则在采样图像时必须使用相同定义的 VkSamplerYcbcrConversion 对象。

如果图像具有 多平面 formatsubresourceRange.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,并且 usage 包括 VK_IMAGE_USAGE_SAMPLED_BIT,则 format 必须与图像的 format 相同,并且要与图像视图一起使用的采样器必须启用 采样器 Y′CBCR 转换

当在 视频编码 操作中使用此类图像时,采样器 Y′CBCR 转换不起作用。

如果 image 是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 创建的,并且图像具有多平面 format,并且如果 subresourceRange.aspectMaskVK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BITVK_IMAGE_ASPECT_PLANE_2_BIT,则 format 必须与图像的相应平面兼容,并且要与图像视图一起使用的采样器不能启用采样器 Y′CBCR 转换。单平面图像视图的 widthheight 必须平面兼容性中列出的方式从多平面图像的维度中得出。

任何图像平面的视图,其纹素坐标和内存位置之间的映射,都与颜色分量的映射相同,但要服从纹素坐标与较低分辨率平面之间关系的公式,如色度重建中所述。也就是说,如果R或B平面相对于多平面图像的G平面具有降低的分辨率,则图像视图使用降低分辨率平面的(uplane, vplane)非归一化坐标进行操作,并且这些坐标访问与颜色分量的(ucolor, vcolor)非归一化坐标相同的内存位置,色度重建操作在相同的(uplane, vplane)或(iplane, jplane)坐标上进行。

表 1. 图像类型和图像视图类型兼容性要求
图像视图类型 兼容的图像类型

VK_IMAGE_VIEW_TYPE_1D

VK_IMAGE_TYPE_1D

VK_IMAGE_VIEW_TYPE_1D_ARRAY

VK_IMAGE_TYPE_1D

VK_IMAGE_VIEW_TYPE_2D

VK_IMAGE_TYPE_2D , VK_IMAGE_TYPE_3D

VK_IMAGE_VIEW_TYPE_2D_ARRAY

VK_IMAGE_TYPE_2D , VK_IMAGE_TYPE_3D

VK_IMAGE_VIEW_TYPE_CUBE

VK_IMAGE_TYPE_2D

VK_IMAGE_VIEW_TYPE_CUBE_ARRAY

VK_IMAGE_TYPE_2D

VK_IMAGE_VIEW_TYPE_3D

VK_IMAGE_TYPE_3D

有效用法
  • VUID-VkImageViewCreateInfo-image-01003
    如果 image 创建时没有使用 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,那么 viewType 必须 不是 VK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAY

  • VUID-VkImageViewCreateInfo-viewType-01004
    如果 imageCubeArray 功能未启用,则 viewType 必须 不是 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY

  • VUID-VkImageViewCreateInfo-image-06723
    如果 image 创建时使用了 VK_IMAGE_TYPE_3D 但没有设置 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,那么 viewType 必须 不是 VK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-image-06728
    如果 image 创建时使用了 VK_IMAGE_TYPE_3D 但没有设置 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BITVK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT,那么 viewType 必须 不是 VK_IMAGE_VIEW_TYPE_2D

  • VUID-VkImageViewCreateInfo-image-04970
    如果 image 创建时使用了 VK_IMAGE_TYPE_3DviewTypeVK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY,那么 subresourceRange.levelCount 必须 为 1

  • VUID-VkImageViewCreateInfo-image-04972
    如果 image 创建时使用的 samples 值不等于 VK_SAMPLE_COUNT_1_BIT,那么 viewType 必须VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-image-04441
    创建 image 时,其 usage必须 包含至少一个在图像视图的有效图像用途列表中定义的用途

  • VUID-VkImageViewCreateInfo-None-02273
    结果图像视图的格式特性必须 包含至少一个位

  • VUID-VkImageViewCreateInfo-usage-02274
    如果 usage 包含 VK_IMAGE_USAGE_SAMPLED_BIT,那么结果图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT

  • VUID-VkImageViewCreateInfo-usage-02275
    如果 usage 包含 VK_IMAGE_USAGE_STORAGE_BIT,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT

  • VUID-VkImageViewCreateInfo-usage-08931
    如果 usage 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITVK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkImageViewCreateInfo-usage-02277
    如果 usage 包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkImageViewCreateInfo-image-08333
    如果 image 创建时使用了 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHRusage 包含 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR

  • VUID-VkImageViewCreateInfo-image-08334
    如果 image 创建时使用了 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHRusage 包含 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR

  • VUID-VkImageViewCreateInfo-image-08335
    如果 image 创建时使用了 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,那么 usage 必须 不包含 VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR

  • VUID-VkImageViewCreateInfo-image-08336
    如果 image 创建时使用了 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHRusage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR

  • VUID-VkImageViewCreateInfo-image-08337
    如果 image 创建时使用了 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHRusage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR

  • VUID-VkImageViewCreateInfo-image-08338
    如果 image 创建时使用了 VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,那么 usage 必须 不包含 VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR

  • VUID-VkImageViewCreateInfo-usage-10259
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR

  • VUID-VkImageViewCreateInfo-usage-10260
    如果 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR

  • VUID-VkImageViewCreateInfo-usage-08932
    如果 usage 包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,并且满足以下任一条件:

    那么图像视图的格式特性必须 包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BITVK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV 中的至少一个

  • VUID-VkImageViewCreateInfo-subresourceRange-01478
    subresourceRange.baseMipLevel 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkImageViewCreateInfo-subresourceRange-01718
    如果 subresourceRange.levelCount 不是 VK_REMAINING_MIP_LEVELS,则 subresourceRange.baseMipLevel + subresourceRange.levelCount 必须小于或等于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkImageViewCreateInfo-image-02571
    如果 image 是使用包含 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXTusage 创建的,则 subresourceRange.levelCount 必须1

  • VUID-VkImageViewCreateInfo-image-06724
    如果 image 不是使用 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BITVK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT 设置创建的 3D 图像,或者 viewType 不是 VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 subresourceRange.baseArrayLayer 必须小于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkImageViewCreateInfo-subresourceRange-06725
    如果 subresourceRange.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,且 image 不是使用 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BITVK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT 设置创建的 3D 图像,或者 viewType 不是 VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 subresourceRange.layerCount 必须非零,并且 subresourceRange.baseArrayLayer + subresourceRange.layerCount 必须小于或等于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkImageViewCreateInfo-image-02724
    如果 image 是使用 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT 设置创建的 3D 图像,并且 viewTypeVK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 subresourceRange.baseArrayLayer 必须小于根据 图像 Mip 级别大小调整中定义的公式,从创建 image 时在 VkImageCreateInfo 中指定的 baseMipLevelextent.depth 计算出的深度。

  • VUID-VkImageViewCreateInfo-subresourceRange-02725
    如果 subresourceRange.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,且 image 是使用 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT 设置创建的 3D 图像,并且 viewTypeVK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 subresourceRange.layerCount 必须非零,并且 subresourceRange.baseArrayLayer + subresourceRange.layerCount 必须小于或等于根据 图像 Mip 级别大小调整中定义的公式,从创建 image 时在 VkImageCreateInfo 中指定的 baseMipLevelextent.depth 计算出的深度。

  • VUID-VkImageViewCreateInfo-image-01761
    如果 image 是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标志创建的,但没有 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志,并且如果 imageformat 不是多平面格式,则 format 必须与用于创建 imageformat 兼容,如 格式兼容性类中所定义。

  • VUID-VkImageViewCreateInfo-image-01583
    如果 image 是使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志创建的,则 format 必须与用于创建 imageformat 兼容,或者 必须是与该 format 大小兼容的未压缩格式。

  • VUID-VkImageViewCreateInfo-image-07072
    如果 image 是使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志创建的,并且 format 是未压缩格式,则 subresourceRangelevelCount 成员 必须1

  • VUID-VkImageViewCreateInfo-image-09487
    如果 image 是使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志创建的,且 VkPhysicalDeviceMaintenance6Properties::blockTexelViewCompatibleMultipleLayers 属性不是 VK_TRUE,并且 format 是未压缩格式,则 subresourceRangelayerCount 成员 必须1

  • VUID-VkImageViewCreateInfo-pNext-01585
    如果 VkImageFormatListCreateInfo 结构包含在创建 image 时使用的 VkImageCreateInfo 结构的 pNext 链中,并且 VkImageFormatListCreateInfo::viewFormatCount 不为零,则 format 必须VkImageFormatListCreateInfo::pViewFormats 中的格式之一。

  • VUID-VkImageViewCreateInfo-image-01586
    如果 image 是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标志创建的,如果 imageformat多平面格式,并且如果 subresourceRange.aspectMask多平面方面掩码位之一,则 format 必须subresourceRange.aspectMask 指示的 image format 平面的 VkFormat 兼容,如多平面格式平面的兼容格式中所定义。

  • VUID-VkImageViewCreateInfo-subresourceRange-07818
    subresourceRange.aspectMask 必须最多只能有 1 个有效的多平面方面掩码位。

  • VUID-VkImageViewCreateInfo-image-01762
    如果 image 不是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标志创建的,或者如果 imageformat多平面格式,并且如果 subresourceRange.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 format 必须与用于创建 imageformat 相同。

  • VUID-VkImageViewCreateInfo-format-06415
    如果图像视图需要采样器 Y′CBCR 转换,并且 usage 包含 VK_IMAGE_USAGE_SAMPLED_BIT,则 pNext必须包含一个 VkSamplerYcbcrConversionInfo 结构体,其转换值不能为 VK_NULL_HANDLE

  • VUID-VkImageViewCreateInfo-format-04714
    如果 format 具有 _422_420 后缀,则 image 必须已创建为宽度是 2 的倍数。

  • VUID-VkImageViewCreateInfo-format-04715
    如果 format 具有 _420 后缀,则 image 必须已创建为高度是 2 的倍数。

  • VUID-VkImageViewCreateInfo-pNext-01970
    如果 pNext 链包含一个 VkSamplerYcbcrConversionInfo 结构体,其 conversion 值不是 VK_NULL_HANDLE,则 components 的所有成员必须具有单位换算

  • VUID-VkImageViewCreateInfo-pNext-06658
    如果 pNext 链包含一个 VkSamplerYcbcrConversionInfo 结构体,其 conversion 值不是 VK_NULL_HANDLE,则 format 必须VkSamplerYcbcrConversionCreateInfo::format 中使用的格式相同。

  • VUID-VkImageViewCreateInfo-image-01020
    如果 image 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkImageViewCreateInfo-subResourceRange-01021
    viewType 必须image 的类型兼容,如视图类型兼容性表所示。

  • VUID-VkImageViewCreateInfo-image-02399
    如果 image 具有Android 外部格式,则 format 必须VK_FORMAT_UNDEFINED

  • VUID-VkImageViewCreateInfo-image-02400
    如果 image 具有Android 外部格式,则 pNext必须包含一个 VkSamplerYcbcrConversionInfo 结构体,其 conversion 对象是使用与 image 相同的外部格式创建的。

  • VUID-VkImageViewCreateInfo-image-02401
    如果 image 具有Android 外部格式,则 components 的所有成员必须单位换算

  • VUID-VkImageViewCreateInfo-image-08957
    如果 image 具有QNX Screen 外部格式,则 format 必须VK_FORMAT_UNDEFINED

  • VUID-VkImageViewCreateInfo-image-08958
    如果 image 具有QNX Screen 外部格式,则 pNext必须包含一个 VkSamplerYcbcrConversionInfo 结构体,其 conversion 对象是使用与 image 相同的外部格式创建的。

  • VUID-VkImageViewCreateInfo-image-08959
    如果 image 具有QNX Screen 外部格式,则 components 的所有成员必须单位换算

  • VUID-VkImageViewCreateInfo-image-02086
    如果 image 是使用包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHRusage 创建的,则 viewType 必须VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-image-02087
    如果启用了shadingRateImage 功能,并且如果 image 是使用包含 VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NVusage 创建的,则 format 必须VK_FORMAT_R8_UINT

  • VUID-VkImageViewCreateInfo-usage-04550
    如果启用了attachmentFragmentShadingRate 功能,并且图像视图的 usage 包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,则图像视图的格式功能必须包含 VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkImageViewCreateInfo-usage-04551
    如果启用了attachmentFragmentShadingRate 功能,图像视图的 usage 包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,并且layeredShadingRateAttachmentsVK_FALSE,则 subresourceRange.layerCount 必须1

  • VUID-VkImageViewCreateInfo-flags-02572
    如果没有启用fragmentDensityMapDynamic 功能,则 flags 必须不包含 VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT

  • VUID-VkImageViewCreateInfo-flags-03567
    如果没有启用fragmentDensityMapDeferred 功能,则 flags 必须不包含 VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT

  • VUID-VkImageViewCreateInfo-flags-03568
    如果 flags 包含 VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT,则 flags 必须不包含 VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT

  • VUID-VkImageViewCreateInfo-image-03569
    如果 image 在创建时 flags 包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT 并且 usage 包含 VK_IMAGE_USAGE_SAMPLED_BIT,则 subresourceRange.layerCount 必须小于或等于 VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::maxSubsampledArrayLayers

  • VUID-VkImageViewCreateInfo-invocationMask-04993
    如果启用了 invocationMask 特性,并且如果 image 在创建时 usage 包含 VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI,则 format 必须VK_FORMAT_R8_UINT

  • VUID-VkImageViewCreateInfo-flags-04116
    如果 flags 不包含 VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT 并且 image 在创建时 usage 包含 VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT,则其 flags 必须不包含 VK_IMAGE_CREATE_PROTECTED_BITVK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BITVK_IMAGE_CREATE_SPARSE_ALIASED_BIT 中的任何一个。

  • VUID-VkImageViewCreateInfo-pNext-02662
    如果 pNext 链包含 VkImageViewUsageCreateInfo 结构体,并且 image 在创建时 pNext 链中没有包含 VkImageStencilUsageCreateInfo 结构体,则其 usage 成员 必须不包含在用于创建 imageVkImageCreateInfo 结构体的 usage 成员中未设置的任何位。

  • VUID-VkImageViewCreateInfo-pNext-02663
    如果 pNext 链包含 VkImageViewUsageCreateInfo 结构体,image 在创建时 pNext 链中包含 VkImageStencilUsageCreateInfo 结构体,并且 subresourceRange.aspectMask 包含 VK_IMAGE_ASPECT_STENCIL_BIT,则 VkImageViewUsageCreateInfo 结构体的 usage 成员 必须不包含在用于创建 imageVkImageStencilUsageCreateInfo 结构体的 usage 成员中未设置的任何位。

  • VUID-VkImageViewCreateInfo-pNext-02664
    如果 pNext 链包含 VkImageViewUsageCreateInfo 结构体,image 在创建时 pNext 链中包含 VkImageStencilUsageCreateInfo 结构体,并且 subresourceRange.aspectMask 包含除 VK_IMAGE_ASPECT_STENCIL_BIT 之外的位,则 VkImageViewUsageCreateInfo 结构体的 usage 成员 必须不包含在用于创建 imageVkImageCreateInfo 结构体的 usage 成员中未设置的任何位。

  • VUID-VkImageViewCreateInfo-imageViewType-04973
    如果 viewTypeVK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_3D,并且 subresourceRange.layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则 subresourceRange.layerCount 必须为 1。

  • VUID-VkImageViewCreateInfo-imageViewType-04974
    如果 viewTypeVK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_3D,并且 subresourceRange.layerCountVK_REMAINING_ARRAY_LAYERS,则剩余的层数 必须为 1。

  • VUID-VkImageViewCreateInfo-viewType-02960
    如果 viewTypeVK_IMAGE_VIEW_TYPE_CUBE 并且 subresourceRange.layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则 subresourceRange.layerCount 必须6

  • VUID-VkImageViewCreateInfo-viewType-02961
    如果 viewTypeVK_IMAGE_VIEW_TYPE_CUBE_ARRAY 并且 subresourceRange.layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则 subresourceRange.layerCount 必须6 的倍数。

  • VUID-VkImageViewCreateInfo-viewType-02962
    如果 viewTypeVK_IMAGE_VIEW_TYPE_CUBE 并且 subresourceRange.layerCountVK_REMAINING_ARRAY_LAYERS,则剩余的层数 必须6

  • VUID-VkImageViewCreateInfo-viewType-02963
    如果 viewTypeVK_IMAGE_VIEW_TYPE_CUBE_ARRAY 并且 subresourceRange.layerCountVK_REMAINING_ARRAY_LAYERS,则剩余的层数 必须6 的倍数。

  • VUID-VkImageViewCreateInfo-imageViewFormatSwizzle-04465
    如果启用了 VK_KHR_portability_subset 扩展,并且 VkPhysicalDevicePortabilitySubsetFeaturesKHR::imageViewFormatSwizzleVK_FALSE,则 components 的所有元素 必须具有恒等置换

  • VUID-VkImageViewCreateInfo-imageViewFormatReinterpretation-04466
    如果启用了 VK_KHR_portability_subset 扩展,并且 VkPhysicalDevicePortabilitySubsetFeaturesKHR::imageViewFormatReinterpretationVK_FALSE,则 format 中的 VkFormat 必须不包含与 image 中的 VkImage 格式不同的组件数量,或每个组件中不同的位数。

  • VUID-VkImageViewCreateInfo-image-04817
    如果 image 在创建时 usage 包含 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHRVK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHRVK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,则 viewType 必须VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-image-04818
    如果 image 在创建时 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,则 viewType 必须VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-image-10261
    如果 image 在创建时 usage 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则 viewType 必须VK_IMAGE_VIEW_TYPE_2DVK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-flags-08106
    如果 flags 包含 VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,则 descriptorBufferCaptureReplay 功能必须启用。

  • VUID-VkImageViewCreateInfo-pNext-08107
    如果 pNext 链包含 VkOpaqueCaptureDescriptorDataCreateInfoEXT 结构体,则 flags 必须包含 VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT

  • VUID-VkImageViewCreateInfo-pNext-06787
    如果 pNext 链包含 VkExportMetalObjectCreateInfoEXT 结构,则其 exportObjectType 成员必须VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT

  • VUID-VkImageViewCreateInfo-pNext-06944
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 textureSampleWeighted 功能必须启用。

  • VUID-VkImageViewCreateInfo-pNext-06945
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 image 必须在创建时,其 usage 包含 VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM

  • VUID-VkImageViewCreateInfo-pNext-06946
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 components 对于所有组件必须VK_COMPONENT_SWIZZLE_IDENTITY

  • VUID-VkImageViewCreateInfo-pNext-06947
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 subresourceRange.aspectMask 必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageViewCreateInfo-pNext-06948
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 subresourceRange.levelCount 必须1

  • VUID-VkImageViewCreateInfo-pNext-06949
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 viewType 必须VK_IMAGE_VIEW_TYPE_1D_ARRAYVK_IMAGE_VIEW_TYPE_2D_ARRAY

  • VUID-VkImageViewCreateInfo-pNext-06950
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且如果 viewTypeVK_IMAGE_VIEW_TYPE_1D_ARRAY,则 image 必须在创建时,其 imageTypeVK_IMAGE_TYPE_1D

  • VUID-VkImageViewCreateInfo-pNext-06951
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且 viewTypeVK_IMAGE_VIEW_TYPE_1D_ARRAY,则 subresourceRange.layerCount 必须等于 2

  • VUID-VkImageViewCreateInfo-pNext-06952
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且 viewTypeVK_IMAGE_VIEW_TYPE_1D_ARRAY,则 image 必须在创建时,其 width 大于或等于 \((numPhases \times \mathbin{max}\left( \mathbin{align}\left(filterSize.width,4\right), filterSize.height\right))\)。

  • VUID-VkImageViewCreateInfo-pNext-06953
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且如果 viewTypeVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 image 必须在创建时,其 imageTypeVK_IMAGE_TYPE_2D

  • VUID-VkImageViewCreateInfo-pNext-06954
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且 viewTypeVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 subresourceRange.layerCount 必须大于或等于 numPhases

  • VUID-VkImageViewCreateInfo-pNext-06955
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且 viewTypeVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 image 必须在创建时,其 width 大于或等于 filterSize.width

  • VUID-VkImageViewCreateInfo-pNext-06956
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,且 viewTypeVK_IMAGE_VIEW_TYPE_2D_ARRAY,则 image 必须在创建时,其 height 大于或等于 filterSize.height

  • VUID-VkImageViewCreateInfo-pNext-06957
    如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构体,则 VkImageViewSampleWeightCreateInfoQCOM::filterSize.height 必须小于或等于 VkPhysicalDeviceImageProcessingPropertiesQCOM::maxWeightFilterDimension.height

  • VUID-VkImageViewCreateInfo-subresourceRange-09594
    subresourceRange.aspectMask 必须对于 image 创建时使用的 format 有效。

有效用法(隐式)

VkImageViewCreateInfo::flags 中可以设置的位,用于指定图像视图的附加参数,如下所示:

// Provided by VK_VERSION_1_0
typedef enum VkImageViewCreateFlagBits {
  // Provided by VK_EXT_fragment_density_map
    VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT = 0x00000001,
  // Provided by VK_EXT_descriptor_buffer
    VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000004,
  // Provided by VK_EXT_fragment_density_map2
    VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT = 0x00000002,
} VkImageViewCreateFlagBits;
  • VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT 指定在 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT 阶段,设备将读取片段密度图。

  • VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT 指定在记录渲染过程的主命令缓冲区的 vkEndCommandBuffer 期间,主机将读取片段密度图。

  • VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 指定图像视图在捕获和重放时(例如,用于跟踪捕获和重放)可以与描述符缓冲区一起使用,有关更多详细信息,请参见VkOpaqueCaptureDescriptorDataCreateInfoEXT

// Provided by VK_VERSION_1_0
typedef VkFlags VkImageViewCreateFlags;

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

与父图像的 usage 标志相比,可以通过将 VkImageViewUsageCreateInfo 结构体添加到 VkImageViewCreateInfopNext 链中来限制创建的图像视图的用法集。

VkImageViewUsageCreateInfo 结构体定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkImageViewUsageCreateInfo {
    VkStructureType      sType;
    const void*          pNext;
    VkImageUsageFlags    usage;
} VkImageViewUsageCreateInfo;

或等效形式:

// Provided by VK_KHR_maintenance2
typedef VkImageViewUsageCreateInfo VkImageViewUsageCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • usage 是一个 VkImageUsageFlagBits 的位掩码,指定图像视图允许的用法。

当此结构体链接到 VkImageViewCreateInfo 时,usage 字段会覆盖从图像创建时继承的隐式 usage 参数,并使用其值来确定 VkImageViewCreateInfo 的有效使用条件。

有效用法(隐式)
  • VUID-VkImageViewUsageCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO

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

  • VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask
    usage 必须 不能为 0

通过将 VkImageViewSlicedCreateInfoEXT 结构体添加到 VkImageViewCreateInfopNext 链中,可以将创建的图像视图的 3D 切片范围限制为父图像的 Z 范围的子集。

VkImageViewSlicedCreateInfoEXT 结构体定义如下:

// Provided by VK_EXT_image_sliced_view_of_3d
typedef struct VkImageViewSlicedCreateInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           sliceOffset;
    uint32_t           sliceCount;
} VkImageViewSlicedCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • sliceOffset 是图像视图可访问的第一个 3D 切片的 Z 偏移量。

  • sliceCount 是图像视图可访问的 3D 切片数量。

当此结构体链接到 VkImageViewCreateInfo 时,sliceOffset 字段将被视为切片视图的 Z 偏移量,sliceCount 指定范围。使用 Z 坐标为 0 的着色器访问将访问图像中与 sliceOffset 相对应的深度切片,并且在着色器中,视图的最大边界内 Z 坐标为 sliceCount - 1

切片的 3D 视图 必须仅与单个 mip 级别一起使用。切片坐标是用于创建图像视图的 subresourceRange.baseMipLevel 中的整数坐标。

有效的视图深度等于用于创建此视图的 imageextent.depth,并通过 图像 Mip 级别大小调整 中指定的 subresourceRange.baseMipLevel 进行调整。

如果着色器使用 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE 类型的描述符,则对此图像视图的着色器访问仅受 VkImageViewSlicedCreateInfoEXT 的影响。 对于使用任何其他描述符类型的访问,将忽略 VkImageViewSlicedCreateInfoEXT 的内容;相反,将 sliceOffset 视为等于 0,并将 sliceCount 视为等于 VK_REMAINING_3D_SLICES_EXT

有效用法
  • VUID-VkImageViewSlicedCreateInfoEXT-sliceOffset-07867
    sliceOffset 必须小于 图像 Mip 级别大小调整 中指定的有效视图深度

  • VUID-VkImageViewSlicedCreateInfoEXT-sliceCount-07868
    如果 sliceCount 不是 VK_REMAINING_3D_SLICES_EXT,则它 必须是非零的,并且 sliceOffset + sliceCount 必须小于或等于 图像 Mip 级别大小调整 中指定的有效视图深度

  • VUID-VkImageViewSlicedCreateInfoEXT-image-07869
    image 必须使用等于 VK_IMAGE_TYPE_3DimageType 创建

  • VUID-VkImageViewSlicedCreateInfoEXT-viewType-07909
    viewType 必须VK_IMAGE_VIEW_TYPE_3D

  • VUID-VkImageViewSlicedCreateInfoEXT-None-07870
    图像视图 必须只引用 1 个 mip 级别

  • VUID-VkImageViewSlicedCreateInfoEXT-None-07871
    必须启用 imageSlicedViewOf3D 特性

有效用法(隐式)
  • VUID-VkImageViewSlicedCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT

VK_REMAINING_3D_SLICES_EXT 是用于 VkImageViewSlicedCreateInfoEXT::sliceCount 的特殊常量值,表示应将图像中指定第一个切片偏移量之后的所有剩余 3D 切片都包含在视图中。

#define VK_REMAINING_3D_SLICES_EXT        (~0U)

VkImageSubresourceRange 结构体定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkImageSubresourceRange {
    VkImageAspectFlags    aspectMask;
    uint32_t              baseMipLevel;
    uint32_t              levelCount;
    uint32_t              baseArrayLayer;
    uint32_t              layerCount;
} VkImageSubresourceRange;
  • aspectMask 是一个 VkImageAspectFlagBits 的位掩码,指定图像的哪个或哪些方面包含在视图中。

  • baseMipLevel 是视图可访问的第一个 mipmap 级别。

  • levelCount 是视图可访问的 mipmap 级别数(从 baseMipLevel 开始)。

  • baseArrayLayer 是视图可访问的第一个数组层。

  • layerCount 是视图可访问的数组层数(从 baseArrayLayer 开始)。

mipmap 级别和数组层的数量 必须是图像中图像子资源的子集。如果应用程序想在 baseMipLevelbaseArrayLayer 之后使用图像中的所有 mip 级别或层,则它 可以levelCountlayerCount 设置为特殊值 VK_REMAINING_MIP_LEVELSVK_REMAINING_ARRAY_LAYERS,而无需知道 mip 级别或层的确切数量。

对于立方体和立方体数组图像视图,图像视图的层从 baseArrayLayer 开始,按照 +X、-X、+Y、-Y、+Z、-Z 的顺序对应各个面。对于立方体数组,每连续的六层构成一个立方体,因此立方体贴图数组视图中的立方体贴图数量为 *layerCount / 6*,并且图像数组层 (baseArrayLayer + i) 是立方体 *i / 6* 的面索引 (i mod 6)。如果视图中的层数(无论是在 layerCount 中显式设置还是由 VK_REMAINING_ARRAY_LAYERS 隐含)不是 6 的倍数,则**必须**不访问数组中的最后一个立方体贴图。

如果 format 分别是颜色、仅深度或仅模板格式,则 aspectMask **必须**仅为 VK_IMAGE_ASPECT_COLOR_BITVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,除非 format 是一个多平面格式。如果使用具有深度和模板组件的深度/模板格式,则 aspectMask **必须**至少包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 中的一个,并且**可以**同时包含两者。

当使用 VkImageSubresourceRange 结构来选择 3D 图像的 mip 级别切片子集,以便创建以 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT 创建的 3D 图像的 2D 或 2D 数组图像视图时,baseArrayLayerlayerCount 指定创建的图像视图中包含的第一个切片索引和切片数量。这样的图像视图**可以**用作帧缓冲附件,仅引用选定的 mip 级别的指定切片范围。但是,在渲染通道实例期间对此类附件视图执行的任何布局转换仍然适用于引用的整个子资源,其中包括所选 mip 级别的所有切片。

当使用深度/模板图像的图像视图来填充描述符集时(例如,用于着色器中的采样,或用作输入附件),aspectMask **必须**仅包含一个位,该位选择图像视图是用于深度读取(即,在着色器中使用浮点采样器或输入附件)还是模板读取(即,在着色器中使用无符号整数采样器或输入附件)。当深度/模板图像的图像视图用作深度/模板帧缓冲附件时,将忽略 aspectMask,并且将使用深度和模板图像子资源。

创建 VkImageView 时,如果在采样器中启用了采样器 Y′CBCR 转换,则 VkImageView 使用的 subresourceRangeaspectMask **必须**为 VK_IMAGE_ASPECT_COLOR_BIT

创建 VkImageView 时,如果在采样器中未启用采样器 Y′CBCR 转换,并且图像的 format多平面,则图像**必须**已使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 创建,并且 VkImageViewsubresourceRangeaspectMask **必须**为 VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BITVK_IMAGE_ASPECT_PLANE_2_BIT

有效用法
  • VUID-VkImageSubresourceRange-levelCount-01720
    如果 levelCount 不是 VK_REMAINING_MIP_LEVELS,则它**必须**大于 0

  • VUID-VkImageSubresourceRange-layerCount-01721
    如果 layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则它**必须**大于 0

  • VUID-VkImageSubresourceRange-aspectMask-01670
    如果 aspectMask 包含 VK_IMAGE_ASPECT_COLOR_BIT,则它**必须**不包含 VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BITVK_IMAGE_ASPECT_PLANE_2_BIT 中的任何一个

  • VUID-VkImageSubresourceRange-aspectMask-02278
    对于任何索引 *i*,aspectMask **必须**不包含 VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT

有效用法(隐式)
  • VUID-VkImageSubresourceRange-aspectMask-parameter
    aspectMask 必须VkImageAspectFlagBits 值的有效组合

  • VUID-VkImageSubresourceRange-aspectMask-requiredbitmask
    aspectMask 必须不能为 0

可以在方面掩码中设置以指定图像的方面以用于诸如标识子资源之类的目的的位是:

// Provided by VK_VERSION_1_0
typedef enum VkImageAspectFlagBits {
    VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
    VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
    VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
    VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020,
  // Provided by VK_VERSION_1_1
    VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040,
  // Provided by VK_VERSION_1_3
    VK_IMAGE_ASPECT_NONE = 0,
  // Provided by VK_EXT_image_drm_format_modifier
    VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0x00000080,
  // Provided by VK_EXT_image_drm_format_modifier
    VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0x00000100,
  // Provided by VK_EXT_image_drm_format_modifier
    VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0x00000200,
  // Provided by VK_EXT_image_drm_format_modifier
    VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0x00000400,
  // Provided by VK_KHR_sampler_ycbcr_conversion
    VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT,
  // Provided by VK_KHR_sampler_ycbcr_conversion
    VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT,
  // Provided by VK_KHR_sampler_ycbcr_conversion
    VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT,
  // Provided by VK_KHR_maintenance4
    VK_IMAGE_ASPECT_NONE_KHR = VK_IMAGE_ASPECT_NONE,
} VkImageAspectFlagBits;
  • VK_IMAGE_ASPECT_NONE 指定无图像方面,或者图像方面不适用。

  • VK_IMAGE_ASPECT_COLOR_BIT 指定颜色方面。

  • VK_IMAGE_ASPECT_DEPTH_BIT 指定深度方面。

  • VK_IMAGE_ASPECT_STENCIL_BIT 指定模板方面。

  • VK_IMAGE_ASPECT_METADATA_BIT 指定用于稀疏资源操作的元数据方面。

  • VK_IMAGE_ASPECT_PLANE_0_BIT 指定 *多平面* 图像格式的平面 0。

  • VK_IMAGE_ASPECT_PLANE_1_BIT 指定 *多平面* 图像格式的平面 1。

  • VK_IMAGE_ASPECT_PLANE_2_BIT 指定 *多平面* 图像格式的平面 2。

  • VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT 指定 *内存平面* 0。

  • VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT 指定 *内存平面* 1。

  • VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT 指定 *内存平面* 2。

  • VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT 指定 *内存平面* 3。

// Provided by VK_VERSION_1_0
typedef VkFlags VkImageAspectFlags;

VkImageAspectFlags 是一种用于设置零个或多个VkImageAspectFlagBits的掩码的位掩码类型。

VkComponentMapping 结构的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkComponentMapping {
    VkComponentSwizzle    r;
    VkComponentSwizzle    g;
    VkComponentSwizzle    b;
    VkComponentSwizzle    a;
} VkComponentMapping;
  • r 是一个VkComponentSwizzle,指定放置在输出向量的 R 分量中的分量值。

  • g 是一个VkComponentSwizzle,指定放置在输出向量的 G 分量中的分量值。

  • b 是一个VkComponentSwizzle,指定放置在输出向量的 B 分量中的分量值。

  • a 是一个VkComponentSwizzle,指定放置在输出向量的 A 分量中的分量值。

有效用法(隐式)

VkComponentMapping 的成员的可能值,指定放置在输出向量的每个分量中的分量值,如下所示:

// Provided by VK_VERSION_1_0
typedef enum VkComponentSwizzle {
    VK_COMPONENT_SWIZZLE_IDENTITY = 0,
    VK_COMPONENT_SWIZZLE_ZERO = 1,
    VK_COMPONENT_SWIZZLE_ONE = 2,
    VK_COMPONENT_SWIZZLE_R = 3,
    VK_COMPONENT_SWIZZLE_G = 4,
    VK_COMPONENT_SWIZZLE_B = 5,
    VK_COMPONENT_SWIZZLE_A = 6,
} VkComponentSwizzle;
  • VK_COMPONENT_SWIZZLE_IDENTITY 指定该分量设置为恒等置换。

  • VK_COMPONENT_SWIZZLE_ZERO 指定该分量设置为零。

  • VK_COMPONENT_SWIZZLE_ONE 指定该分量设置为 1 或 1.0,具体取决于图像视图格式的类型是整数还是浮点数,由每个 VkFormat格式定义部分确定。

  • VK_COMPONENT_SWIZZLE_R 指定该分量设置为图像的 R 分量的值。

  • VK_COMPONENT_SWIZZLE_G 指定该分量设置为图像的 G 分量的值。

  • VK_COMPONENT_SWIZZLE_B 指定该分量设置为图像的 B 分量的值。

  • VK_COMPONENT_SWIZZLE_A 指定该分量设置为图像的 A 分量的值。

在分量上设置恒等置换等同于在该分量上设置恒等映射。即:

表 2. 等效于 VK_COMPONENT_SWIZZLE_IDENTITY 的分量映射
分量 恒等映射

components.r

VK_COMPONENT_SWIZZLE_R

components.g

VK_COMPONENT_SWIZZLE_G

components.b

VK_COMPONENT_SWIZZLE_B

components.a

VK_COMPONENT_SWIZZLE_A

如果 pNext 链包含 VkImageViewASTCDecodeModeEXT 结构,则该结构包含一个参数,指定使用 ASTC 压缩格式的图像视图的解码模式。

VkImageViewASTCDecodeModeEXT 结构定义如下:

// Provided by VK_EXT_astc_decode_mode
typedef struct VkImageViewASTCDecodeModeEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkFormat           decodeMode;
} VkImageViewASTCDecodeModeEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • decodeMode 是用于解码 ASTC 压缩格式的中间格式。

有效用法
  • VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230
    decodeMode 必须VK_FORMAT_R16G16B16A16_SFLOATVK_FORMAT_R8G8B8A8_UNORMVK_FORMAT_E5B9G9R9_UFLOAT_PACK32 中的一个

  • VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231
    如果未启用 decodeModeSharedExponent 功能,则 decodeMode 不得VK_FORMAT_E5B9G9R9_UFLOAT_PACK32

  • VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02232
    如果 decodeModeVK_FORMAT_R8G8B8A8_UNORM,则图像视图不得包含使用任何 ASTC HDR 模式的块

  • VUID-VkImageViewASTCDecodeModeEXT-format-04084
    图像视图的 format 必须ASTC 压缩图像格式之一

如果 format 使用 sRGB 编码,则 decodeMode 不起作用。

有效用法(隐式)
  • VUID-VkImageViewASTCDecodeModeEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT

  • VUID-VkImageViewASTCDecodeModeEXT-decodeMode-parameter
    decodeMode 必须是有效的 VkFormat

如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构,则该结构包含一个参数,用于指定 权重图像采样中使用的权重图像视图的参数。

VkImageViewSampleWeightCreateInfoQCOM 结构定义如下:

// Provided by VK_QCOM_image_processing
typedef struct VkImageViewSampleWeightCreateInfoQCOM {
    VkStructureType    sType;
    const void*        pNext;
    VkOffset2D         filterCenter;
    VkExtent2D         filterSize;
    uint32_t           numPhases;
} VkImageViewSampleWeightCreateInfoQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • filterCenter 是一个 VkOffset2D,描述权重过滤器原点的位置。

  • filterSize 是一个 VkExtent2D,指定权重过滤器的尺寸。

  • numPhases 是子像素过滤器阶段的数量。

filterCenter 指定过滤器内核的原点或中心,如 权重采样操作中所述。numPhases 描述子像素过滤器阶段的数量,如 权重采样阶段中所述。

有效用法
有效用法(隐式)
  • VUID-VkImageViewSampleWeightCreateInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM

要销毁图像视图,请调用

// Provided by VK_VERSION_1_0
void vkDestroyImageView(
    VkDevice                                    device,
    VkImageView                                 imageView,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁图像视图的逻辑设备。

  • imageView 是要销毁的图像视图。

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

有效用法
  • VUID-vkDestroyImageView-imageView-01026
    所有引用 imageView 的已提交命令必须已完成执行

  • VUID-vkDestroyImageView-imageView-01027
    如果在创建 imageView 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyImageView-imageView-01028
    如果在创建 imageView 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyImageView-imageView-parameter
    如果 imageView 不是 VK_NULL_HANDLE,则 imageView 必须是有效的 VkImageView 句柄

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

  • VUID-vkDestroyImageView-imageView-parent
    如果 imageView 是有效的句柄,它必须是从 device 创建、分配或检索的。

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

要获取图像视图的句柄,请调用

// Provided by VK_NVX_image_view_handle
uint32_t vkGetImageViewHandleNVX(
    VkDevice                                    device,
    const VkImageViewHandleInfoNVX*             pInfo);
  • device 是拥有图像视图的逻辑设备。

  • pInfo 描述要查询的图像视图和句柄类型。

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

  • VUID-vkGetImageViewHandleNVX-pInfo-parameter
    pInfo 必须是指向有效的 VkImageViewHandleInfoNVX 结构的有效指针。

要获取图像视图的 64 位句柄,请调用

// Provided by VK_NVX_image_view_handle
uint64_t vkGetImageViewHandle64NVX(
    VkDevice                                    device,
    const VkImageViewHandleInfoNVX*             pInfo);
  • device 是拥有图像视图的逻辑设备。

  • pInfo 描述要查询的图像视图和句柄类型。

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

  • VUID-vkGetImageViewHandle64NVX-pInfo-parameter
    pInfo 必须是指向有效的 VkImageViewHandleInfoNVX 结构的有效指针。

VkImageViewHandleInfoNVX 结构的定义如下:

// Provided by VK_NVX_image_view_handle
typedef struct VkImageViewHandleInfoNVX {
    VkStructureType     sType;
    const void*         pNext;
    VkImageView         imageView;
    VkDescriptorType    descriptorType;
    VkSampler           sampler;
} VkImageViewHandleInfoNVX;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • imageView 是要查询的图像视图。

  • descriptorType 是要查询句柄的描述符类型。

  • sampler 是生成句柄时与图像视图组合的采样器。

有效用法
  • VUID-VkImageViewHandleInfoNVX-descriptorType-02654
    descriptorType 必须VK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER

  • VUID-VkImageViewHandleInfoNVX-sampler-02655
    如果 descriptorTypeVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,则 sampler 必须是有效的 VkSampler

  • VUID-VkImageViewHandleInfoNVX-imageView-02656
    如果 descriptorType 是 VK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,则创建 imageView 的图像必须已设置了 VK_IMAGE_USAGE_SAMPLED_BIT 使用位。

  • VUID-VkImageViewHandleInfoNVX-imageView-02657
    如果 descriptorType 是 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,则创建 imageView 的图像必须已设置了 VK_IMAGE_USAGE_STORAGE_BIT 使用位。

有效用法(隐式)
  • VUID-VkImageViewHandleInfoNVX-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX

  • VUID-VkImageViewHandleInfoNVX-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageViewHandleInfoNVX-imageView-parameter
    imageView 必须是有效的 VkImageView 句柄

  • VUID-VkImageViewHandleInfoNVX-descriptorType-parameter
    descriptorType 必须是有效的 VkDescriptorType

  • VUID-VkImageViewHandleInfoNVX-sampler-parameter
    如果 sampler 不是 VK_NULL_HANDLE,则 sampler 必须是有效的 VkSampler 句柄。

  • VUID-VkImageViewHandleInfoNVX-commonparent
    imageViewsampler (两者都是有效的非忽略参数句柄)必须是从同一个 VkDevice 创建、分配或检索的。

要获取图像视图的设备地址,请调用

// Provided by VK_NVX_image_view_handle
VkResult vkGetImageViewAddressNVX(
    VkDevice                                    device,
    VkImageView                                 imageView,
    VkImageViewAddressPropertiesNVX*            pProperties);
  • device 是拥有图像视图的逻辑设备。

  • imageView 是图像视图的句柄。

  • 当调用返回时,pProperties 包含设备地址和大小。

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

  • VUID-vkGetImageViewAddressNVX-imageView-parameter
    imageView 必须是有效的 VkImageView 句柄

  • VUID-vkGetImageViewAddressNVX-pProperties-parameter
    pProperties 必须是指向 VkImageViewAddressPropertiesNVX 结构的有效指针。

  • VUID-vkGetImageViewAddressNVX-imageView-parent
    imageView 必须是从 device 创建、分配或检索的。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkImageViewAddressPropertiesNVX 结构的定义如下:

// Provided by VK_NVX_image_view_handle
typedef struct VkImageViewAddressPropertiesNVX {
    VkStructureType    sType;
    void*              pNext;
    VkDeviceAddress    deviceAddress;
    VkDeviceSize       size;
} VkImageViewAddressPropertiesNVX;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • deviceAddress 是图像视图的设备地址。

  • size 是图像视图设备内存的大小(以字节为单位)。

有效用法(隐式)
  • VUID-VkImageViewAddressPropertiesNVX-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX

  • VUID-VkImageViewAddressPropertiesNVX-pNext-pNext
    pNext 必须NULL

图像视图格式特性

VkImageView 的有效使用可能取决于图像视图的格式特性,定义如下。此类约束记录在受影响的有效用法声明中。

VkImageViewMinLodCreateInfoEXT 结构定义如下

// Provided by VK_EXT_image_view_min_lod
typedef struct VkImageViewMinLodCreateInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    float              minLod;
} VkImageViewMinLodCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • minLod 是用于限制此 VkImageView 可访问的最小 LOD 的值。

如果 pNext 链包含 VkImageViewMinLodCreateInfoEXT 结构,则该结构包含一个参数,用于指定在 图像级别选择纹素收集整数纹素坐标操作期间限制最小 LOD 值的值。

如果图像视图包含 VkImageViewMinLodCreateInfoEXT 并且它被用作采样操作的一部分

minLodFloatimageView = minLod

否则

minLodFloatimageView = 0.0

还为访问整数 mipmap 级别的采样操作定义了此参数的整数变体

minLodIntegerimageView = ⌊minLodFloatimageView

有效用法
  • VUID-VkImageViewMinLodCreateInfoEXT-minLod-06455
    如果未启用minLod 功能,则 minLod **必须**为 0.0

  • VUID-VkImageViewMinLodCreateInfoEXT-minLod-06456
    minLod **必须**小于或等于视图可访问的最后一个 mipmap 级别的索引

有效用法(隐式)
  • VUID-VkImageViewMinLodCreateInfoEXT-sType-sType
    sType **必须**为 VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT

加速结构

加速结构是由实现构建的不透明数据结构,用于更有效地对提供的几何数据执行空间查询。对于这些扩展,加速结构要么是包含一组底层加速结构的顶层加速结构,要么是包含一组自定义几何形状的轴对齐边界框或一组三角形的底层加速结构。

顶层加速结构中的每个实例都包含对底层加速结构的引用,以及实例变换加上索引到着色器绑定的信息。顶层加速结构是绑定到加速描述符的内容,例如在光线跟踪管道中在着色器内部进行跟踪。

VK_KHR_acceleration_structure 扩展的加速结构由 VkAccelerationStructureKHR 句柄表示

// Provided by VK_KHR_acceleration_structure
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR)

要创建加速结构,请调用

// Provided by VK_KHR_acceleration_structure
VkResult vkCreateAccelerationStructureKHR(
    VkDevice                                    device,
    const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkAccelerationStructureKHR*                 pAccelerationStructure);
  • device 是创建加速结构对象的逻辑设备。

  • pCreateInfo 是指向 VkAccelerationStructureCreateInfoKHR 结构的指针,该结构包含影响加速结构创建的参数。

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

  • pAccelerationStructure 是指向 VkAccelerationStructureKHR 句柄的指针,该句柄返回生成的加速结构对象。

与 Vulkan 中的其他对象类似,加速结构创建仅创建具有特定“形状”的对象。可以构建到加速结构中的几何体的类型和数量由 VkAccelerationStructureCreateInfoKHR 的参数确定。

加速结构数据存储在 VkAccelerationStructureCreateInfoKHR::buffer 引用的对象中。一旦内存绑定到该缓冲区,**必须**通过加速结构构建或加速结构复制命令(例如 vkCmdBuildAccelerationStructuresKHRvkBuildAccelerationStructuresKHRvkCmdCopyAccelerationStructureKHRvkCopyAccelerationStructureKHR)来填充。

跟踪捕获/回放工具的预期用法是,它将使用加速结构复制命令来序列化和反序列化加速结构数据。在捕获期间,该工具将使用 modeVK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHRvkCopyAccelerationStructureToMemoryKHRvkCmdCopyAccelerationStructureToMemoryKHR,以及在回放期间使用 modeVK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHRvkCopyMemoryToAccelerationStructureKHRvkCmdCopyMemoryToAccelerationStructureKHR

调用 vkCreateAccelerationStructureKHR 时,不需要将内存绑定到基础缓冲区。

传递给加速结构构建命令的输入缓冲区将在命令执行期间被实现引用。命令完成后,加速结构**可能**会保留对其内部包含的活动实例指定的任何加速结构的引用。除了这种引用之外,加速结构**必须**是完全自包含的。应用程序**可以**重用或释放命令用作输入或暂存的任何内存,而不会影响光线遍历的结果。

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

  • VUID-vkCreateAccelerationStructureKHR-pCreateInfo-parameter
    pCreateInfo **必须**是指向有效的 VkAccelerationStructureCreateInfoKHR 结构的有效指针

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

  • VUID-vkCreateAccelerationStructureKHR-pAccelerationStructure-parameter
    pAccelerationStructure **必须**是指向 VkAccelerationStructureKHR 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

VkAccelerationStructureCreateInfoKHR 结构定义为

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureCreateInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    VkAccelerationStructureCreateFlagsKHR    createFlags;
    VkBuffer                                 buffer;
    VkDeviceSize                             offset;
    VkDeviceSize                             size;
    VkAccelerationStructureTypeKHR           type;
    VkDeviceAddress                          deviceAddress;
} VkAccelerationStructureCreateInfoKHR;

应用程序**应**避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的加速结构,以减少出现 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR 错误的几率。

预期的用法是,跟踪捕获/回放工具将向所有使用 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 的缓冲区添加 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 标志,并将 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 添加到所有用作加速结构存储的缓冲区,其中 deviceAddress 不为零。这也意味着该工具需要向内存分配添加 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,以允许在应用程序可能不需要的情况下设置该标志。在捕获期间,该工具会将查询到的不透明设备地址保存在跟踪中。在回放期间,将创建指定原始地址的缓冲区,因此存储在跟踪数据中的任何地址值都将保持有效。

实现预期会将此类缓冲区在 GPU 地址空间中分隔开,以便正常分配避免使用这些地址。应用程序和工具应避免混合使用为使用 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 创建的缓冲区提供的应用程序地址和实现提供的地址,以避免地址空间分配冲突。

应用程序**应**创建具有特定 VkAccelerationStructureTypeKHR 而不是 VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 的加速结构。

VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 旨在供 API 转换层使用。在实际加速结构类型(顶部或底部)尚不清楚的情况下,可以在加速结构创建时使用它。执行构建时,实际的加速结构类型必须指定为 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR

如果加速结构将成为构建操作的目标,则可以使用 vkGetAccelerationStructureBuildSizesKHR 查询加速结构所需的大小。如果加速结构将成为紧凑复制的目标,则可以使用 vkCmdWriteAccelerationStructuresPropertiesKHRvkWriteAccelerationStructuresPropertiesKHR 来获取所需的紧凑大小。

如果加速结构将成为带有 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV 的构建操作的目标,则**必须**在 createFlags 中包含 VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV,并在 pNext 中包含 VkAccelerationStructureMotionInfoNV 作为扩展结构,其中实例数作为对象的元数据。

有效用法
  • VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-03612
    如果 deviceAddress 不为零,则 createFlags **必须**包含 VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR

  • VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-09488
    如果 deviceAddress 不为零,则它必须是从一个相同创建的加速结构中检索的,除了 bufferdeviceAddress

  • VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-09489
    如果 deviceAddress 不为零,则 buffer 必须与用于创建从中检索 deviceAddress 的加速结构的 buffer 创建方式相同,除了 VkBufferOpaqueCaptureAddressCreateInfo::opaqueCaptureAddress

  • VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-09490
    如果 deviceAddress 不为零,则 buffer 必须使用从 vkGetBufferOpaqueCaptureAddress 获取的 VkBufferOpaqueCaptureAddressCreateInfo::opaqueCaptureAddress 创建,用于创建从中检索 deviceAddress 的加速结构的 buffer

  • VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-10393
    如果 deviceAddress 不为零,则它必须是从 vkGetAccelerationStructureDeviceAddressKHR 获取的有效设备地址。

  • VUID-VkAccelerationStructureCreateInfoKHR-createFlags-03613
    如果 createFlags 包括 VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR,则 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureCaptureReplay 必须VK_TRUE

  • VUID-VkAccelerationStructureCreateInfoKHR-buffer-03614
    buffer 必须使用包含 VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHRusage 值创建。

  • VUID-VkAccelerationStructureCreateInfoKHR-buffer-03615
    buffer 必须未使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 创建。

  • VUID-VkAccelerationStructureCreateInfoKHR-offset-03616
    offsetsize 的总和必须小于 buffer 的大小。

  • VUID-VkAccelerationStructureCreateInfoKHR-offset-03734
    offset 必须256 字节的倍数。

  • VUID-VkAccelerationStructureCreateInfoKHR-createFlags-04954
    如果在 createFlags 中设置了 VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV 并且 typeVK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,则 pNext 链的一个成员必须是指向 VkAccelerationStructureMotionInfoNV 的有效实例的指针。

  • VUID-VkAccelerationStructureCreateInfoKHR-createFlags-04955
    如果任何几何体包含 VkAccelerationStructureGeometryMotionTrianglesDataNV,则 createFlags 必须包含 VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV

  • VUID-VkAccelerationStructureCreateInfoKHR-createFlags-08108
    如果 createFlags 包括 VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,则 descriptorBufferCaptureReplay 功能必须启用。

  • VUID-VkAccelerationStructureCreateInfoKHR-pNext-08109
    如果 pNext 链包括一个 VkOpaqueCaptureDescriptorDataCreateInfoEXT 结构,则 createFlags 必须包含 VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT

有效用法(隐式)
  • VUID-VkAccelerationStructureCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR

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

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

  • VUID-VkAccelerationStructureCreateInfoKHR-createFlags-parameter
    createFlags 必须VkAccelerationStructureCreateFlagBitsKHR 值的有效组合。

  • VUID-VkAccelerationStructureCreateInfoKHR-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkAccelerationStructureCreateInfoKHR-type-parameter
    type 必须是有效的 VkAccelerationStructureTypeKHR 值。

VkAccelerationStructureMotionInfoNV 结构的定义如下:

// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureMotionInfoNV {
    VkStructureType                             sType;
    const void*                                 pNext;
    uint32_t                                    maxInstances;
    VkAccelerationStructureMotionInfoFlagsNV    flags;
} VkAccelerationStructureMotionInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • maxInstances 是运动顶层加速结构中可能使用的最大实例数。

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

有效用法(隐式)
  • VUID-VkAccelerationStructureMotionInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV

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

// Provided by VK_NV_ray_tracing_motion_blur
typedef VkFlags VkAccelerationStructureMotionInfoFlagsNV;

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

要获取加速结构的构建大小,请调用:

// Provided by VK_KHR_acceleration_structure
void vkGetAccelerationStructureBuildSizesKHR(
    VkDevice                                    device,
    VkAccelerationStructureBuildTypeKHR         buildType,
    const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
    const uint32_t*                             pMaxPrimitiveCounts,
    VkAccelerationStructureBuildSizesInfoKHR*   pSizeInfo);
  • device 是将用于创建加速结构的逻辑设备。

  • buildType 定义是查询主机还是设备操作(或两者)。

  • pBuildInfo 是指向 VkAccelerationStructureBuildGeometryInfoKHR 结构的指针,该结构描述了构建操作的参数。

  • pMaxPrimitiveCounts 是一个指向 pBuildInfo->geometryCountuint32_t 值的数组的指针,这些值定义了构建到每个几何体中的图元数量。

  • pSizeInfo 是指向 VkAccelerationStructureBuildSizesInfoKHR 结构的指针,该结构返回加速结构所需的大小以及给定构建参数所需的暂存缓冲区的大小。

pBuildInfosrcAccelerationStructuredstAccelerationStructuremode 成员被忽略。 此命令会忽略 pBuildInfo 的任何 VkDeviceOrHostAddressKHRVkDeviceOrHostAddressConstKHR 成员,但会检查 VkAccelerationStructureGeometryTrianglesDataKHR::transformDatahostAddress 成员是否为 NULL

使用此命令返回的 accelerationStructureSize 创建的加速结构支持任何构建或更新,其 VkAccelerationStructureBuildGeometryInfoKHR 结构和 VkAccelerationStructureBuildRangeInfoKHR 结构数组满足以下属性

  • 构建命令是主机构建命令,且 buildTypeVK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHRVK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR

  • 构建命令是设备构建命令,且 buildTypeVK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHRVK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR

  • 对于 VkAccelerationStructureBuildGeometryInfoKHR

    • typeflags 成员分别等于 pBuildInfo->typepBuildInfo->flags

    • geometryCount 小于或等于 pBuildInfo->geometryCount

    • 对于 pGeometriesppGeometries 中给定索引处的每个元素,其 geometryType 成员等于 pBuildInfo->geometryType

    • 对于 pGeometriesppGeometries 中给定索引处的每个元素,其 flags 成员等于 pBuildInfo 中相同元素的相应成员。

    • 对于 pGeometriesppGeometries 中给定索引处的每个元素,其 geometryType 成员等于 VK_GEOMETRY_TYPE_TRIANGLES_KHRgeometry.trianglesvertexFormatindexType 成员等于 pBuildInfo 中相同元素的相应成员。

    • 对于 pGeometriesppGeometries 中给定索引处的每个元素,其 geometryType 成员等于 VK_GEOMETRY_TYPE_TRIANGLES_KHRgeometry.trianglesmaxVertex 成员小于或等于 pBuildInfo 中相同元素的相应成员。

    • 对于 pGeometriesppGeometries 中给定索引处的每个元素,其 geometryType 成员等于 VK_GEOMETRY_TYPE_TRIANGLES_KHR,如果 geometry.trianglestransformData 成员中的适用地址不为 NULL,则 pBuildInfo 中对应的 transformData.hostAddress 参数不为 NULL

  • 对于与 VkAccelerationStructureBuildGeometryInfoKHR 相对应的每个 VkAccelerationStructureBuildRangeInfoKHR

类似地,updateScratchSize 值将支持任何指定 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR mode 的构建命令,满足上述条件,并且 buildScratchSize 值将支持任何指定 VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR mode 的构建命令,满足上述条件。

有效用法
  • VUID-vkGetAccelerationStructureBuildSizesKHR-accelerationStructure-08933
    **必须**启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkGetAccelerationStructureBuildSizesKHR-device-03618
    如果使用多个物理设备创建了 device,则**必须**启用 bufferDeviceAddressMultiDevice 功能

  • VUID-vkGetAccelerationStructureBuildSizesKHR-pBuildInfo-03619
    如果 pBuildInfo->geometryCount 不为 0,则 pMaxPrimitiveCounts 必须是指向 pBuildInfo->geometryCountuint32_t 值的数组的有效指针

  • VUID-vkGetAccelerationStructureBuildSizesKHR-pBuildInfo-03785
    如果 pBuildInfo->pGeometriespBuildInfo->ppGeometriesgeometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,则每个 pMaxPrimitiveCounts[i] 必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxInstanceCount

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

  • VUID-vkGetAccelerationStructureBuildSizesKHR-buildType-parameter
    buildType 必须是有效的 VkAccelerationStructureBuildTypeKHR

  • VUID-vkGetAccelerationStructureBuildSizesKHR-pBuildInfo-parameter
    pBuildInfo 必须是指向有效的 VkAccelerationStructureBuildGeometryInfoKHR 结构的有效指针

  • VUID-vkGetAccelerationStructureBuildSizesKHR-pMaxPrimitiveCounts-parameter
    如果 pMaxPrimitiveCounts 不为 NULL,则 pMaxPrimitiveCounts 必须是指向 pBuildInfo->geometryCountuint32_t 值的数组的有效指针

  • VUID-vkGetAccelerationStructureBuildSizesKHR-pSizeInfo-parameter
    pSizeInfo 必须是指向 VkAccelerationStructureBuildSizesInfoKHR 结构的有效指针

VkAccelerationStructureBuildSizesInfoKHR 结构描述了加速结构和暂存缓冲区所需的构建大小,其定义如下

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureBuildSizesInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkDeviceSize       accelerationStructureSize;
    VkDeviceSize       updateScratchSize;
    VkDeviceSize       buildScratchSize;
} VkAccelerationStructureBuildSizesInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • accelerationStructureSizeVkAccelerationStructureKHR 中用于构建或更新操作所需的字节大小。

  • updateScratchSize 是更新操作的暂存缓冲区中所需的字节大小。

  • buildScratchSize 是构建操作的暂存缓冲区中所需的字节大小。

有效用法(隐式)
  • VUID-VkAccelerationStructureBuildSizesInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR

  • VUID-VkAccelerationStructureBuildSizesInfoKHR-pNext-pNext
    pNext 必须NULL

VK_NV_ray_tracing扩展的加速结构由类似的VkAccelerationStructureNV句柄表示。

// Provided by VK_NV_ray_tracing
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureNV)

要创建加速结构,请调用

// Provided by VK_NV_ray_tracing
VkResult vkCreateAccelerationStructureNV(
    VkDevice                                    device,
    const VkAccelerationStructureCreateInfoNV*  pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkAccelerationStructureNV*                  pAccelerationStructure);
  • device 是创建缓冲区对象的逻辑设备。

  • pCreateInfo是指向VkAccelerationStructureCreateInfoNV结构的指针,该结构包含影响加速结构创建的参数。

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

  • pAccelerationStructure是指向VkAccelerationStructureNV句柄的指针,其中返回生成的加速结构对象。

与Vulkan中的其他对象类似,加速结构的创建仅创建了一个具有特定“形状”的对象,该“形状”由VkAccelerationStructureInfoNV中的信息和pCreateInfo中的compactedSize指定。

一旦使用vkBindAccelerationStructureMemoryNV将内存绑定到加速结构,该内存将通过调用vkCmdBuildAccelerationStructureNVvkCmdCopyAccelerationStructureNV进行填充。

加速结构创建使用几何体的计数和类型信息,但不使用结构中的数据引用。

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

  • VUID-vkCreateAccelerationStructureNV-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的VkAccelerationStructureCreateInfoNV结构的有效指针

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

  • VUID-vkCreateAccelerationStructureNV-pAccelerationStructure-parameter
    pAccelerationStructure 必须是指向VkAccelerationStructureNV句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkAccelerationStructureCreateInfoNV结构定义为

// Provided by VK_NV_ray_tracing
typedef struct VkAccelerationStructureCreateInfoNV {
    VkStructureType                  sType;
    const void*                      pNext;
    VkDeviceSize                     compactedSize;
    VkAccelerationStructureInfoNV    info;
} VkAccelerationStructureCreateInfoNV;
有效用法
  • VUID-VkAccelerationStructureCreateInfoNV-compactedSize-02421
    如果compactedSize不为0,则info.geometryCountinfo.instanceCount必须0

有效用法(隐式)
  • VUID-VkAccelerationStructureCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV

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

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

  • VUID-VkAccelerationStructureCreateInfoNV-info-parameter
    info 必须是有效的VkAccelerationStructureInfoNV结构

VkAccelerationStructureInfoNV结构定义为

// Provided by VK_NV_ray_tracing
typedef struct VkAccelerationStructureInfoNV {
    VkStructureType                        sType;
    const void*                            pNext;
    VkAccelerationStructureTypeNV          type;
    VkBuildAccelerationStructureFlagsNV    flags;
    uint32_t                               instanceCount;
    uint32_t                               geometryCount;
    const VkGeometryNV*                    pGeometries;
} VkAccelerationStructureInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • type 是一个VkAccelerationStructureTypeNV值,指定将要创建的加速结构的类型。

  • flags 是一个VkBuildAccelerationStructureFlagBitsNV的位掩码,指定加速结构的附加参数。

  • instanceCount 指定新加速结构中将存在的实例数量。

  • geometryCount 指定新加速结构中将存在的几何体数量。

  • pGeometries是指向包含传递到加速结构的场景数据的geometryCountVkGeometryNV结构数组的指针。

VkAccelerationStructureInfoNV包含的信息既用于使用vkCreateAccelerationStructureNV创建加速结构,又与实际几何数据结合使用,以使用vkCmdBuildAccelerationStructureNV构建加速结构。

有效用法
  • VUID-VkAccelerationStructureInfoNV-geometryCount-02422
    geometryCount 必须小于或等于VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount

  • VUID-VkAccelerationStructureInfoNV-instanceCount-02423
    instanceCount 必须小于或等于VkPhysicalDeviceRayTracingPropertiesNV::maxInstanceCount

  • VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424
    所有几何体中的三角形总数必须小于或等于VkPhysicalDeviceRayTracingPropertiesNV::maxTriangleCount

  • VUID-VkAccelerationStructureInfoNV-type-02425
    如果typeVK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV,则geometryCount必须0

  • VUID-VkAccelerationStructureInfoNV-type-02426
    如果typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV,则instanceCount必须0

  • VUID-VkAccelerationStructureInfoNV-type-02786
    如果typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV,则pGeometries中每个几何体的geometryType成员必须相同

  • VUID-VkAccelerationStructureInfoNV-type-04623
    type不得VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR

  • VUID-VkAccelerationStructureInfoNV-flags-02592
    如果 flags 设置了 VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV 位,则它必须未设置 VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV 位。

  • VUID-VkAccelerationStructureInfoNV-scratch-02781
    scratch 必须已使用 VK_BUFFER_USAGE_RAY_TRACING_BIT_NV 使用标志创建。

  • VUID-VkAccelerationStructureInfoNV-instanceData-02782
    如果 instanceData 不是 VK_NULL_HANDLE,则 instanceData 必须已使用 VK_BUFFER_USAGE_RAY_TRACING_BIT_NV 使用标志创建。

有效用法(隐式)
  • VUID-VkAccelerationStructureInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV

  • VUID-VkAccelerationStructureInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkAccelerationStructureInfoNV-type-parameter
    type 必须是有效的 VkAccelerationStructureTypeNV 值。

  • VUID-VkAccelerationStructureInfoNV-flags-parameter
    flags 必须VkBuildAccelerationStructureFlagBitsNV 值的有效组合。

  • VUID-VkAccelerationStructureInfoNV-pGeometries-parameter
    如果 geometryCount 不为 0,则 pGeometries 必须是指向 geometryCount 个有效 VkGeometryNV 结构体的数组的有效指针。

VkAccelerationStructureCreateInfoKHR::typeVkAccelerationStructureInfoNV::type 中设置的值指定加速结构的类型,包括:

// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureTypeKHR {
    VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR = 0,
    VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR = 1,
    VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR = 2,
  // Provided by VK_NV_ray_tracing
    VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,
  // Provided by VK_NV_ray_tracing
    VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,
} VkAccelerationStructureTypeKHR;

或等效形式:

// Provided by VK_NV_ray_tracing
typedef VkAccelerationStructureTypeKHR VkAccelerationStructureTypeNV;
  • VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR 是一个顶层加速结构,包含指向底层加速结构的实例数据。

  • VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR 是一个底层加速结构,包含要相交的 AABB 或几何体。

  • VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 是一种加速结构,其类型在构建时确定,用于特殊情况。 在这些情况下,加速结构类型在创建时未知,但必须在构建时指定为顶层或底层。

可以在 VkAccelerationStructureCreateInfoKHR::createFlags 中设置的位,指定加速结构的其他创建参数,包括:

// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureCreateFlagBitsKHR {
    VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = 0x00000001,
  // Provided by VK_EXT_descriptor_buffer
    VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008,
  // Provided by VK_NV_ray_tracing_motion_blur
    VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV = 0x00000004,
} VkAccelerationStructureCreateFlagBitsKHR;
  • VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR 指定加速结构的地址可以被保存并在后续运行中重用。

  • VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 指定在捕获和重放时(例如,用于跟踪捕获和重放),加速结构可以与描述符缓冲区一起使用,有关更多详细信息,请参阅 VkOpaqueCaptureDescriptorDataCreateInfoEXT

  • VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV 指定加速结构将与运动信息一起使用,有关更多详细信息,请参阅 VkAccelerationStructureMotionInfoNV

// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkAccelerationStructureCreateFlagsKHR;

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

可以在 VkAccelerationStructureBuildGeometryInfoKHR::flagsVkAccelerationStructureInfoNV::flags 中设置的位,指定加速结构构建的其他参数,包括:

// Provided by VK_KHR_acceleration_structure
typedef enum VkBuildAccelerationStructureFlagBitsKHR {
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR = 0x00000001,
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR = 0x00000002,
    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR = 0x00000004,
    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR = 0x00000008,
    VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR = 0x00000010,
  // Provided by VK_NV_ray_tracing_motion_blur
    VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV = 0x00000020,
  // Provided by VK_EXT_opacity_micromap
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT = 0x00000040,
  // Provided by VK_EXT_opacity_micromap
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000080,
  // Provided by VK_EXT_opacity_micromap
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = 0x00000100,
#ifdef VK_ENABLE_BETA_EXTENSIONS
  // Provided by VK_NV_displacement_micromap
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV = 0x00000200,
#endif
  // Provided by VK_KHR_ray_tracing_position_fetch
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR = 0x00000800,
  // Provided by VK_NV_ray_tracing
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR,
} VkBuildAccelerationStructureFlagBitsKHR;

或等效形式:

// Provided by VK_NV_ray_tracing
typedef VkBuildAccelerationStructureFlagBitsKHR VkBuildAccelerationStructureFlagBitsNV;
  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR 指定指定的加速结构可以VkAccelerationStructureBuildGeometryInfoKHR 中使用 modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR 或在 vkCmdBuildAccelerationStructureNV 中使用 updateVK_TRUE 进行更新。

  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 指定指定的加速结构可以作为复制加速结构命令的源,使用 modeVK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR 来生成压缩的加速结构。

  • VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR 指定给定的加速结构构建优先考虑跟踪性能而不是构建时间。

  • VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR 指定给定的加速结构构建优先考虑构建时间而不是跟踪性能。

  • VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR 指定此加速结构最大限度地减少暂存内存和最终结果加速结构的大小,可能以牺牲构建时间或跟踪性能为代价。

  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT 指定与指定加速结构关联的不透明度微映射可能随着加速结构更新而更改。

  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT 指定与指定加速结构关联的不透明度微映射的数据可能随着加速结构更新而更改。

  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT 指定指定的加速结构可能在设置了 VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT 的实例中被引用。

  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR 指定在获取命中三角形的顶点位置时可以使用指定的加速结构。

  • VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV 指定与指定加速结构关联的位移微映射可能随着加速结构更新而更改。

VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHRVK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 可能比正常构建花费更多的时间和内存,因此应该仅在需要这些功能时使用。

VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHRVK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 允许一起使用。 在这种情况下,压缩副本的结果用作构建的源,使用 modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR 来执行压缩更新。

// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkBuildAccelerationStructureFlagsKHR;

或等效形式:

// Provided by VK_NV_ray_tracing
typedef VkBuildAccelerationStructureFlagsKHR VkBuildAccelerationStructureFlagsNV;

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

VkGeometryNV 结构描述了底层加速结构中的几何体,定义如下:

// Provided by VK_NV_ray_tracing
typedef struct VkGeometryNV {
    VkStructureType       sType;
    const void*           pNext;
    VkGeometryTypeKHR     geometryType;
    VkGeometryDataNV      geometry;
    VkGeometryFlagsKHR    flags;
} VkGeometryNV;
有效用法
  • VUID-VkGeometryNV-geometryType-03503
    geometryType 必须VK_GEOMETRY_TYPE_TRIANGLES_NVVK_GEOMETRY_TYPE_AABBS_NV

有效用法(隐式)
  • VUID-VkGeometryNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GEOMETRY_NV

  • VUID-VkGeometryNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkGeometryNV-geometryType-parameter
    geometryType 必须是一个有效的 VkGeometryTypeKHR

  • VUID-VkGeometryNV-geometry-parameter
    geometry 必须是一个有效的 VkGeometryDataNV 结构体

  • VUID-VkGeometryNV-flags-parameter
    flags 必须VkGeometryFlagBitsKHR 值的有效组合

几何体类型由 VkGeometryTypeKHR 指定,其取值为

// Provided by VK_KHR_acceleration_structure
typedef enum VkGeometryTypeKHR {
    VK_GEOMETRY_TYPE_TRIANGLES_KHR = 0,
    VK_GEOMETRY_TYPE_AABBS_KHR = 1,
    VK_GEOMETRY_TYPE_INSTANCES_KHR = 2,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_TYPE_TRIANGLES_NV = VK_GEOMETRY_TYPE_TRIANGLES_KHR,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_TYPE_AABBS_NV = VK_GEOMETRY_TYPE_AABBS_KHR,
} VkGeometryTypeKHR;

或等效形式:

// Provided by VK_NV_ray_tracing
typedef VkGeometryTypeKHR VkGeometryTypeNV;
  • VK_GEOMETRY_TYPE_TRIANGLES_KHR 指定由三角形组成的几何体类型。

  • VK_GEOMETRY_TYPE_AABBS_KHR 指定由轴对齐边界框组成的几何体类型。

  • VK_GEOMETRY_TYPE_INSTANCES_KHR 指定由加速结构实例组成的几何体类型。

指定加速结构构建中几何体附加参数的位为

// Provided by VK_KHR_acceleration_structure
typedef enum VkGeometryFlagBitsKHR {
    VK_GEOMETRY_OPAQUE_BIT_KHR = 0x00000001,
    VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR = 0x00000002,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_OPAQUE_BIT_NV = VK_GEOMETRY_OPAQUE_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_NV = VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR,
} VkGeometryFlagBitsKHR;

或等效形式:

// Provided by VK_NV_ray_tracing
typedef VkGeometryFlagBitsKHR VkGeometryFlagBitsNV;
  • VK_GEOMETRY_OPAQUE_BIT_KHR 指定此几何体即使在命中组中存在也不会调用 any-hit 着色器。

  • VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR 指定实现必须只对该几何体中的每个图元调用一次 any-hit 着色器。如果此位不存在,则实现可能对此几何体调用多次 any-hit 着色器。

// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkGeometryFlagsKHR;

或等效形式:

// Provided by VK_NV_ray_tracing
typedef VkGeometryFlagsKHR VkGeometryFlagsNV;

VkGeometryFlagsKHR 是一个用于设置零个或多个 VkGeometryFlagBitsKHR 的掩码的位掩码类型。

VkGeometryDataNV 结构体指定底层加速结构中的几何体,定义如下

// Provided by VK_NV_ray_tracing
typedef struct VkGeometryDataNV {
    VkGeometryTrianglesNV    triangles;
    VkGeometryAABBNV         aabbs;
} VkGeometryDataNV;
  • 如果 VkGeometryNV::geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_NV,则 triangles 包含三角形数据。

  • 如果 VkGeometryNV::geometryTypeVK_GEOMETRY_TYPE_AABBS_NV,则 aabbs 包含轴对齐边界框数据。

有效用法(隐式)
  • VUID-VkGeometryDataNV-triangles-parameter
    triangles 必须是一个有效的 VkGeometryTrianglesNV 结构体

  • VUID-VkGeometryDataNV-aabbs-parameter
    aabbs 必须是一个有效的 VkGeometryAABBNV 结构体

VkGeometryTrianglesNV 结构体指定底层加速结构中的三角形几何体,定义如下

// Provided by VK_NV_ray_tracing
typedef struct VkGeometryTrianglesNV {
    VkStructureType    sType;
    const void*        pNext;
    VkBuffer           vertexData;
    VkDeviceSize       vertexOffset;
    uint32_t           vertexCount;
    VkDeviceSize       vertexStride;
    VkFormat           vertexFormat;
    VkBuffer           indexData;
    VkDeviceSize       indexOffset;
    uint32_t           indexCount;
    VkIndexType        indexType;
    VkBuffer           transformData;
    VkDeviceSize       transformOffset;
} VkGeometryTrianglesNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • vertexData 是包含此几何体的顶点数据的缓冲区。

  • vertexOffsetvertexData 中包含此几何体顶点数据的偏移量(以字节为单位)。

  • vertexCount 是有效顶点的数量。

  • vertexStride 是每个顶点之间的跨度(以字节为单位)。

  • vertexFormat 是一个 VkFormat,描述每个顶点元素的格式。

  • indexData 是包含此几何体的索引数据的缓冲区。

  • indexOffsetindexData 中包含此几何体索引数据的偏移量(以字节为单位)。

  • indexCount 是此几何体中包含的索引数量。

  • indexType 是一个 VkIndexType,描述每个索引的格式。

  • transformData 是一个可选的缓冲区,包含一个 VkTransformMatrixNV 结构体,定义要应用于此几何体的变换。

  • transformOffsettransformData 中上述变换信息的偏移量(以字节为单位)。

如果 indexTypeVK_INDEX_TYPE_NONE_NV,则此结构体描述由 vertexCount 确定的一组三角形。否则,此结构体描述由 indexCount 确定的一组索引三角形。

有效用法
  • VUID-VkGeometryTrianglesNV-vertexOffset-02428
    vertexOffset 必须小于 vertexData 的大小

  • VUID-VkGeometryTrianglesNV-vertexOffset-02429
    vertexOffset 必须vertexFormat 组件大小的倍数

  • VUID-VkGeometryTrianglesNV-vertexFormat-02430
    vertexFormat 必须VK_FORMAT_R32G32B32_SFLOATVK_FORMAT_R32G32_SFLOATVK_FORMAT_R16G16B16_SFLOATVK_FORMAT_R16G16_SFLOATVK_FORMAT_R16G16_SNORMVK_FORMAT_R16G16B16_SNORM 之一

  • VUID-VkGeometryTrianglesNV-vertexStride-03818
    vertexStride 必须小于或等于 232-1

  • VUID-VkGeometryTrianglesNV-indexOffset-02431
    indexOffset 必须小于 indexData 的大小

  • VUID-VkGeometryTrianglesNV-indexOffset-02432
    indexOffset 必须indexType 元素大小的倍数

  • VUID-VkGeometryTrianglesNV-indexType-02433
    indexType 必须VK_INDEX_TYPE_UINT16VK_INDEX_TYPE_UINT32VK_INDEX_TYPE_NONE_NV

  • VUID-VkGeometryTrianglesNV-indexData-02434
    如果 indexTypeVK_INDEX_TYPE_NONE_NV,则 indexData 必须VK_NULL_HANDLE

  • VUID-VkGeometryTrianglesNV-indexData-02435
    如果 indexType 不是 VK_INDEX_TYPE_NONE_NV,则 indexData 必须是一个有效的 VkBuffer 句柄

  • VUID-VkGeometryTrianglesNV-indexCount-02436
    如果 indexTypeVK_INDEX_TYPE_NONE_NV,则 indexCount 必须0

  • VUID-VkGeometryTrianglesNV-transformOffset-02437
    transformOffset 必须小于 transformData 的大小

  • VUID-VkGeometryTrianglesNV-transformOffset-02438
    transformOffset 必须16 的倍数

有效用法(隐式)
  • VUID-VkGeometryTrianglesNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV

  • VUID-VkGeometryTrianglesNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkGeometryTrianglesNV-vertexData-parameter
    如果 vertexData 不是 VK_NULL_HANDLE,则 vertexData 必须是一个有效的 VkBuffer 句柄

  • VUID-VkGeometryTrianglesNV-vertexFormat-parameter
    vertexFormat 必须是一个有效的 VkFormat

  • VUID-VkGeometryTrianglesNV-indexData-parameter
    如果 indexData 不是 VK_NULL_HANDLE,则 indexData 必须是一个有效的 VkBuffer 句柄

  • VUID-VkGeometryTrianglesNV-indexType-parameter
    indexType 必须是一个有效的 VkIndexType

  • VUID-VkGeometryTrianglesNV-transformData-parameter
    如果 transformData 不是 VK_NULL_HANDLE,则 transformData 必须是一个有效的 VkBuffer 句柄

  • VUID-VkGeometryTrianglesNV-commonparent
    indexDatatransformDatavertexData 中每一个作为非忽略参数的有效句柄,必须已从同一个 VkDevice 创建、分配或检索

VkGeometryAABBNV 结构指定了底层加速结构中的轴对齐边界框几何体,其定义如下

// Provided by VK_NV_ray_tracing
typedef struct VkGeometryAABBNV {
    VkStructureType    sType;
    const void*        pNext;
    VkBuffer           aabbData;
    uint32_t           numAABBs;
    uint32_t           stride;
    VkDeviceSize       offset;
} VkGeometryAABBNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • aabbData 是包含轴对齐边界框数据的缓冲区。

  • numAABBs 是此几何体中的 AABB 数量。

  • strideaabbData 中 AABB 之间的字节跨度。

  • offsetaabbData 中第一个 AABB 的字节偏移量。

内存中的 AABB 数据由六个 32 位浮点数组成,它们是最小 x、y 和 z 值,后跟最大 x、y 和 z 值。

有效用法
  • VUID-VkGeometryAABBNV-offset-02439
    offset 必须小于 aabbData 的大小

  • VUID-VkGeometryAABBNV-offset-02440
    offset 必须8 的倍数

  • VUID-VkGeometryAABBNV-stride-02441
    stride 必须8 的倍数

有效用法(隐式)
  • VUID-VkGeometryAABBNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV

  • VUID-VkGeometryAABBNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkGeometryAABBNV-aabbData-parameter
    如果 aabbData 不是 VK_NULL_HANDLE,则 aabbData 必须是一个有效的 VkBuffer 句柄

要销毁加速结构,请调用

// Provided by VK_KHR_acceleration_structure
void vkDestroyAccelerationStructureKHR(
    VkDevice                                    device,
    VkAccelerationStructureKHR                  accelerationStructure,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁加速结构的逻辑设备。

  • accelerationStructure 是要销毁的加速结构。

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

有效用法
  • VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-08934
    **必须**启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02442
    所有引用 accelerationStructure 的已提交命令必须已完成执行

  • VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02443
    如果在创建 accelerationStructure 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02444
    如果在创建 accelerationStructure 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter
    如果 accelerationStructure 不是 VK_NULL_HANDLE,则 accelerationStructure 必须是一个有效的 VkAccelerationStructureKHR 句柄

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

  • VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent
    如果 accelerationStructure 是一个有效的句柄,它必须已从 device 创建、分配或检索

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

要销毁加速结构,请调用

// Provided by VK_NV_ray_tracing
void vkDestroyAccelerationStructureNV(
    VkDevice                                    device,
    VkAccelerationStructureNV                   accelerationStructure,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁缓冲区的逻辑设备。

  • accelerationStructure 是要销毁的加速结构。

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

有效用法
  • VUID-vkDestroyAccelerationStructureNV-accelerationStructure-03752
    所有引用 accelerationStructure 的已提交命令必须已完成执行

  • VUID-vkDestroyAccelerationStructureNV-accelerationStructure-03753
    如果在创建 accelerationStructure 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyAccelerationStructureNV-accelerationStructure-03754
    如果在创建 accelerationStructure 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyAccelerationStructureNV-accelerationStructure-parameter
    如果 accelerationStructure 不是 VK_NULL_HANDLE,则 accelerationStructure 必须是一个有效的 VkAccelerationStructureNV 句柄

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

  • VUID-vkDestroyAccelerationStructureNV-accelerationStructure-parent
    如果 accelerationStructure 是一个有效的句柄,它必须已从 device 创建、分配或检索

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

加速结构对结构对象本身、构建用的临时空间和更新用的临时空间都有内存要求。

临时空间以 VkBuffer 的形式分配,因此对于 VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NVVK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV,此调用返回的 pMemoryRequirements->alignmentpMemoryRequirements->memoryTypeBits必须填充为零,并且应用程序应该忽略它们。

要查询内存要求,请调用

// Provided by VK_NV_ray_tracing
void vkGetAccelerationStructureMemoryRequirementsNV(
    VkDevice                                    device,
    const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
    VkMemoryRequirements2KHR*                   pMemoryRequirements);
有效用法(隐式)
  • VUID-vkGetAccelerationStructureMemoryRequirementsNV-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetAccelerationStructureMemoryRequirementsNV-pInfo-parameter
    pInfo 必须是指向有效的 VkAccelerationStructureMemoryRequirementsInfoNV 结构的有效指针

  • VUID-vkGetAccelerationStructureMemoryRequirementsNV-pMemoryRequirements-parameter
    pMemoryRequirements 必须是指向 VkMemoryRequirements2KHR 结构的有效指针

VkAccelerationStructureMemoryRequirementsInfoNV 结构的定义如下:

// Provided by VK_NV_ray_tracing
typedef struct VkAccelerationStructureMemoryRequirementsInfoNV {
    VkStructureType                                    sType;
    const void*                                        pNext;
    VkAccelerationStructureMemoryRequirementsTypeNV    type;
    VkAccelerationStructureNV                          accelerationStructure;
} VkAccelerationStructureMemoryRequirementsInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • type 选择要查询的内存需求类型。VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV 返回对象本身的内存需求。VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV 返回构建时临时内存的内存需求。VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV 返回更新时临时内存的内存需求。

  • accelerationStructure 是要查询内存需求的加速结构。

有效用法(隐式)
  • VUID-VkAccelerationStructureMemoryRequirementsInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV

  • VUID-VkAccelerationStructureMemoryRequirementsInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkAccelerationStructureMemoryRequirementsInfoNV-type-parameter
    type 必须是一个有效的 VkAccelerationStructureMemoryRequirementsTypeNV

  • VUID-VkAccelerationStructureMemoryRequirementsInfoNV-accelerationStructure-parameter
    accelerationStructure 必须是一个有效的 VkAccelerationStructureNV 句柄

VkAccelerationStructureMemoryRequirementsInfoNVtype 的可能值为:

// Provided by VK_NV_ray_tracing
typedef enum VkAccelerationStructureMemoryRequirementsTypeNV {
    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV = 0,
    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV = 1,
    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV = 2,
} VkAccelerationStructureMemoryRequirementsTypeNV;
  • VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV 请求 VkAccelerationStructureNV 后备存储的内存需求。

  • VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV 请求初始构建期间临时空间的内存需求。

  • VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV 请求更新期间临时空间的内存需求。

vkGetAccelerationStructureBuildSizesKHRbuildType 的可能值为:

// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureBuildTypeKHR {
    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR = 0,
    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR = 1,
    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR = 2,
} VkAccelerationStructureBuildTypeKHR;
  • VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR 请求主机执行操作的内存需求。

  • VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR 请求设备执行操作的内存需求。

  • VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR 请求主机或设备执行操作的内存需求。

要一次将内存附加到一个或多个加速结构,请调用

// Provided by VK_NV_ray_tracing
VkResult vkBindAccelerationStructureMemoryNV(
    VkDevice                                    device,
    uint32_t                                    bindInfoCount,
    const VkBindAccelerationStructureMemoryInfoNV* pBindInfos);
  • device 是拥有加速结构和内存的逻辑设备。

  • bindInfoCountpBindInfos 中的元素数量。

  • pBindInfos 是一个指向 VkBindAccelerationStructureMemoryInfoNV 结构数组的指针,该数组描述了要绑定的加速结构和内存。

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

  • VUID-vkBindAccelerationStructureMemoryNV-pBindInfos-parameter
    pBindInfos 必须是指向 bindInfoCount 个有效的 VkBindAccelerationStructureMemoryInfoNV 结构数组的有效指针

  • VUID-vkBindAccelerationStructureMemoryNV-bindInfoCount-arraylength
    bindInfoCount 必须大于 0

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkBindAccelerationStructureMemoryInfoNV 结构的定义如下:

// Provided by VK_NV_ray_tracing
typedef struct VkBindAccelerationStructureMemoryInfoNV {
    VkStructureType              sType;
    const void*                  pNext;
    VkAccelerationStructureNV    accelerationStructure;
    VkDeviceMemory               memory;
    VkDeviceSize                 memoryOffset;
    uint32_t                     deviceIndexCount;
    const uint32_t*              pDeviceIndices;
} VkBindAccelerationStructureMemoryInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • accelerationStructure 是要附加到内存的加速结构。

  • memory 是一个 VkDeviceMemory 对象,描述要附加的设备内存。

  • memoryOffset 是要绑定到加速结构的内存区域的起始偏移量。从 memoryOffset 字节开始,memoryVkMemoryRequirements::size 成员中返回的字节数将绑定到指定的加速结构。

  • deviceIndexCountpDeviceIndices 中的元素数量。

  • pDeviceIndices 是一个指向设备索引数组的指针。

有效用法
  • VUID-VkBindAccelerationStructureMemoryInfoNV-accelerationStructure-03620
    accelerationStructure 必须尚未由内存对象支持

  • VUID-VkBindAccelerationStructureMemoryInfoNV-memoryOffset-03621
    memoryOffset 必须小于 memory 的大小

  • VUID-VkBindAccelerationStructureMemoryInfoNV-memory-03622
    memory 必须已使用从调用 vkGetAccelerationStructureMemoryRequirementsNV 返回的 VkMemoryRequirements 结构的 memoryTypeBits 成员中允许的内存类型之一分配,其中 accelerationStructuretypeVK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV

  • VUID-VkBindAccelerationStructureMemoryInfoNV-memoryOffset-03623
    memoryOffset 必须是调用 vkGetAccelerationStructureMemoryRequirementsNV 返回的 VkMemoryRequirements 结构的 alignment 成员的整数倍,其中 accelerationStructuretypeVK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV

  • VUID-VkBindAccelerationStructureMemoryInfoNV-size-03624
    从调用 vkGetAccelerationStructureMemoryRequirementsNV 返回的 VkMemoryRequirements 结构的 size 成员(其中 accelerationStructuretypeVK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV必须小于或等于 memory 的大小减去 memoryOffset

有效用法(隐式)
  • VUID-VkBindAccelerationStructureMemoryInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV

  • VUID-VkBindAccelerationStructureMemoryInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkBindAccelerationStructureMemoryInfoNV-accelerationStructure-parameter
    accelerationStructure 必须是一个有效的 VkAccelerationStructureNV 句柄

  • VUID-VkBindAccelerationStructureMemoryInfoNV-memory-parameter
    memory 必须 是一个有效的 VkDeviceMemory 句柄

  • VUID-VkBindAccelerationStructureMemoryInfoNV-pDeviceIndices-parameter
    如果 deviceIndexCount 不为 0,则 pDeviceIndices 必须 是一个指向 deviceIndexCountuint32_t 值数组的有效指针

  • VUID-VkBindAccelerationStructureMemoryInfoNV-commonparent
    accelerationStructurememory必须是从同一个 VkDevice 创建、分配或检索的

为了允许在需要时使用设备代码构造几何实例,我们需要能够查询加速结构的不透明句柄。这个句柄是一个 8 字节的值。要获取此句柄,请调用

// Provided by VK_NV_ray_tracing
VkResult vkGetAccelerationStructureHandleNV(
    VkDevice                                    device,
    VkAccelerationStructureNV                   accelerationStructure,
    size_t                                      dataSize,
    void*                                       pData);
  • device 是拥有加速结构的逻辑设备。

  • accelerationStructure 是加速结构。

  • dataSizepData 指向的缓冲区的大小(以字节为单位)。

  • pData 是一个指向应用程序分配的缓冲区的指针,结果将写入其中。

有效用法
  • VUID-vkGetAccelerationStructureHandleNV-dataSize-02240
    dataSize 必须足够大,以包含如上所述的查询结果

  • VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-02787
    accelerationStructure 必须通过 vkBindAccelerationStructureMemoryNV 完全且连续地绑定到单个 VkDeviceMemory 对象

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

  • VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parameter
    accelerationStructure 必须是一个有效的 VkAccelerationStructureNV 句柄

  • VUID-vkGetAccelerationStructureHandleNV-pData-parameter
    pData 必须 是指向 dataSize 字节数组的有效指针

  • VUID-vkGetAccelerationStructureHandleNV-dataSize-arraylength
    dataSize 必须 大于 0

  • VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parent
    accelerationStructure 必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要查询加速结构的 64 位设备地址,请调用

// Provided by VK_KHR_acceleration_structure
VkDeviceAddress vkGetAccelerationStructureDeviceAddressKHR(
    VkDevice                                    device,
    const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);

64 位返回值是加速结构的地址,可用于涉及加速结构的设备和着色器操作,例如光线遍历和加速结构构建。

如果加速结构是使用 VkAccelerationStructureCreateInfoKHR::deviceAddress 的非零值创建的,则返回值将是相同的地址。

如果加速结构是使用 VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRtype 创建的,则返回的地址必须与使用同一 VkBuffer 分配的 typeVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 的其他加速结构的相对偏移量保持一致。也就是说,两者返回的地址之间的差值必须与加速结构创建时提供的偏移量之差相同。

返回的地址必须与 256 字节对齐。

对于 VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 以外的加速结构类型,加速结构设备地址可能与加速结构在其存储缓冲区中的起始偏移量对应的缓冲区设备地址不同。

有效用法
  • VUID-vkGetAccelerationStructureDeviceAddressKHR-accelerationStructure-08935
    **必须**启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkGetAccelerationStructureDeviceAddressKHR-device-03504
    如果使用多个物理设备创建了 device,则**必须**启用 bufferDeviceAddressMultiDevice 功能

  • VUID-vkGetAccelerationStructureDeviceAddressKHR-pInfo-09541
    如果放置 pInfo->accelerationStructure 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkGetAccelerationStructureDeviceAddressKHR-pInfo-09542
    放置 pInfo->accelerationStructure 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 使用标志创建

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

  • VUID-vkGetAccelerationStructureDeviceAddressKHR-pInfo-parameter
    pInfo 必须是指向有效的 VkAccelerationStructureDeviceAddressInfoKHR 结构的有效指针

VkAccelerationStructureDeviceAddressInfoKHR 结构的定义如下

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureDeviceAddressInfoKHR {
    VkStructureType               sType;
    const void*                   pNext;
    VkAccelerationStructureKHR    accelerationStructure;
} VkAccelerationStructureDeviceAddressInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • accelerationStructure 指定要查询其地址的加速结构。

有效用法(隐式)
  • VUID-VkAccelerationStructureDeviceAddressInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR

  • VUID-VkAccelerationStructureDeviceAddressInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkAccelerationStructureDeviceAddressInfoKHR-accelerationStructure-parameter
    accelerationStructure 必须是一个有效的 VkAccelerationStructureKHR 句柄

微映射图

微型映射是不透明的数据结构,由实现构建,用于编码子三角形数据,以便包含在加速结构中。

微型映射由 VkMicromapEXT 句柄表示。

// Provided by VK_EXT_opacity_micromap
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkMicromapEXT)

要创建微型映射,请调用

// Provided by VK_EXT_opacity_micromap
VkResult vkCreateMicromapEXT(
    VkDevice                                    device,
    const VkMicromapCreateInfoEXT*              pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkMicromapEXT*                              pMicromap);
  • device 是创建加速结构对象的逻辑设备。

  • pCreateInfo 是指向 VkMicromapCreateInfoEXT 结构的指针,该结构包含影响微型映射创建的参数。

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

  • pMicromap 是指向 VkMicromapEXT 句柄的指针,结果微型映射对象将返回到该句柄中。

与 Vulkan 中的其他对象类似,微型映射的创建仅仅是创建一个具有特定“形状”的对象。可以构建到微型映射中的几何图形的类型和数量由 VkMicromapCreateInfoEXT 的参数确定。

微型映射数据存储在 VkMicromapCreateInfoEXT::buffer 引用的对象中。一旦内存绑定到该缓冲区,它必须通过微型映射构建或微型映射复制命令(如 vkCmdBuildMicromapsEXTvkBuildMicromapsEXTvkCmdCopyMicromapEXTvkCopyMicromapEXT)填充。

跟踪捕获/重放工具的预期用法是,它将使用微型映射复制命令序列化和反序列化微型映射数据。在捕获期间,该工具将使用 vkCopyMicromapToMemoryEXTvkCmdCopyMicromapToMemoryEXT,其中 modeVK_COPY_MICROMAP_MODE_SERIALIZE_EXT,并在重放期间使用 vkCopyMemoryToMicromapEXTvkCmdCopyMemoryToMicromapEXT,其中 modeVK_COPY_MICROMAP_MODE_DESERIALIZE_EXT

传递给微型映射构建命令的输入缓冲区将在命令执行期间被实现引用。微型映射必须是完全自包含的。应用程序可以重用或释放命令用作输入或暂存的任何内存,而不会影响后续使用微型映射的加速结构构建或该加速结构的遍历结果。

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

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

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

  • VUID-vkCreateMicromapEXT-pMicromap-parameter
    pMicromap 必须是指向 VkMicromapEXT 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

VkMicromapCreateInfoEXT 结构定义如下:

// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapCreateInfoEXT {
    VkStructureType             sType;
    const void*                 pNext;
    VkMicromapCreateFlagsEXT    createFlags;
    VkBuffer                    buffer;
    VkDeviceSize                offset;
    VkDeviceSize                size;
    VkMicromapTypeEXT           type;
    VkDeviceAddress             deviceAddress;
} VkMicromapCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • createFlagsVkMicromapCreateFlagBitsEXT 的位掩码,指定微型映射的其他创建参数。

  • buffer 是将存储微型映射的缓冲区。

  • offset 是从缓冲区基址开始存储微型映射的偏移量(以字节为单位),并且必须256 的倍数。

  • size 是微型映射所需的大小。

  • typeVkMicromapTypeEXT 值,指定将要创建的微型映射的类型。

  • deviceAddress 是如果使用 micromapCaptureReplay 功能,则为微型映射请求的设备地址。

如果 deviceAddress 为零,则不请求特定地址。

如果 deviceAddress 不为零,则 deviceAddress 必须是从同一实现上以相同方式创建的微型映射检索的地址。微型映射必须也放置在以相同方式创建的 buffer 上,并且偏移量 offset 相同。

应用程序避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的微型映射,以减少出现 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR 错误的几率。

此操作的预期用法是,跟踪捕获/重放工具会将 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 标志添加到所有使用 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 的缓冲区,并将 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 添加到所有用作微型映射存储的缓冲区,其中 deviceAddress 不为零。这也意味着该工具需要将 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT 添加到内存分配中,以允许设置该标志,而在其他情况下应用程序可能不需要该标志。在捕获期间,该工具将保存跟踪中查询到的不透明设备地址。在重放期间,将创建缓冲区并指定原始地址,以便存储在跟踪数据中的任何地址值都保持有效。

实现预期会将此类缓冲区在 GPU 地址空间中分隔开,以便正常分配避免使用这些地址。应用程序和工具应避免混合使用为使用 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 创建的缓冲区提供的应用程序地址和实现提供的地址,以避免地址空间分配冲突。

如果微型映射将成为构建操作的目标,则可以使用 vkGetMicromapBuildSizesEXT 查询微型映射的所需大小。

有效用法
  • VUID-VkMicromapCreateInfoEXT-deviceAddress-07433
    如果 deviceAddress 不为零,则 createFlags 必须包含 VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT

  • VUID-VkMicromapCreateInfoEXT-createFlags-07434
    如果 createFlags 包含 VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT,则 VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapCaptureReplay 必须VK_TRUE

  • VUID-VkMicromapCreateInfoEXT-buffer-07435
    创建 buffer 时,其 usage必须包含 VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT

  • VUID-VkMicromapCreateInfoEXT-buffer-07436
    buffer 必须未使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 创建。

  • VUID-VkMicromapCreateInfoEXT-offset-07437
    offsetsize 的总和必须小于 buffer 的大小。

  • VUID-VkMicromapCreateInfoEXT-offset-07438
    offset 必须256 字节的倍数。

有效用法(隐式)
  • VUID-VkMicromapCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT

  • VUID-VkMicromapCreateInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkMicromapCreateInfoEXT-createFlags-parameter
    createFlags 必须VkMicromapCreateFlagBitsEXT 值的有效组合

  • VUID-VkMicromapCreateInfoEXT-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkMicromapCreateInfoEXT-type-parameter
    type 必须是有效的 VkMicromapTypeEXT

要获取微型图的构建大小,请调用

// Provided by VK_EXT_opacity_micromap
void vkGetMicromapBuildSizesEXT(
    VkDevice                                    device,
    VkAccelerationStructureBuildTypeKHR         buildType,
    const VkMicromapBuildInfoEXT*               pBuildInfo,
    VkMicromapBuildSizesInfoEXT*                pSizeInfo);
  • device 是将用于创建微型图的逻辑设备。

  • buildType 定义是查询主机还是设备操作(或两者)。

  • pBuildInfo 是指向 VkMicromapBuildInfoEXT 结构的指针,该结构描述了构建操作的参数。

  • pSizeInfo 是指向 VkMicromapBuildSizesInfoEXT 结构的指针,该结构返回微型图所需的大小以及给定构建参数的临时缓冲区所需的大小。

pBuildInfodstMicromapmode 成员被忽略。此命令将忽略 pBuildInfo 的任何 VkDeviceOrHostAddressKHR 成员。

使用此命令返回的 micromapSize 创建的微型图支持任何使用 VkMicromapBuildInfoEXT 结构的构建,但须符合以下属性

  • 构建命令是主机构建命令,且 buildTypeVK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHRVK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR

  • 构建命令是设备构建命令,且 buildTypeVK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHRVK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR

  • 对于 VkMicromapBuildInfoEXT

    • typeflags 成员分别等于 pBuildInfo->typepBuildInfo->flags

    • pUsageCountsppUsageCounts 中的使用信息总和等于 pBuildInfo->pUsageCountspBuildInfo->ppUsageCounts 中的使用信息总和。

同样,buildScratchSize 值将支持在上述条件下指定 VK_BUILD_MICROMAP_MODE_BUILD_EXT mode 的任何构建命令。

有效用法
  • VUID-vkGetMicromapBuildSizesEXT-dstMicromap-09180
    VkMicromapBuildInfoEXT::dstMicromap 必须已从 device 创建

  • VUID-vkGetMicromapBuildSizesEXT-micromap-07439
    必须启用 micromap 功能。

  • VUID-vkGetMicromapBuildSizesEXT-device-07440
    如果使用多个物理设备创建了 device,则**必须**启用 bufferDeviceAddressMultiDevice 功能

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

  • VUID-vkGetMicromapBuildSizesEXT-buildType-parameter
    buildType 必须是有效的 VkAccelerationStructureBuildTypeKHR

  • VUID-vkGetMicromapBuildSizesEXT-pBuildInfo-parameter
    pBuildInfo 必须是指向有效 VkMicromapBuildInfoEXT 结构的有效指针

  • VUID-vkGetMicromapBuildSizesEXT-pSizeInfo-parameter
    pSizeInfo 必须是指向 VkMicromapBuildSizesInfoEXT 结构的有效指针

VkMicromapBuildSizesInfoEXT 结构描述了微型图和临时缓冲区所需的构建大小,定义如下

// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapBuildSizesInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkDeviceSize       micromapSize;
    VkDeviceSize       buildScratchSize;
    VkBool32           discardable;
} VkMicromapBuildSizesInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • micromapSize 是在 VkMicromapEXT 中进行构建或更新操作所需的字节大小。

  • buildScratchSize 是构建操作的暂存缓冲区中所需的字节大小。

  • discardable 指示微型图对象是否可以在加速结构构建或更新后销毁。false 值表示使用此微型图构建的加速结构可能包含对其中包含的数据的引用,并且应用程序在光线遍历结束后必须不要销毁微型图。true 值表示微型图中的信息将按值复制到加速结构中,并且微型图在加速结构构建完成后可以销毁。

有效用法(隐式)
  • VUID-VkMicromapBuildSizesInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MICROMAP_BUILD_SIZES_INFO_EXT

  • VUID-VkMicromapBuildSizesInfoEXT-pNext-pNext
    pNext 必须NULL

可以在 VkMicromapCreateInfoEXT::type 中设置的值,指定微型图的类型为

// Provided by VK_EXT_opacity_micromap
typedef enum VkMicromapTypeEXT {
    VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT = 0,
#ifdef VK_ENABLE_BETA_EXTENSIONS
  // Provided by VK_NV_displacement_micromap
    VK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV = 1000397000,
#endif
} VkMicromapTypeEXT;
  • VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT 是包含用于控制三角形不透明度的数据的微型图。

  • VK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV 是包含用于控制三角形内子三角形位移的数据的微型图。

可以在 VkMicromapCreateInfoEXT::createFlags 中设置的位,指定微型图的附加创建参数,为

// Provided by VK_EXT_opacity_micromap
typedef enum VkMicromapCreateFlagBitsEXT {
    VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0x00000001,
} VkMicromapCreateFlagBitsEXT;
  • VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT 指定微型图的地址可以保存并在后续运行中重复使用。

// Provided by VK_EXT_opacity_micromap
typedef VkFlags VkMicromapCreateFlagsEXT;

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

可以在 VkMicromapBuildInfoEXT::flags 中设置的位,指定微型图构建的附加参数,为

// Provided by VK_EXT_opacity_micromap
typedef enum VkBuildMicromapFlagBitsEXT {
    VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT = 0x00000001,
    VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT = 0x00000002,
    VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT = 0x00000004,
} VkBuildMicromapFlagBitsEXT;
  • VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT 指定给定的微型图构建应该优先考虑跟踪性能而不是构建时间。

  • VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT 指定给定的微型图构建应该优先考虑构建时间而不是跟踪性能。

// Provided by VK_EXT_opacity_micromap
typedef VkFlags VkBuildMicromapFlagsEXT;

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

要销毁微型图,请调用

// Provided by VK_EXT_opacity_micromap
void vkDestroyMicromapEXT(
    VkDevice                                    device,
    VkMicromapEXT                               micromap,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁微型图的逻辑设备。

  • micromap 是要销毁的微型图。

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

有效用法
  • VUID-vkDestroyMicromapEXT-micromap-10382
    必须启用 micromap 功能。

  • VUID-vkDestroyMicromapEXT-micromap-07441
    所有引用 micromap 的提交命令必须已完成执行

  • VUID-vkDestroyMicromapEXT-micromap-07442
    如果创建 micromap 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyMicromapEXT-micromap-07443
    如果创建 micromap 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyMicromapEXT-micromap-parameter
    如果 micromap 不是 VK_NULL_HANDLE,则 micromap 必须是有效的 VkMicromapEXT 句柄

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

  • VUID-vkDestroyMicromapEXT-micromap-parent
    如果 micromap 是有效的句柄,它必须已从 device 创建、分配或检索

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

资源内存关联

资源最初创建为没有后备内存的虚拟分配。设备内存是单独分配的(请参阅设备内存),然后与资源关联。对于稀疏和非稀疏资源,此关联方式有所不同。

使用任何稀疏创建标志创建的资源都被视为稀疏资源。不使用这些标志创建的资源是非稀疏资源。有关稀疏资源的资源内存关联的详细信息,请参阅 稀疏资源

非稀疏资源在作为参数传递给以下任何操作之前,必须完整且连续地绑定到单个 VkDeviceMemory 对象:

  • 创建图像或缓冲区视图

  • 更新描述符集

  • 在命令缓冲区中记录命令

一旦绑定,内存绑定在资源的生命周期内是不可变的。

在表示多个物理设备的逻辑设备中,缓冲区和图像资源存在于所有物理设备上,但它们在每个物理设备上的内存绑定方式可以不同。每个这样的复制资源都是该资源的一个实例。对于稀疏资源,每个实例的内存绑定方式可以任意不同。对于非稀疏资源,每个实例可以绑定到本地或对等内存实例,或者对于图像,可以绑定到来自本地和/或对等实例的矩形区域。当资源在描述符集中使用时,每个物理设备都会根据其自身实例的内存绑定来解释描述符。

没有新的复制命令用于在物理设备之间传输数据。相反,应用程序可以创建一个具有对等映射的资源,并将其用作由单个物理设备执行的传输命令的源或目标,以将数据从一个物理设备复制到另一个物理设备。

要确定缓冲区资源的内存需求,请调用

// Provided by VK_VERSION_1_0
void vkGetBufferMemoryRequirements(
    VkDevice                                    device,
    VkBuffer                                    buffer,
    VkMemoryRequirements*                       pMemoryRequirements);
  • device 是拥有该缓冲区的逻辑设备。

  • buffer 是要查询的缓冲区。

  • pMemoryRequirements 是指向 VkMemoryRequirements 结构的指针,该结构中返回缓冲区对象的内存需求。

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

  • VUID-vkGetBufferMemoryRequirements-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkGetBufferMemoryRequirements-pMemoryRequirements-parameter
    pMemoryRequirements 必须是指向 VkMemoryRequirements 结构的有效指针

  • VUID-vkGetBufferMemoryRequirements-buffer-parent
    buffer 必须已从 device 创建、分配或检索

要确定未设置 VK_IMAGE_CREATE_DISJOINT_BIT 标志的图像资源的内存需求,请调用

// Provided by VK_VERSION_1_0
void vkGetImageMemoryRequirements(
    VkDevice                                    device,
    VkImage                                     image,
    VkMemoryRequirements*                       pMemoryRequirements);
  • device 是拥有该图像的逻辑设备。

  • image 是要查询的图像。

  • pMemoryRequirements 是指向 VkMemoryRequirements 结构的指针,该结构中返回图像对象的内存需求。

有效用法
  • VUID-vkGetImageMemoryRequirements-image-01588
    image 必须没有设置 VK_IMAGE_CREATE_DISJOINT_BIT 标志创建

  • VUID-vkGetImageMemoryRequirements-image-04004
    如果使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 外部内存句柄类型创建 image,则 image 必须绑定到内存

  • VUID-vkGetImageMemoryRequirements-image-08960
    如果 image 是使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX 外部内存句柄类型创建的,则 image 必须绑定到内存

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

  • VUID-vkGetImageMemoryRequirements-image-parameter
    image 必须是有效的 VkImage 句柄

  • VUID-vkGetImageMemoryRequirements-pMemoryRequirements-parameter
    pMemoryRequirements 必须是指向 VkMemoryRequirements 结构的有效指针

  • VUID-vkGetImageMemoryRequirements-image-parent
    image 必须是从 device 创建、分配或检索的

VkMemoryRequirements 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkMemoryRequirements {
    VkDeviceSize    size;
    VkDeviceSize    alignment;
    uint32_t        memoryTypeBits;
} VkMemoryRequirements;
  • size 是资源所需的内存分配的大小(以字节为单位)。

  • alignment 是资源所需的分配内偏移量的对齐方式(以字节为单位)。

  • memoryTypeBits 是一个位掩码,其中为资源支持的每个内存类型设置一位。当且仅当物理设备的 VkPhysicalDeviceMemoryProperties 结构中的内存类型 i 受资源支持时,才会设置位 i

绑定到外部 Android 硬件缓冲区内存的图像的精确大小在导入或分配内存之前是未知的,因此应用程序在将 VkImage 绑定到内存之前,必须不要使用这样的 VkImage 调用 vkGetImageMemoryRequirementsvkGetImageMemoryRequirements2。出于此原因,应用程序也必须不要使用描述外部 Android 硬件缓冲区的 VkImageCreateInfo 调用 vkGetDeviceImageMemoryRequirements。导入 Android 硬件缓冲区内存时,可以通过调用 vkGetAndroidHardwareBufferPropertiesANDROID 来确定 allocationSize。为可以导出到 Android 硬件缓冲区的 VkImage 分配新内存时,内存的 allocationSize 必须为零;实际大小将由专用图像的参数确定。分配内存后,可以通过获取图像的内存需求或通过使用从内存导出的 Android 硬件缓冲区调用 vkGetAndroidHardwareBufferPropertiesANDROID 来获得从内存堆分配的空间量。

可以导出到 Android 硬件缓冲区的 VkBuffer 分配新内存时,应用程序仍然可以VkBuffer 绑定到内存之前使用 VkBuffer 调用 vkGetBufferMemoryRequirementsvkGetBufferMemoryRequirements2

如果查询的资源是使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BITVK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BITVK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT 外部内存句柄类型创建的,则 size 的值没有意义,应该被忽略。

  • memoryTypeBits 成员始终包含至少一位已设置。

  • 如果 buffer 是一个不是使用 VK_BUFFER_CREATE_SPARSE_BINDING_BITVK_BUFFER_CREATE_PROTECTED_BIT 位设置创建的 VkBuffer,或者如果 image 是一个不是使用 VK_IMAGE_CREATE_PROTECTED_BIT 位设置创建的线性图像,则 memoryTypeBits 成员始终包含至少一个位,该位对应于具有 propertyFlagsVkMemoryType,该 propertyFlags 同时设置了 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT 位和 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 位。换句话说,可映射的相干内存可以始终附加到这些对象。

  • 如果 buffer 是使用 VkExternalMemoryBufferCreateInfo::handleTypes 设置为 0 创建的,或者 image 是使用 VkExternalMemoryImageCreateInfo::handleTypes 设置为 0 创建的,则 memoryTypeBits 成员始终包含至少一个位,该位对应于具有 propertyFlagsVkMemoryType,该 propertyFlags 设置了 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 位。

  • 对于使用 VkBufferCreateInfo 结构中的 flagsusage 成员的相同值创建的所有 VkBuffer 对象,以及传递给 vkCreateBufferVkExternalMemoryBufferCreateInfo 结构的 handleTypes 成员,memoryTypeBits 成员是相同的。此外,如果类型为 VkBufferUsageFlagsusage1usage2 使得 usage2 中设置的位是 usage1 中设置的位的子集,并且它们具有相同的 flagsVkExternalMemoryBufferCreateInfo::handleTypes,则对于 usage1 返回的 memoryTypeBits 中设置的位必须是为 usage2 返回的 memoryTypeBits 中设置的位的子集,对于 flags 的所有值。

  • alignment 成员是 2 的幂。

  • 对于使用传递给 vkCreateBufferVkBufferCreateInfo 结构中的 usageflags 成员的相同值组合创建的所有 VkBuffer 对象,alignment 成员是相同的。

  • 如果启用了maintenance4 功能,则对于使用传递给 vkCreateImageVkImageCreateInfo 结构中的 flagsimageTypeformatextentmipLevelsarrayLayerssamplestilingusage 成员的相同值组合创建的所有 VkImage 对象,alignment 成员是相同的。

  • alignment 成员满足与 VkBufferusage 关联的缓冲区描述符偏移量对齐要求。

    • 如果 usage 包括 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BITVK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,则 alignment 必须VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment 的整数倍。

    • 如果 usage 包括 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,则 alignment 必须VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment 的整数倍。

    • 如果 usage 包括 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,则 alignment 必须VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment 的整数倍。

  • 对于使用颜色格式创建的图像,对于使用传递给 vkCreateImageVkImageCreateInfo 结构中的 tiling 成员、flags 成员的 VK_IMAGE_CREATE_SPARSE_BINDING_BIT 位和 VK_IMAGE_CREATE_PROTECTED_BIT 位、flags 成员的 VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT 位、如果 VkPhysicalDeviceHostImageCopyProperties::identicalMemoryTypeRequirements 属性为 VK_FALSE,则 usage 成员的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 位、VkExternalMemoryImageCreateInfohandleTypes 成员以及 usage 成员的 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 位 的相同值组合创建的所有 VkImage 对象,memoryTypeBits 成员是相同的。

  • 对于使用深度/模板格式创建的图像,对于使用传递给 vkCreateImageVkImageCreateInfo 结构中的 format 成员、tiling 成员、flags 成员的 VK_IMAGE_CREATE_SPARSE_BINDING_BIT 位和 VK_IMAGE_CREATE_PROTECTED_BIT 位、flags 成员的 VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT 位、如果 VkPhysicalDeviceHostImageCopyProperties::identicalMemoryTypeRequirements 属性为 VK_FALSE,则 usage 成员的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 位、VkExternalMemoryImageCreateInfohandleTypes 成员以及 usage 成员的 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 位 的相同值组合创建的所有 VkImage 对象,memoryTypeBits 成员是相同的。

  • 如果内存要求是针对 VkImage 的,则如果 image 在传递给 vkCreateImageVkImageCreateInfo 结构的 usage 成员中没有设置 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 位,则 memoryTypeBits 成员必须不引用具有设置了 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT 位的 propertyFlagsVkMemoryType

  • 如果内存要求是针对 VkBuffer 的,则 memoryTypeBits 成员必须不引用具有设置了 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT 位的 propertyFlagsVkMemoryType

    此要求的含义是,在所有情况下都不允许为缓冲区分配延迟分配的内存。

  • 对于使用 VkBufferCreateInfo 及其 pNext 链中指定的相同创建参数组合创建的所有 VkBuffer 对象,size 成员是相同的。

  • 对于使用 VkImageCreateInfo 及其 pNext 链中指定的相同创建参数组合创建的所有 VkImage 对象,size 成员是相同的。

    但是,这并不意味着它们彼此之间以相同的方式解释绑定内存的内容。但是,可以使用 VK_IMAGE_CREATE_ALIAS_BIT 显式请求该附加保证。

  • 如果启用了maintenance4 功能,则这些附加保证适用。

要确定缓冲区资源的内存需求,请调用

// Provided by VK_VERSION_1_1
void vkGetBufferMemoryRequirements2(
    VkDevice                                    device,
    const VkBufferMemoryRequirementsInfo2*      pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);

或等效命令

// Provided by VK_KHR_get_memory_requirements2
void vkGetBufferMemoryRequirements2KHR(
    VkDevice                                    device,
    const VkBufferMemoryRequirementsInfo2*      pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);
  • device 是拥有该缓冲区的逻辑设备。

  • pInfo 是指向 VkBufferMemoryRequirementsInfo2 结构的指针,该结构包含内存需求查询所需的参数。

  • pMemoryRequirements 是指向 VkMemoryRequirements2 结构的指针,其中返回缓冲区对象的内存需求。

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

  • VUID-vkGetBufferMemoryRequirements2-pInfo-parameter
    pInfo 必须 是指向有效 VkBufferMemoryRequirementsInfo2 结构的有效指针

  • VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针

要确定缓冲区资源的内存需求而无需创建对象,请调用

// Provided by VK_VERSION_1_3
void vkGetDeviceBufferMemoryRequirements(
    VkDevice                                    device,
    const VkDeviceBufferMemoryRequirements*     pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);

或等效命令

// Provided by VK_KHR_maintenance4
void vkGetDeviceBufferMemoryRequirementsKHR(
    VkDevice                                    device,
    const VkDeviceBufferMemoryRequirements*     pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);
  • device 是计划拥有缓冲区的逻辑设备。

  • pInfo 是指向 VkDeviceBufferMemoryRequirements 结构的指针,该结构包含内存需求查询所需的参数。

  • pMemoryRequirements 是指向 VkMemoryRequirements2 结构的指针,其中返回缓冲区对象的内存需求。

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

  • VUID-vkGetDeviceBufferMemoryRequirements-pInfo-parameter
    pInfo 必须 是指向有效 VkDeviceBufferMemoryRequirements 结构的有效指针

  • VUID-vkGetDeviceBufferMemoryRequirements-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针

VkBufferMemoryRequirementsInfo2 结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkBufferMemoryRequirementsInfo2 {
    VkStructureType    sType;
    const void*        pNext;
    VkBuffer           buffer;
} VkBufferMemoryRequirementsInfo2;

或等效形式:

// Provided by VK_KHR_get_memory_requirements2
typedef VkBufferMemoryRequirementsInfo2 VkBufferMemoryRequirementsInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • buffer 是要查询的缓冲区。

有效用法(隐式)
  • VUID-VkBufferMemoryRequirementsInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2

  • VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

VkDeviceBufferMemoryRequirements 结构的定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkDeviceBufferMemoryRequirements {
    VkStructureType              sType;
    const void*                  pNext;
    const VkBufferCreateInfo*    pCreateInfo;
} VkDeviceBufferMemoryRequirements;

或等效形式:

// Provided by VK_KHR_maintenance4
typedef VkDeviceBufferMemoryRequirements VkDeviceBufferMemoryRequirementsKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pCreateInfo 是指向 VkBufferCreateInfo 结构的指针,该结构包含影响要查询的缓冲区创建的参数。

有效用法(隐式)
  • VUID-VkDeviceBufferMemoryRequirements-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS

  • VUID-VkDeviceBufferMemoryRequirements-pNext-pNext
    pNext 必须NULL

  • VUID-VkDeviceBufferMemoryRequirements-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效 VkBufferCreateInfo 结构的有效指针

要确定图像资源的内存需求,请调用

// Provided by VK_VERSION_1_1
void vkGetImageMemoryRequirements2(
    VkDevice                                    device,
    const VkImageMemoryRequirementsInfo2*       pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);

或等效命令

// Provided by VK_KHR_get_memory_requirements2
void vkGetImageMemoryRequirements2KHR(
    VkDevice                                    device,
    const VkImageMemoryRequirementsInfo2*       pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);
  • device 是拥有该图像的逻辑设备。

  • pInfo 是指向 VkImageMemoryRequirementsInfo2 结构的指针,该结构包含内存需求查询所需的参数。

  • pMemoryRequirements 是指向 VkMemoryRequirements2 结构的指针,其中返回图像对象的内存需求。

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

  • VUID-vkGetImageMemoryRequirements2-pInfo-parameter
    pInfo 必须 是指向有效 VkImageMemoryRequirementsInfo2 结构的有效指针

  • VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针

要确定图像资源的内存需求而无需创建对象,请调用

// Provided by VK_VERSION_1_3
void vkGetDeviceImageMemoryRequirements(
    VkDevice                                    device,
    const VkDeviceImageMemoryRequirements*      pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);

或等效命令

// Provided by VK_KHR_maintenance4
void vkGetDeviceImageMemoryRequirementsKHR(
    VkDevice                                    device,
    const VkDeviceImageMemoryRequirements*      pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);
  • device 是计划拥有图像的逻辑设备。

  • pInfo 是指向 VkDeviceImageMemoryRequirements 结构的指针,该结构包含内存需求查询所需的参数。

  • pMemoryRequirements 是指向 VkMemoryRequirements2 结构的指针,其中返回图像对象的内存需求。

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

  • VUID-vkGetDeviceImageMemoryRequirements-pInfo-parameter
    pInfo 必须 是指向有效 VkDeviceImageMemoryRequirements 结构的有效指针

  • VUID-vkGetDeviceImageMemoryRequirements-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针

VkImageMemoryRequirementsInfo2 结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkImageMemoryRequirementsInfo2 {
    VkStructureType    sType;
    const void*        pNext;
    VkImage            image;
} VkImageMemoryRequirementsInfo2;

或等效形式:

// Provided by VK_KHR_get_memory_requirements2
typedef VkImageMemoryRequirementsInfo2 VkImageMemoryRequirementsInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • image 是要查询的图像。

有效用法
  • VUID-VkImageMemoryRequirementsInfo2-image-01589
    如果 image 是使用多平面格式和 VK_IMAGE_CREATE_DISJOINT_BIT 标志创建的,则 必须VkImageMemoryRequirementsInfo2 结构的 pNext 链中包含一个 VkImagePlaneMemoryRequirementsInfo

  • VUID-VkImageMemoryRequirementsInfo2-image-02279
    如果 image 是使用 VK_IMAGE_CREATE_DISJOINT_BITVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 创建的,则 必须VkImageMemoryRequirementsInfo2 结构的 pNext 链中包含一个 VkImagePlaneMemoryRequirementsInfo

  • VUID-VkImageMemoryRequirementsInfo2-image-01590
    如果 image 不是使用 VK_IMAGE_CREATE_DISJOINT_BIT 标志创建的,则 不得VkImageMemoryRequirementsInfo2 结构的 pNext 链中包含一个 VkImagePlaneMemoryRequirementsInfo

  • VUID-VkImageMemoryRequirementsInfo2-image-02280
    如果 image 是使用单平面格式且使用除 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 之外的任何 tiling 创建的,则 不得VkImageMemoryRequirementsInfo2 结构的 pNext 链中包含一个 VkImagePlaneMemoryRequirementsInfo

  • VUID-VkImageMemoryRequirementsInfo2-image-01897
    如果使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 外部内存句柄类型创建 image,则 image 必须绑定到内存

  • VUID-VkImageMemoryRequirementsInfo2-image-08961
    如果 image 是使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX 外部内存句柄类型创建的,则 image 必须绑定到内存

有效用法(隐式)
  • VUID-VkImageMemoryRequirementsInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2

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

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

  • VUID-VkImageMemoryRequirementsInfo2-image-parameter
    image 必须是有效的 VkImage 句柄

VkDeviceImageMemoryRequirements 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkDeviceImageMemoryRequirements {
    VkStructureType             sType;
    const void*                 pNext;
    const VkImageCreateInfo*    pCreateInfo;
    VkImageAspectFlagBits       planeAspect;
} VkDeviceImageMemoryRequirements;

或等效形式:

// Provided by VK_KHR_maintenance4
typedef VkDeviceImageMemoryRequirements VkDeviceImageMemoryRequirementsKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pCreateInfo 是一个指向 VkImageCreateInfo 结构体的指针,该结构体包含影响要查询的图像创建的参数。

  • planeAspect 是一个 VkImageAspectFlagBits 值,指定要查询的图像平面的 aspect。 除非 pCreateInfo->tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,或者 pCreateInfo->flags 设置了 VK_IMAGE_CREATE_DISJOINT_BIT,否则此参数将被忽略。

有效用法
  • VUID-VkDeviceImageMemoryRequirements-pCreateInfo-06416
    pCreateInfo->pNext 链 **必须** 不包含 VkImageSwapchainCreateInfoKHR 结构体。

  • VUID-VkDeviceImageMemoryRequirements-pCreateInfo-06776
    pCreateInfo->pNext 链 **必须** 不包含 VkImageDrmFormatModifierExplicitCreateInfoEXT 结构体。

  • VUID-VkDeviceImageMemoryRequirements-pNext-06996
    应用程序也 **必须** 不能使用 vkGetDeviceImageMemoryRequirements 函数,其 VkImageCreateInfopNext 链中包含 externalFormat 非零的 VkExternalFormatANDROID 结构体。

  • VUID-VkDeviceImageMemoryRequirements-pNext-08962
    应用程序也 **必须** 不能使用 vkGetDeviceImageMemoryRequirements 函数,其 VkImageCreateInfopNext 链中包含 externalFormat 非零的 VkExternalFormatQNX 结构体。

  • VUID-VkDeviceImageMemoryRequirements-pCreateInfo-06417
    如果 pCreateInfo->format 指定了多平面格式,并且 pCreateInfo->flags 设置了 VK_IMAGE_CREATE_DISJOINT_BIT,则 planeAspect **必须** 不能是 VK_IMAGE_ASPECT_NONE_KHR

  • VUID-VkDeviceImageMemoryRequirements-pCreateInfo-06419
    如果 pCreateInfo->flags 设置了 VK_IMAGE_CREATE_DISJOINT_BIT,且 pCreateInfo->tilingVK_IMAGE_TILING_LINEARVK_IMAGE_TILING_OPTIMAL,则 planeAspect **必须** 是一个有效的 多平面 aspect 掩码 位。

  • VUID-VkDeviceImageMemoryRequirements-pCreateInfo-06420
    如果 pCreateInfo->tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 planeAspect **必须** 是该图像的单个有效的*内存平面*(即,aspectMask **必须** 指定一个小于与图像的 formatVkImageDrmFormatModifierPropertiesEXT::drmFormatModifier 相关的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount 的平面索引)。

有效用法(隐式)
  • VUID-VkDeviceImageMemoryRequirements-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS

  • VUID-VkDeviceImageMemoryRequirements-pNext-pNext
    pNext 必须NULL

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

  • VUID-VkDeviceImageMemoryRequirements-planeAspect-parameter
    如果 planeAspect 不为 0,则 planeAspect **必须** 是一个有效的 VkImageAspectFlagBits 值。

要确定分离图像平面的内存需求,请将 VkImagePlaneMemoryRequirementsInfo 结构体添加到 VkImageMemoryRequirementsInfo2 结构体的 pNext 链中。

VkImagePlaneMemoryRequirementsInfo 结构体定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkImagePlaneMemoryRequirementsInfo {
    VkStructureType          sType;
    const void*              pNext;
    VkImageAspectFlagBits    planeAspect;
} VkImagePlaneMemoryRequirementsInfo;

或等效形式:

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

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

  • planeAspect 是一个 VkImageAspectFlagBits 值,指定要查询的图像平面的 aspect。

有效用法
  • VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281
    如果图像的 tilingVK_IMAGE_TILING_LINEARVK_IMAGE_TILING_OPTIMAL,则 planeAspect **必须** 是一个有效的 多平面 aspect 掩码 位。

  • VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02282
    如果图像的 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 planeAspect **必须** 是该图像的单个有效的*内存平面*(即,aspectMask **必须** 指定一个小于与图像的 formatVkImageDrmFormatModifierPropertiesEXT::drmFormatModifier 相关的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount 的平面索引)。

有效用法(隐式)
  • VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO

  • VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter
    planeAspect **必须** 是一个有效的 VkImageAspectFlagBits 值。

VkMemoryRequirements2 结构体定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkMemoryRequirements2 {
    VkStructureType         sType;
    void*                   pNext;
    VkMemoryRequirements    memoryRequirements;
} VkMemoryRequirements2;

或等效形式:

// Provided by VK_KHR_get_memory_requirements2, VK_NV_ray_tracing with VK_KHR_get_memory_requirements2 or VK_VERSION_1_1
typedef VkMemoryRequirements2 VkMemoryRequirements2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • memoryRequirements 是一个 VkMemoryRequirements 结构体,描述了资源的内存需求。

有效用法(隐式)
  • VUID-VkMemoryRequirements2-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2

  • VUID-VkMemoryRequirements2-pNext-pNext
    pNext **必须** 为 NULL 或指向 VkMemoryDedicatedRequirements 的有效实例的指针。

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

VkMemoryDedicatedRequirements 结构体定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkMemoryDedicatedRequirements {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           prefersDedicatedAllocation;
    VkBool32           requiresDedicatedAllocation;
} VkMemoryDedicatedRequirements;

或等效形式:

// Provided by VK_KHR_dedicated_allocation
typedef VkMemoryDedicatedRequirements VkMemoryDedicatedRequirementsKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • prefersDedicatedAllocation 指定实现更倾向于为此资源使用专用分配。 应用程序仍然可以自由地子分配资源,但如果使用专用分配,则 **可能** 会获得更好的性能。

  • requiresDedicatedAllocation 指定此资源需要专用分配。

要确定缓冲区或图像资源的专用分配需求,请将 VkMemoryDedicatedRequirements 结构体添加到作为 vkGetBufferMemoryRequirements2vkGetImageMemoryRequirements2pMemoryRequirements 参数传递的 VkMemoryRequirements2 结构体的 pNext 链中。

缓冲区资源的返回值的约束为:

  • 如果用于创建被查询缓冲区的 vkCreateBuffer 调用中,VkBufferCreateInfopNext 链包含了 VkExternalMemoryBufferCreateInfo 结构体,并且 VkExternalMemoryBufferCreateInfo::handleTypes 中指定的任何句柄类型要求专用分配,如 vkGetPhysicalDeviceExternalBufferPropertiesVkExternalBufferProperties::externalMemoryProperties.externalMemoryFeatures 中报告的那样,则 requiresDedicatedAllocation 可能VK_TRUE。否则,requiresDedicatedAllocation 将为 VK_FALSE

  • 当实现将 requiresDedicatedAllocation 设置为 VK_TRUE 时,它必须同时将 prefersDedicatedAllocation 设置为 VK_TRUE

  • 如果创建 buffer 时,在 VkBufferCreateInfo::flags 中设置了 VK_BUFFER_CREATE_SPARSE_BINDING_BIT,则 prefersDedicatedAllocationrequiresDedicatedAllocation 都将为 VK_FALSE

关于图像资源返回值的约束是

  • 如果用于创建被查询图像的 vkCreateImage 调用中,VkImageCreateInfopNext 链包含了 VkExternalMemoryImageCreateInfo 结构体,并且 VkExternalMemoryImageCreateInfo::handleTypes 中指定的任何句柄类型要求专用分配,如 vkGetPhysicalDeviceImageFormatProperties2VkExternalImageFormatProperties::externalMemoryProperties.externalMemoryFeatures 中报告的那样,则 requiresDedicatedAllocation 可能VK_TRUE

  • 如果图像的平铺方式为 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 requiresDedicatedAllocation 可能VK_TRUE

  • 否则,requiresDedicatedAllocation 将为 VK_FALSE

  • 如果创建 image 时,在 VkImageCreateInfo::flags 中设置了 VK_IMAGE_CREATE_SPARSE_BINDING_BIT,则 prefersDedicatedAllocationrequiresDedicatedAllocation 都将为 VK_FALSE

有效用法(隐式)
  • VUID-VkMemoryDedicatedRequirements-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS

要将内存附加到缓冲区对象,请调用

// Provided by VK_VERSION_1_0
VkResult vkBindBufferMemory(
    VkDevice                                    device,
    VkBuffer                                    buffer,
    VkDeviceMemory                              memory,
    VkDeviceSize                                memoryOffset);
  • device 是拥有缓冲区和内存的逻辑设备。

  • buffer 是要附加到内存的缓冲区。

  • memory 是一个 VkDeviceMemory 对象,描述要附加的设备内存。

  • memoryOffset 是要绑定到缓冲区的 memory 区域的起始偏移量。从 memoryOffset 字节开始,memoryVkMemoryRequirements::size 成员返回的字节数将被绑定到指定的缓冲区。

vkBindBufferMemory 等效于通过 VkBindBufferMemoryInfo 将相同的参数传递给 vkBindBufferMemory2

有效用法
  • VUID-vkBindBufferMemory-buffer-07459
    buffer 必须尚未绑定到内存对象。

  • VUID-vkBindBufferMemory-buffer-01030
    创建 buffer 时,必须未设置任何稀疏内存绑定标志。

  • VUID-vkBindBufferMemory-memoryOffset-01031
    memoryOffset 必须小于 memory 的大小

  • VUID-vkBindBufferMemory-memory-01035
    memory 必须已使用从调用 vkGetBufferMemoryRequirements 并传入 buffer 返回的 VkMemoryRequirements 结构体的 memoryTypeBits 成员中允许的内存类型之一分配。

  • VUID-vkBindBufferMemory-memoryOffset-01036
    memoryOffset 必须是从调用 vkGetBufferMemoryRequirements 并传入 buffer 返回的 VkMemoryRequirements 结构体的 alignment 成员的整数倍。

  • VUID-vkBindBufferMemory-size-01037
    从调用 vkGetBufferMemoryRequirements 并传入 buffer 返回的 VkMemoryRequirements 结构体的 size 成员必须小于或等于 memory 的大小减去 memoryOffset

  • VUID-vkBindBufferMemory-buffer-01444
    如果 buffer 需要专用分配(如 vkGetBufferMemoryRequirements2VkMemoryDedicatedRequirements::requiresDedicatedAllocation 中针对 buffer 报告的那样),则 memory 必须已使用 VkMemoryDedicatedAllocateInfo::buffer 等于 buffer 分配。

  • VUID-vkBindBufferMemory-memory-01508
    如果在分配 memory 时提供的 VkMemoryAllocateInfopNext 链中包含了 VkMemoryDedicatedAllocateInfo 结构体,并且 VkMemoryDedicatedAllocateInfo::buffer 不是 VK_NULL_HANDLE,则 buffer 必须等于 VkMemoryDedicatedAllocateInfo::buffer,且 memoryOffset 必须为零。

  • VUID-vkBindBufferMemory-None-01898
    如果创建 buffer 时设置了 VK_BUFFER_CREATE_PROTECTED_BIT 位,则该缓冲区必须绑定到使用报告 VK_MEMORY_PROPERTY_PROTECTED_BIT 的内存类型分配的内存对象。

  • VUID-vkBindBufferMemory-None-01899
    如果创建 buffer 时未设置 VK_BUFFER_CREATE_PROTECTED_BIT 位,则该缓冲区必须不绑定到使用报告 VK_MEMORY_PROPERTY_PROTECTED_BIT 的内存类型分配的内存对象。

  • VUID-vkBindBufferMemory-buffer-01038
    如果创建 bufferVkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation 等于 VK_TRUE,则 memory 必须已使用 VkDedicatedAllocationMemoryAllocateInfoNV::buffer 等于使用与 buffer 相同的创建参数创建的缓冲区句柄分配,并且 memoryOffset 必须为零。

  • VUID-vkBindBufferMemory-apiVersion-07920
    如果未启用 VK_KHR_dedicated_allocation 扩展,VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 buffer 在创建时 VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation 不等于 VK_TRUE,则 memory 必须 未被分配为特定缓冲区或图像的专用内存。

  • VUID-vkBindBufferMemory-memory-02726
    如果用于分配 memoryVkExportMemoryAllocateInfo::handleTypes 的值不为 0,则它必须至少包含在创建 buffer 时,VkExternalMemoryBufferCreateInfo::handleTypes 中设置的句柄之一。

  • VUID-vkBindBufferMemory-memory-02985
    如果 memory 是通过内存导入操作分配的,而不是使用非 NULLbuffer 值的 VkImportAndroidHardwareBufferInfoANDROID,则导入内存的外部句柄类型必须在创建 buffer 时也在 VkExternalMemoryBufferCreateInfo::handleTypes 中设置。

  • VUID-vkBindBufferMemory-memory-02986
    如果 memory 是使用带有非 NULLbuffer 值的 VkImportAndroidHardwareBufferInfoANDROID 内存导入操作分配的,则 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 必须在创建 buffer 时也在 VkExternalMemoryBufferCreateInfo::handleTypes 中设置。

  • VUID-vkBindBufferMemory-bufferDeviceAddress-03339
    如果启用 VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress 特性,并且创建 buffer 时设置了 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT 位。

  • VUID-vkBindBufferMemory-bufferDeviceAddressCaptureReplay-09200
    如果启用了 VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddressCaptureReplay 特性,并且创建 buffer 时设置了 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位。

  • VUID-vkBindBufferMemory-buffer-06408
    如果 buffer 在创建时,VkBufferCreateInfo::pNext 链中链接了 VkBufferCollectionBufferCreateInfoFUCHSIA,则 memory 必须在分配时,VkMemoryAllocateInfo::pNext 链中链接了 VkImportMemoryBufferCollectionFUCHSIA

  • VUID-vkBindBufferMemory-descriptorBufferCaptureReplay-08112
    如果 buffer 在创建时设置了 VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT 位。

  • VUID-vkBindBufferMemory-buffer-09201
    如果 buffer 在创建时设置了 VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位。

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

  • VUID-vkBindBufferMemory-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkBindBufferMemory-memory-parameter
    memory 必须 是一个有效的 VkDeviceMemory 句柄

  • VUID-vkBindBufferMemory-buffer-parent
    buffer 必须已从 device 创建、分配或检索

  • VUID-vkBindBufferMemory-memory-parent
    memory 必须已创建,分配或从 device 中检索。

主机同步
  • buffer 的主机访问**必须**进行外部同步

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

要一次为一个或多个缓冲区对象附加内存,请调用

// Provided by VK_VERSION_1_1
VkResult vkBindBufferMemory2(
    VkDevice                                    device,
    uint32_t                                    bindInfoCount,
    const VkBindBufferMemoryInfo*               pBindInfos);

或等效命令

// Provided by VK_KHR_bind_memory2
VkResult vkBindBufferMemory2KHR(
    VkDevice                                    device,
    uint32_t                                    bindInfoCount,
    const VkBindBufferMemoryInfo*               pBindInfos);
  • device 是拥有缓冲区和内存的逻辑设备。

  • bindInfoCountpBindInfos 中的元素数量。

  • pBindInfos 是指向一个包含 bindInfoCountVkBindBufferMemoryInfo 结构的数组的指针,这些结构描述了要绑定的缓冲区和内存。

在某些实现中,将内存绑定批处理到单个命令中可能更有效率。

如果启用了 maintenance6 特性,则此命令必须尝试执行 pBindInfos 所描述的所有内存绑定操作,并且必须不因第一个失败而提前退出。

如果 pBindInfos 描述的任何内存绑定操作失败,则此命令返回的 VkResult 必须是任何未返回 VK_SUCCESS 的内存绑定操作的返回值。

如果 vkBindBufferMemory2 命令失败,VkBindMemoryStatus 结构未包含在 pBindInfos 的每个元素的 pNext 链中,并且 bindInfoCount 大于 1,则 pBindInfos 引用的缓冲区将处于不确定状态,并且不得使用。

应用程序应销毁这些缓冲区。

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

  • VUID-vkBindBufferMemory2-pBindInfos-parameter
    pBindInfos 必须是指向包含 bindInfoCount 个有效 VkBindBufferMemoryInfo 结构数组的有效指针。

  • VUID-vkBindBufferMemory2-bindInfoCount-arraylength
    bindInfoCount 必须大于 0

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

VkBindBufferMemoryInfo 包含与 vkBindBufferMemory 的参数对应的成员。

VkBindBufferMemoryInfo 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkBindBufferMemoryInfo {
    VkStructureType    sType;
    const void*        pNext;
    VkBuffer           buffer;
    VkDeviceMemory     memory;
    VkDeviceSize       memoryOffset;
} VkBindBufferMemoryInfo;

或等效形式:

// Provided by VK_KHR_bind_memory2
typedef VkBindBufferMemoryInfo VkBindBufferMemoryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • buffer 是要附加到内存的缓冲区。

  • memory 是一个 VkDeviceMemory 对象,描述要附加的设备内存。

  • memoryOffset 是要绑定到缓冲区的 memory 区域的起始偏移量。从 memoryOffset 字节开始,memoryVkMemoryRequirements::size 成员返回的字节数将被绑定到指定的缓冲区。

有效用法
  • VUID-VkBindBufferMemoryInfo-buffer-07459
    buffer 必须尚未绑定到内存对象。

  • VUID-VkBindBufferMemoryInfo-buffer-01030
    创建 buffer 时,必须未设置任何稀疏内存绑定标志。

  • VUID-VkBindBufferMemoryInfo-memoryOffset-01031
    memoryOffset 必须小于 memory 的大小

  • VUID-VkBindBufferMemoryInfo-memory-01035
    memory 必须已使用从调用 vkGetBufferMemoryRequirements 并传入 buffer 返回的 VkMemoryRequirements 结构体的 memoryTypeBits 成员中允许的内存类型之一分配。

  • VUID-VkBindBufferMemoryInfo-memoryOffset-01036
    memoryOffset 必须是从调用 vkGetBufferMemoryRequirements 并传入 buffer 返回的 VkMemoryRequirements 结构体的 alignment 成员的整数倍。

  • VUID-VkBindBufferMemoryInfo-size-01037
    从调用 vkGetBufferMemoryRequirements 并传入 buffer 返回的 VkMemoryRequirements 结构体的 size 成员必须小于或等于 memory 的大小减去 memoryOffset

  • VUID-VkBindBufferMemoryInfo-buffer-01444
    如果 buffer 需要专用分配(如 vkGetBufferMemoryRequirements2VkMemoryDedicatedRequirements::requiresDedicatedAllocation 中针对 buffer 报告的那样),则 memory 必须已使用 VkMemoryDedicatedAllocateInfo::buffer 等于 buffer 分配。

  • VUID-VkBindBufferMemoryInfo-memory-01508
    如果在分配 memory 时提供的 VkMemoryAllocateInfopNext 链中包含了 VkMemoryDedicatedAllocateInfo 结构体,并且 VkMemoryDedicatedAllocateInfo::buffer 不是 VK_NULL_HANDLE,则 buffer 必须等于 VkMemoryDedicatedAllocateInfo::buffer,且 memoryOffset 必须为零。

  • VUID-VkBindBufferMemoryInfo-None-01898
    如果创建 buffer 时设置了 VK_BUFFER_CREATE_PROTECTED_BIT 位,则该缓冲区必须绑定到使用报告 VK_MEMORY_PROPERTY_PROTECTED_BIT 的内存类型分配的内存对象。

  • VUID-VkBindBufferMemoryInfo-None-01899
    如果创建 buffer 时未设置 VK_BUFFER_CREATE_PROTECTED_BIT 位,则该缓冲区必须不绑定到使用报告 VK_MEMORY_PROPERTY_PROTECTED_BIT 的内存类型分配的内存对象。

  • VUID-VkBindBufferMemoryInfo-buffer-01038
    如果创建 bufferVkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation 等于 VK_TRUE,则 memory 必须已使用 VkDedicatedAllocationMemoryAllocateInfoNV::buffer 等于使用与 buffer 相同的创建参数创建的缓冲区句柄分配,并且 memoryOffset 必须为零。

  • VUID-VkBindBufferMemoryInfo-apiVersion-07920
    如果未启用 VK_KHR_dedicated_allocation 扩展,VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 buffer 在创建时 VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation 不等于 VK_TRUE,则 memory 必须 未被分配为特定缓冲区或图像的专用内存。

  • VUID-VkBindBufferMemoryInfo-memory-02726
    如果用于分配 memoryVkExportMemoryAllocateInfo::handleTypes 的值不为 0,则它必须至少包含在创建 buffer 时,VkExternalMemoryBufferCreateInfo::handleTypes 中设置的句柄之一。

  • VUID-VkBindBufferMemoryInfo-memory-02985
    如果 memory 是通过内存导入操作分配的,而不是使用非 NULLbuffer 值的 VkImportAndroidHardwareBufferInfoANDROID,则导入内存的外部句柄类型必须在创建 buffer 时也在 VkExternalMemoryBufferCreateInfo::handleTypes 中设置。

  • VUID-VkBindBufferMemoryInfo-memory-02986
    如果 memory 是使用带有非 NULLbuffer 值的 VkImportAndroidHardwareBufferInfoANDROID 内存导入操作分配的,则 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 必须在创建 buffer 时也在 VkExternalMemoryBufferCreateInfo::handleTypes 中设置。

  • VUID-VkBindBufferMemoryInfo-bufferDeviceAddress-03339
    如果启用 VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress 特性,并且创建 buffer 时设置了 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT 位。

  • VUID-VkBindBufferMemoryInfo-bufferDeviceAddressCaptureReplay-09200
    如果启用了 VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddressCaptureReplay 特性,并且创建 buffer 时设置了 VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位。

  • VUID-VkBindBufferMemoryInfo-buffer-06408
    如果 buffer 在创建时,VkBufferCreateInfo::pNext 链中链接了 VkBufferCollectionBufferCreateInfoFUCHSIA,则 memory 必须在分配时,VkMemoryAllocateInfo::pNext 链中链接了 VkImportMemoryBufferCollectionFUCHSIA

  • VUID-VkBindBufferMemoryInfo-descriptorBufferCaptureReplay-08112
    如果 buffer 在创建时设置了 VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT 位。

  • VUID-VkBindBufferMemoryInfo-buffer-09201
    如果 buffer 在创建时设置了 VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 位,则 memory 必须在分配时设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位。

  • VUID-VkBindBufferMemoryInfo-pNext-01605
    如果 pNext 链包含 VkBindBufferMemoryDeviceGroupInfo 结构体,则 VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices 指定的所有 memory 实例必须已分配。

有效用法(隐式)
  • VUID-VkBindBufferMemoryInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO

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

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

  • VUID-VkBindBufferMemoryInfo-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkBindBufferMemoryInfo-memory-parameter
    memory 必须 是一个有效的 VkDeviceMemory 句柄

  • VUID-VkBindBufferMemoryInfo-commonparent
    buffermemory必须已创建、分配或从同一个 VkDevice 中检索。

VkBindBufferMemoryDeviceGroupInfo 结构体定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkBindBufferMemoryDeviceGroupInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           deviceIndexCount;
    const uint32_t*    pDeviceIndices;
} VkBindBufferMemoryDeviceGroupInfo;

或等效形式:

// Provided by VK_KHR_bind_memory2 with VK_KHR_device_group
typedef VkBindBufferMemoryDeviceGroupInfo VkBindBufferMemoryDeviceGroupInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • deviceIndexCountpDeviceIndices 中的元素数量。

  • pDeviceIndices 是一个指向设备索引数组的指针。

如果 VkBindBufferMemoryInfopNext 链包含 VkBindBufferMemoryDeviceGroupInfo 结构体,则该结构体决定了如何在设备组中的多个设备上将内存绑定到缓冲区。

如果 deviceIndexCount 大于零,则在设备索引 i 上,缓冲区将附加到物理设备上具有设备索引 pDeviceIndices[i]memory 实例。

如果 deviceIndexCount 为零,并且 memory 来自设置了 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则相当于 pDeviceIndices 包含从零到逻辑设备中物理设备数量减一的连续索引。换句话说,默认情况下,每个物理设备都附加到其自己的 memory 实例。

如果 deviceIndexCount 为零,并且 memory 来自未设置 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则相当于 pDeviceIndices 包含一个零数组。换句话说,默认情况下,每个物理设备都附加到实例零。

有效用法
  • VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606
    deviceIndexCount 必须为零或等于逻辑设备中的物理设备数量。

  • VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607
    pDeviceIndices 的所有元素必须是有效的设备索引。

有效用法(隐式)
  • VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO

  • VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter
    如果 deviceIndexCount 不为 0,则 pDeviceIndices 必须 是一个指向 deviceIndexCountuint32_t 值数组的有效指针

VkBindMemoryStatus 结构体定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkBindMemoryStatus {
    VkStructureType    sType;
    const void*        pNext;
    VkResult*          pResult;
} VkBindMemoryStatus;

或等效形式:

// Provided by VK_KHR_maintenance6
typedef VkBindMemoryStatus VkBindMemoryStatusKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pResult 是指向 VkResult 值的指针。

如果 VkBindBufferMemoryInfoVkBindImageMemoryInfopNext 链包含 VkBindMemoryStatus 结构体,则 VkBindMemoryStatus::pResult 将填充一个描述相应内存绑定操作结果的值。

有效用法(隐式)
  • VUID-VkBindMemoryStatus-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS

  • VUID-VkBindMemoryStatus-pResult-parameter
    pResult 必须是指向 VkResult 值的有效指针。

要将内存附加到未设置 VK_IMAGE_CREATE_DISJOINT_BITVkImage 对象,请调用:

// Provided by VK_VERSION_1_0
VkResult vkBindImageMemory(
    VkDevice                                    device,
    VkImage                                     image,
    VkDeviceMemory                              memory,
    VkDeviceSize                                memoryOffset);
  • device 是拥有图像和内存的逻辑设备。

  • image 是图像。

  • memory 是描述要附加的设备内存的 VkDeviceMemory 对象。

  • memoryOffset 是要绑定到图像的 memory 区域的起始偏移量。memoryVkMemoryRequirements::size 成员返回的字节数,从 memoryOffset 字节开始,将绑定到指定的图像。

vkBindImageMemory 相当于通过 VkBindImageMemoryInfo 将相同的参数传递给 vkBindImageMemory2

有效用法
  • VUID-vkBindImageMemory-image-07460
    image 必须未绑定到内存对象。

  • VUID-vkBindImageMemory-image-01045
    创建 image必须未使用任何稀疏内存绑定标志。

  • VUID-vkBindImageMemory-memoryOffset-01046
    memoryOffset 必须小于 memory 的大小

  • VUID-vkBindImageMemory-image-01445
    如果 image 需要专用分配(如 vkGetImageMemoryRequirements2VkMemoryDedicatedRequirements::requiresDedicatedAllocation 中为 image 报告的那样),则创建 memory必须使用 VkMemoryDedicatedAllocateInfo::image 等于 image

  • VUID-vkBindImageMemory-memory-02628
    如果未启用 dedicatedAllocationImageAliasing 功能,并且在分配 memory 时提供的 VkMemoryAllocateInfopNext 链中包含 VkMemoryDedicatedAllocateInfo 结构体,并且 VkMemoryDedicatedAllocateInfo::image 不是 VK_NULL_HANDLE,则 image 必须等于 VkMemoryDedicatedAllocateInfo::image,且 memoryOffset 必须为零。

  • VUID-vkBindImageMemory-memory-02629
    如果启用了 dedicatedAllocationImageAliasing 功能,并且在分配 memory 时提供的 VkMemoryAllocateInfopNext 链中包含了 VkMemoryDedicatedAllocateInfo 结构体,并且 VkMemoryDedicatedAllocateInfo::image 不是 VK_NULL_HANDLE,则 memoryOffset 必须为零,并且 image 必须等于 VkMemoryDedicatedAllocateInfo::image,或者是一个使用与 VkImageCreateInfo 中相同的参数创建的图像,但 extentarrayLayers 可以不同,但需满足以下限制:被绑定的图像的 extent 参数的每个维度 必须等于或小于为其创建分配的原始图像;并且被绑定的图像的 arrayLayers 参数 必须等于或小于为其创建分配的原始图像。

  • VUID-vkBindImageMemory-None-01901
    如果图像创建时设置了 VK_IMAGE_CREATE_PROTECTED_BIT 位,则该图像 必须绑定到使用报告 VK_MEMORY_PROPERTY_PROTECTED_BIT 的内存类型分配的内存对象。

  • VUID-vkBindImageMemory-None-01902
    如果图像创建时未设置 VK_IMAGE_CREATE_PROTECTED_BIT 位,则该图像 不得绑定到使用报告 VK_MEMORY_PROPERTY_PROTECTED_BIT 的内存类型创建的内存对象。

  • VUID-vkBindImageMemory-image-01050
    如果 image 创建时 VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation 等于 VK_TRUE,则 memory 必须使用 VkDedicatedAllocationMemoryAllocateInfoNV::image 创建,且该值等于使用与 image 相同的创建参数创建的图像句柄,并且 memoryOffset 必须为零。

  • VUID-vkBindImageMemory-apiVersion-07921
    如果未启用 VK_KHR_dedicated_allocation 扩展,VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 image 创建时 VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation 不等于 VK_TRUE,则 memory 不得为特定缓冲区或图像分配专用内存。

  • VUID-vkBindImageMemory-memory-02728
    如果用于分配 memoryVkExportMemoryAllocateInfo::handleTypes 的值不为 0,则它 必须包含在创建 image 时在 VkExternalMemoryImageCreateInfo::handleTypes 中设置的至少一个句柄。

  • VUID-vkBindImageMemory-memory-02989
    如果 memory 是通过内存导入操作创建的,并且不是具有非 NULL buffer 值的 VkImportAndroidHardwareBufferInfoANDROID,则导入内存的外部句柄类型 必须也在创建 image 时在 VkExternalMemoryImageCreateInfo::handleTypes 中设置。

  • VUID-vkBindImageMemory-memory-02990
    如果 memory 是使用具有非 NULL buffer 值的 VkImportAndroidHardwareBufferInfoANDROID 内存导入操作创建的,则 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID 必须也在创建 image 时在 VkExternalMemoryImageCreateInfo::handleTypes 中设置。

  • VUID-vkBindImageMemory-descriptorBufferCaptureReplay-08113
    如果 image 创建时设置了 VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 位,则 memory 必须使用设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT 位的标志进行分配。

  • VUID-vkBindImageMemory-image-09202
    如果 image 创建时设置了 VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT 位,则 memory 必须使用设置了 VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT 位的标志进行分配。

  • VUID-vkBindImageMemory-image-01608
    image 不得使用设置了 VK_IMAGE_CREATE_DISJOINT_BIT 的标志创建。

  • VUID-vkBindImageMemory-memory-01047
    memory 必须使用调用 vkGetImageMemoryRequirements 返回的 VkMemoryRequirements 结构的 memoryTypeBits 成员中允许的内存类型之一进行分配,并且使用相同的 image 参数。

  • VUID-vkBindImageMemory-memoryOffset-01048
    memoryOffset 必须是调用 vkGetImageMemoryRequirements 返回的 VkMemoryRequirements 结构的 alignment 成员的整数倍,并且使用相同的 image 参数。

  • VUID-vkBindImageMemory-size-01049
    memory 的大小与 memoryOffset 之差 必须大于或等于调用 vkGetImageMemoryRequirements 返回的 VkMemoryRequirements 结构中的 size 成员,并且使用相同的 image 参数。

  • VUID-vkBindImageMemory-image-06392
    如果 image 创建时在 VkImageCreateInfo::pNext 中链接了 VkBufferCollectionImageCreateInfoFUCHSIA,则 memory 必须使用链接到 VkMemoryAllocateInfo::pNextVkImportMemoryBufferCollectionFUCHSIA 进行分配。

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

  • VUID-vkBindImageMemory-image-parameter
    image 必须是有效的 VkImage 句柄

  • VUID-vkBindImageMemory-memory-parameter
    memory 必须 是一个有效的 VkDeviceMemory 句柄

  • VUID-vkBindImageMemory-image-parent
    image 必须是从 device 创建、分配或检索的

  • VUID-vkBindImageMemory-memory-parent
    memory 必须已创建,分配或从 device 中检索。

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

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要一次为一个或多个图像对象附加内存,请调用

// Provided by VK_VERSION_1_1
VkResult vkBindImageMemory2(
    VkDevice                                    device,
    uint32_t                                    bindInfoCount,
    const VkBindImageMemoryInfo*                pBindInfos);

或等效命令

// Provided by VK_KHR_bind_memory2
VkResult vkBindImageMemory2KHR(
    VkDevice                                    device,
    uint32_t                                    bindInfoCount,
    const VkBindImageMemoryInfo*                pBindInfos);
  • device 是拥有图像和内存的逻辑设备。

  • bindInfoCountpBindInfos 中的元素数量。

  • pBindInfos 是指向 VkBindImageMemoryInfo 结构体数组的指针,描述要绑定的图像和内存。

在某些实现中,将内存绑定批处理到单个命令中可能更有效率。

如果启用了 maintenance6 特性,则此命令必须尝试执行 pBindInfos 所描述的所有内存绑定操作,并且必须不因第一个失败而提前退出。

如果 pBindInfos 描述的任何内存绑定操作失败,则此命令返回的 VkResult 必须是任何未返回 VK_SUCCESS 的内存绑定操作的返回值。

如果 vkBindImageMemory2 命令失败,并且 VkBindMemoryStatus 结构体未包含在 pBindInfos 的每个元素的 pNext 链中,并且 bindInfoCount 大于 1,则 pBindInfos 引用的图像将处于不确定状态,不得使用。

应用程序应销毁这些图像。

有效用法
  • VUID-vkBindImageMemory2-pBindInfos-02858
    如果任何 VkBindImageMemoryInfo::image 是使用 VK_IMAGE_CREATE_DISJOINT_BIT 创建的,则 VkBindImageMemoryInfo::image 的所有平面 **必须** 在单独的 pBindInfos 中单独绑定

  • VUID-vkBindImageMemory2-pBindInfos-04006
    pBindInfos **必须** 不能多次引用同一个图像子资源

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

  • VUID-vkBindImageMemory2-pBindInfos-parameter
    pBindInfos **必须** 是指向 bindInfoCount 个有效的 VkBindImageMemoryInfo 结构体数组的有效指针

  • VUID-vkBindImageMemory2-bindInfoCount-arraylength
    bindInfoCount 必须大于 0

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkBindImageMemoryInfo 包含与 vkBindImageMemory 参数对应的成员。

VkBindImageMemoryInfo 结构体的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkBindImageMemoryInfo {
    VkStructureType    sType;
    const void*        pNext;
    VkImage            image;
    VkDeviceMemory     memory;
    VkDeviceSize       memoryOffset;
} VkBindImageMemoryInfo;

或等效形式:

// Provided by VK_KHR_bind_memory2
typedef VkBindImageMemoryInfo VkBindImageMemoryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • image 是要附加到内存的图像。

  • memory 是一个 VkDeviceMemory 对象,描述要附加的设备内存。

  • memoryOffset 是要绑定到图像的 memory 区域的起始偏移量。memoryVkMemoryRequirements::size 成员返回的字节数,从 memoryOffset 字节开始,将绑定到指定的图像。

有效用法
有效用法(隐式)
  • VUID-VkBindImageMemoryInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO

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

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

  • VUID-VkBindImageMemoryInfo-image-parameter
    image 必须是有效的 VkImage 句柄

  • VUID-VkBindImageMemoryInfo-commonparent
    imagememory (均为非忽略参数的有效句柄)都必须是从同一个 VkDevice 创建、分配或检索的。

VkBindImageMemoryDeviceGroupInfo 结构体定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkBindImageMemoryDeviceGroupInfo {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           deviceIndexCount;
    const uint32_t*    pDeviceIndices;
    uint32_t           splitInstanceBindRegionCount;
    const VkRect2D*    pSplitInstanceBindRegions;
} VkBindImageMemoryDeviceGroupInfo;

或等效形式:

// Provided by VK_KHR_bind_memory2 with VK_KHR_device_group
typedef VkBindImageMemoryDeviceGroupInfo VkBindImageMemoryDeviceGroupInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • deviceIndexCountpDeviceIndices 中的元素数量。

  • pDeviceIndices 是一个指向设备索引数组的指针。

  • splitInstanceBindRegionCountpSplitInstanceBindRegions 中的元素数量。

  • pSplitInstanceBindRegions 是指向 VkRect2D 结构体数组的指针,该数组描述了图像的哪些区域连接到每个内存实例。

如果 VkBindImageMemoryInfopNext 链包含 VkBindImageMemoryDeviceGroupInfo 结构体,则该结构体决定了如何在设备组中跨多个设备将内存绑定到图像。

如果 deviceIndexCount 大于零,则在设备索引 i 上,image 连接到物理设备上具有设备索引 pDeviceIndices[i] 的内存实例。

N 为逻辑设备中物理设备的数量。如果 splitInstanceBindRegionCount 大于零,则 pSplitInstanceBindRegions 是指向 N2 个矩形数组的指针,其中资源实例 i 中元素 i*N+j 处的矩形指定的图像区域绑定到内存实例 j。绑定到每个稀疏图像块区域的内存块使用内存中的偏移量,相对于 memoryOffset 进行计算,就好像整个图像都被绑定到连续的内存范围一样。换句话说,水平相邻的图像块使用连续的内存块,垂直相邻的图像块由每个块的字节数乘以 image 的块宽度分隔,且 (0,0) 处的块对应于从 memoryOffset 开始的内存。

如果 splitInstanceBindRegionCountdeviceIndexCount 为零,且内存来自设置了 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则等效于 pDeviceIndices 包含从零到逻辑设备中物理设备数量减一的连续索引。换句话说,默认情况下,每个物理设备连接到其自己的内存实例。

如果 splitInstanceBindRegionCountdeviceIndexCount 为零,且内存来自没有设置 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则等效于 pDeviceIndices 包含一个零数组。换句话说,默认情况下,每个物理设备连接到实例零。

有效用法
  • VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633
    deviceIndexCountsplitInstanceBindRegionCount至少有一个必须为零。

  • VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634
    deviceIndexCount 必须为零或等于逻辑设备中的物理设备数量。

  • VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635
    pDeviceIndices 的所有元素必须是有效的设备索引。

  • VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636
    splitInstanceBindRegionCount 必须为零或等于逻辑设备中物理设备数量的平方。

  • VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637
    pSplitInstanceBindRegions 中对应于同一图像实例的元素必须不重叠。

  • VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638
    pSplitInstanceBindRegions 的任何元素的 offset.x 成员必须是图像所有非元数据方面的稀疏图像块宽度 (VkSparseImageFormatProperties::imageGranularity.width) 的倍数。

  • VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639
    pSplitInstanceBindRegions 的任何元素的 offset.y 成员必须是图像所有非元数据方面的稀疏图像块高度 (VkSparseImageFormatProperties::imageGranularity.height) 的倍数。

  • VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640
    pSplitInstanceBindRegions 的任何元素的 extent.width 成员必须是图像所有非元数据方面的稀疏图像块宽度的倍数,或者 extent.width + offset.x 必须等于图像子资源的宽度。

  • VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641
    pSplitInstanceBindRegions 的任何元素的 extent.height 成员必须是图像所有非元数据方面的稀疏图像块高度的倍数,或者 extent.height + offset.y 必须等于图像子资源的高度。

有效用法(隐式)
  • VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO

  • VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter
    如果 deviceIndexCount 不为 0,则 pDeviceIndices 必须 是一个指向 deviceIndexCountuint32_t 值数组的有效指针

  • VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter
    如果 splitInstanceBindRegionCount 不为 0,则 pSplitInstanceBindRegions 必须是一个指向 splitInstanceBindRegionCountVkRect2D 结构的有效指针。

如果 VkBindImageMemoryInfopNext 链包含 VkBindImageMemorySwapchainInfoKHR 结构,则该结构包含一个交换链句柄和图像索引,指示该图像将绑定到该交换链的内存。

VkBindImageMemorySwapchainInfoKHR 结构定义如下:

// Provided by VK_VERSION_1_1 with VK_KHR_swapchain, VK_KHR_device_group with VK_KHR_swapchain
typedef struct VkBindImageMemorySwapchainInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkSwapchainKHR     swapchain;
    uint32_t           imageIndex;
} VkBindImageMemorySwapchainInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • swapchainVK_NULL_HANDLE 或交换链句柄。

  • imageIndexswapchain 中的一个图像索引。

如果 swapchain 不为 NULL,则使用 swapchainimageIndex 来确定图像绑定的内存,而不是 memorymemoryOffset

内存可以绑定到交换链,并使用 VkBindImageMemoryDeviceGroupInfopDeviceIndicespSplitInstanceBindRegions 成员。

有效用法
  • VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644
    imageIndex 必须小于 swapchain 中的图像数量。

  • VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-07756
    如果 swapchain 是使用 VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT 创建的,则 imageIndex 必须是之前由 vkAcquireNextImageKHRvkAcquireNextImage2KHR 返回的索引之一。

有效用法(隐式)
  • VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR

  • VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter
    swapchain 必须是有效的 VkSwapchainKHR 句柄。

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

为了绑定不相交图像平面,请将 VkBindImagePlaneMemoryInfo 结构添加到 VkBindImageMemoryInfopNext 链。

VkBindImagePlaneMemoryInfo 结构定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkBindImagePlaneMemoryInfo {
    VkStructureType          sType;
    const void*              pNext;
    VkImageAspectFlagBits    planeAspect;
} VkBindImagePlaneMemoryInfo;

或等效形式:

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

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

  • planeAspect 是一个 VkImageAspectFlagBits 值,用于指定要绑定的不相交图像平面的方面。

有效用法
  • VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283
    如果图像的 tilingVK_IMAGE_TILING_LINEARVK_IMAGE_TILING_OPTIMAL,则 planeAspect **必须** 是一个有效的 多平面 aspect 掩码 位。

  • VUID-VkBindImagePlaneMemoryInfo-planeAspect-02284
    如果图像的 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 planeAspect **必须** 是该图像的单个有效的*内存平面*(即,aspectMask **必须** 指定一个小于与图像的 formatVkImageDrmFormatModifierPropertiesEXT::drmFormatModifier 相关的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount 的平面索引)。

有效用法(隐式)
  • VUID-VkBindImagePlaneMemoryInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO

  • VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter
    planeAspect **必须** 是一个有效的 VkImageAspectFlagBits 值。

缓冲区-图像粒度

与实现相关的限制 bufferImageGranularity 指定了一个类似页面的粒度,线性资源和非线性资源必须以该粒度放置在相邻的内存位置,以避免别名。不满足此粒度要求的两个资源被称为别名bufferImageGranularity 以字节为单位指定,并且必须是 2 的幂。不施加粒度限制的实现可以报告 bufferImageGranularity 值为 1。

尽管名称如此,bufferImageGranularity 实际上是“线性”资源和“非线性”资源之间的粒度。

给定同一 VkDeviceMemory 对象中较低内存偏移量的 resourceA 和较高内存偏移量的 resourceB,其中一个资源是线性的,另一个资源是非线性的(如 术语表 中定义的那样),并且有以下情况

resourceA.end       = resourceA.memoryOffset + resourceA.size - 1
resourceA.endPage   = resourceA.end & ~(bufferImageGranularity-1)
resourceB.start     = resourceB.memoryOffset
resourceB.startPage = resourceB.start & ~(bufferImageGranularity-1)

以下属性必须成立:

resourceA.endPage < resourceB.startPage

也就是说,第一个资源 (A) 的末尾和第二个资源 (B) 的开头必须位于大小为 bufferImageGranularity 的单独的“页面”上。bufferImageGranularity 可以与内存堆的物理页面大小不同。只有当线性资源和非线性资源在内存中相邻并且将同时使用时,才需要此限制。相邻资源的内存范围可以小于 bufferImageGranularity,前提是它们满足相关对象的 alignment 要求。

字节形式的稀疏块大小以及稀疏图像和缓冲区内存对齐必须都是 bufferImageGranularity 的倍数。因此,绑定到稀疏资源的内存自然满足 bufferImageGranularity

资源共享模式

缓冲区和图像对象是使用共享模式创建的,该模式控制它们如何从队列访问。支持的共享模式有:

// Provided by VK_VERSION_1_0
typedef enum VkSharingMode {
    VK_SHARING_MODE_EXCLUSIVE = 0,
    VK_SHARING_MODE_CONCURRENT = 1,
} VkSharingMode;
  • VK_SHARING_MODE_EXCLUSIVE 指定对对象的任何范围或图像子资源的访问一次仅对单个队列族是排他的。

  • VK_SHARING_MODE_CONCURRENT 指定支持从多个队列族并发访问对象的任何范围或图像子资源。

VK_SHARING_MODE_EXCLUSIVE 相比,VK_SHARING_MODE_CONCURRENT 可能会导致对缓冲区或图像的性能较低的访问。

使用 VK_SHARING_MODE_EXCLUSIVE 创建的图像对象的缓冲区范围和图像子资源必须只能由拥有该资源的队列族的队列访问。在创建时,此类资源不属于任何队列族;在队列中首次使用时会隐式获取所有权。一旦使用 VK_SHARING_MODE_EXCLUSIVE 的资源被某个队列族拥有,应用程序必须执行队列族所有权转移,以使不同队列族可以访问范围或图像子资源的内存内容。

图像在首次在队列上使用之前,仍然需要从 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED 进行布局转换

一个队列族可以像对待刚刚创建的资源一样,在没有所有权转移的情况下,获取使用 VK_SHARING_MODE_EXCLUSIVE 创建的资源的图像子资源或缓冲区范围的所有权;但是,以这种方式获取所有权的效果是图像子资源或缓冲区范围的内容是未定义的

使用 VK_SHARING_MODE_CONCURRENT 创建的图像对象的缓冲区范围和图像子资源必须只能由通过相应创建信息结构的 queueFamilyIndexCountpQueueFamilyIndices 成员指定的队列族的队列访问。

外部资源共享

资源应该只在其底层内存的独占所有权的 Vulkan 实例中访问。在给定时间,只有一个 Vulkan 实例拥有资源的底层内存的独占所有权,无论资源是使用 VK_SHARING_MODE_EXCLUSIVE 还是 VK_SHARING_MODE_CONCURRENT 创建的。只有在内存已从另一个实例或使用外部内存句柄的外部 API 导入或导出后,应用程序才能转移资源的底层内存的所有权。在实例之外转移所有权的语义与在队列之间转移 VK_SHARING_MODE_EXCLUSIVE 资源的所有权所使用的语义类似,并且也使用 VkBufferMemoryBarrierVkImageMemoryBarrier 操作来完成。为了使底层内存的内容在目标实例或 API 中可访问,应用程序必须

  1. 从源实例或 API 释放独占所有权。

  2. 使用信号量或栅栏确保释放操作已完成。

  3. 在目标实例或 API 中获取独占所有权

与队列族所有权转移不同,释放所有权时不会显式指定目标实例或 API,获取所有权时也不会指定源实例或 API。相反,图像或内存屏障的 dstQueueFamilyIndexsrcQueueFamilyIndex 参数被设置为保留的队列族索引 VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT,以分别表示外部目标或源。

将资源绑定到多个 Vulkan 实例或其他 API 之间共享的内存对象不会更改底层内存的所有权。第一个访问该资源的实体会隐式获取所有权。一个实体可以以相同的方式从另一个实体隐式获取所有权,而无需显式的所有权转移。但是,以这种方式获取所有权的效果是底层内存的内容是未定义的

访问由特定实例或 API 拥有的内存支持的资源,其语义与访问 VK_SHARING_MODE_EXCLUSIVE 资源相同,但有一个例外:实现必须确保对同一底层内存对象别名的同一图像的一组相同子资源的一个成员执行的布局转换会影响该组中所有子资源的布局。

作为推论,对此类集合中的任何图像子资源的写入必须不会使该集合中其他子资源使用的内存内容变为未定义的。应用程序可以通过对另一个图像的相同子资源执行设备写入来定义一个图像子资源的内容,前提是两个图像都绑定到外部内存的相同区域。应用程序可以在现有集合成员的内容被定义后,将资源添加到这样的集合中,而不会使内容未定义,方法是创建一个初始布局为 VK_IMAGE_LAYOUT_UNDEFINED 的新图像,并将其绑定到与现有图像相同的外部内存区域。

由于布局转换适用于所有别名相同外部内存区域的相同图像,因此新图像以及具有已定义内容的现有图像的后备内存的实际布局不会是未定义的。在从现有所有者获取其内存所有权之前,此类图像不可用。因此,作为此转换的一部分指定的布局将是图像的真正初始布局。创建它时指定的未定义的布局是一个占位符,用于简化有效的使用要求。

内存别名

如果通过 vkBindImageMemoryvkBindBufferMemoryvkBindAccelerationStructureMemoryNV、通过 稀疏内存绑定,或通过使用外部内存句柄导出和导入机制将内存绑定到多个 Vulkan 实例或外部 API 中的资源,则 VkDeviceMemory 分配的范围是别名的,如下所述。

考虑两个资源,resourceA 和 resourceB,分别绑定到 memory rangeA 和 rangeB。令 paddedRangeA 和 paddedRangeB 分别为 rangeA 和 rangeB 对齐到 bufferImageGranularity。如果资源都是线性的或都是非线性的(如词汇表中所定义),则资源别名 rangeA 和 rangeB 交集中的内存。如果一个资源是线性的,另一个资源是非线性的,则资源别名 paddedRangeA 和 paddedRangeB 交集中的内存。

应用程序可以别名内存,但是使用多个别名会受到一些约束。

如果一些大型资源在不相交的时间段内使用,则内存别名可以用于减少应用程序的总设备内存占用。

当一个 非线性、非 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 图像绑定到别名范围时,该图像的所有图像子资源都重叠该范围。当一个线性图像绑定到别名范围时,(根据图像的广告布局)包含来自别名范围的字节的图像子资源将重叠该范围。当 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 图像的稀疏图像块绑定到别名范围时,只有包含这些稀疏图像块的图像子资源才会重叠该范围,并且当绑定到图像 mip 尾部的内存与别名范围重叠时,mip 尾部中的所有图像子资源都会重叠该范围。

缓冲区以及布局为 VK_IMAGE_LAYOUT_PREINITIALIZEDVK_IMAGE_LAYOUT_GENERAL 的线性图像子资源是主机可访问的子资源。也就是说,主机有一个明确的寻址方案来解释内容,因此,如果每个别名都是主机可访问的子资源,则内存中的数据布局可以在别名之间得到一致的解释。非线性图像以及其他布局中的线性图像子资源不是主机可访问的。

如果两个别名都是主机可访问的,那么它们以一致的方式解释内存的内容,并且写入一个别名的数据可以被另一个别名读取。

如果两个别名都是使用相同的创建参数创建的图像,并且都设置了 VK_IMAGE_CREATE_ALIAS_BIT 标志,并且除了 VkBindImageMemoryDeviceGroupInfo::pDeviceIndicesVkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions 之外,它们都以相同的方式绑定到内存,那么它们以一致的方式解释内存的内容,并且写入一个别名的数据可以被另一个别名读取。

此外,如果多平面图像的单个平面和单平面图像别名相同的内存,那么在相同条件下,它们也会以一致的方式解释内存的内容,但有以下修改:

  • 两者都必须使用 VK_IMAGE_CREATE_DISJOINT_BIT 标志创建。

  • 单平面图像必须具有 VkFormat,该 VkFormat 与多平面图像的单个平面的 VkFormat 等效

  • 单平面图像和多平面图像的单个平面必须以相同的方式绑定到内存,除了 VkBindImageMemoryDeviceGroupInfo::pDeviceIndicesVkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions

  • 单平面图像的 widthheight 是从多平面图像的尺寸以 平面兼容性 中列出的方式为别名平面派生的。

  • 如果任一图像的 tilingVK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则两个图像都必须线性的。

  • 所有其他创建参数必须相同。

通过将相同的内存绑定到多个 Vulkan 实例或使用外部内存句柄导出和导入机制的外部 API 中的资源而创建的别名,以一致的方式解释内存的内容,并且写入一个别名的数据可以被另一个别名读取。

否则,别名会以不同的方式解释内存的内容,并且通过一个别名写入会使内存的内容对另一个别名部分或完全未定义。如果第一个别名是主机可访问的子资源,那么受影响的字节是根据其寻址方案由内存操作写入的字节。如果第一个别名不是主机可访问的,那么受影响的字节是被写入的图像子资源重叠的字节。如果第二个别名是主机可访问的子资源,那么受影响的字节将变为未定义。如果第二个别名不是主机可访问的,则所有重叠受影响字节的稀疏图像块(对于稀疏部分驻留的图像)或所有图像子资源(对于非稀疏图像和完全驻留的稀疏图像)都将变为未定义

如果任何图像子资源由于写入别名而变得未定义,那么每个图像子资源必须将其布局从 VK_IMAGE_LAYOUT_UNDEFINED 过渡到有效的布局,然后才能使用它,或者,如果内存已由主机写入,则从 VK_IMAGE_LAYOUT_PREINITIALIZED 过渡。如果稀疏图像的任何稀疏块已变得未定义,则只有包含它们的图像子资源必须进行过渡。

如果至少有一个使用执行写入,则两个别名使用重叠范围必须通过使用适当的 访问类型 的内存依赖关系来分隔,无论别名是否一致地解释内存。如果使用缓冲区或图像内存屏障,则屏障的范围必须包含重叠的整个范围和/或图像子资源集。

如果两个别名图像视图在同一个帧缓冲区中使用,那么渲染通道必须使用 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 声明附件,并遵循该部分中列出的其他规则。

通过应用程序子分配器回收的内存(即,不释放和重新分配内存对象)与内存别名本质上没有区别。但是,子分配器通常会在回收内存区域之前等待栅栏,并且发出栅栏信号涉及足够的隐式依赖关系以满足上述所有要求。

资源内存重叠

只要访问的内存位置保证不重叠(如内存位置中所定义),并且操作、资源和访问在其他方面都是独立的有效,应用程序可以通过单独的设备和主机操作安全地并发访问资源。

某些操作有对齐要求或访问不明确的内存位置,因此在确定重叠时应该考虑特定操作的语义。此类要求将在操作旁边描述。当使用非一致性内存时,主机和设备之间的操作会与 nonCoherentAtomSize 对齐,如 vkFlushMappedMemoryRangesvkInvalidateMappedMemoryRanges 所定义。

目的是可以并发访问缓冲区(或线性图像),即使它们共享缓存行,但否则不会访问相同的内存范围。设备缓存行大小的概念未在内存模型中公开。

缓冲区集合

Fuchsia 基于 FIDL 的 Sysmem 服务通过 VK_FUCHSIA_buffer_collection 扩展与 Vulkan 互操作。

缓冲区集合是一组或多组一起分配并且都具有相同属性的缓冲区。这些属性描述了缓冲区的内部表示形式,例如其维度和内存布局。这确保了所有缓冲区都可以被需要在多个缓冲区之间交换的任务(例如双缓冲图形渲染)互换使用。

在 Fuchsia 上,Sysmem 服务使用缓冲区集合作为其设计中的核心构造。

缓冲区集合由 VkBufferCollectionFUCHSIA 句柄表示

// Provided by VK_FUCHSIA_buffer_collection
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferCollectionFUCHSIA)

定义

  • FIDL - Fuchsia 接口定义语言。一种声明式语言,用于在 Fuchsia 上定义 FIDL 进程间通信接口。FIDL 文件使用 fidl 扩展名。FIDL 也用于指代 FIDL 语言中声明的接口定义的服务

  • Sysmem - Fuchsia 上促进最佳缓冲区共享和重用的 FIDL 服务

  • 客户端 - 缓冲区集合的任何参与者,例如 Vulkan 应用程序

  • 令牌 - zx_handle_t Zircon 通道对象,允许参与缓冲区集合

缓冲区集合的平台初始化

要在 Fuchsia 上初始化缓冲区集合

  • 连接到 Sysmem 服务以初始化 Sysmem 分配器

  • 使用 Sysmem 分配器创建初始缓冲区集合令牌

  • 为发起者之外的每个参与者复制令牌

  • 有关更多详细信息,请参阅 fuchsia.dev 上的 Sysmem 概述和 fuchsia.sysmem FIDL 文档

创建缓冲区集合

要创建一个 VkBufferCollectionFUCHSIA 以供 Vulkan 参与缓冲区集合

// Provided by VK_FUCHSIA_buffer_collection
VkResult vkCreateBufferCollectionFUCHSIA(
    VkDevice                                    device,
    const VkBufferCollectionCreateInfoFUCHSIA*  pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkBufferCollectionFUCHSIA*                  pCollection);
有效用法(隐式)
  • VUID-vkCreateBufferCollectionFUCHSIA-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkCreateBufferCollectionFUCHSIA-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkBufferCollectionCreateInfoFUCHSIA 结构的有效指针

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

  • VUID-vkCreateBufferCollectionFUCHSIA-pCollection-parameter
    pCollection 必须是指向 VkBufferCollectionFUCHSIA 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_EXTERNAL_HANDLE

  • VK_ERROR_INITIALIZATION_FAILED

主机访问

引用 VkBufferCollectionFUCHSIA 的所有函数,除了 vkCreateBufferCollectionFUCHSIA 外,必须进行外部同步。

VkBufferCollectionCreateInfoFUCHSIA 结构定义如下

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionCreateInfoFUCHSIA {
    VkStructureType    sType;
    const void*        pNext;
    zx_handle_t        collectionToken;
} VkBufferCollectionCreateInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • collectionToken 是一个 zx_handle_t,其中包含 Sysmem 客户端的缓冲区集合令牌

有效用法
  • VUID-VkBufferCollectionCreateInfoFUCHSIA-collectionToken-06393
    collectionToken 必须是有效的 zx_handle_t,指向从 Sysmem(fuchsia.sysmem.Allocator/AllocateSharedCollection)分配的 Zircon 通道,具有 ZX_DEFAULT_CHANNEL_RIGHTS 权限

有效用法(隐式)
  • VUID-VkBufferCollectionCreateInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA

  • VUID-VkBufferCollectionCreateInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

设置约束

可以为 VkImage 分配或 VkBuffer 分配建立缓冲区集合。

设置基于图像的缓冲区集合约束

设置缓冲区集合的约束会启动缓冲区集合的格式协商和分配。要设置 VkImage 缓冲区集合的约束,请调用

// Provided by VK_FUCHSIA_buffer_collection
VkResult vkSetBufferCollectionImageConstraintsFUCHSIA(
    VkDevice                                    device,
    VkBufferCollectionFUCHSIA                   collection,
    const VkImageConstraintsInfoFUCHSIA*        pImageConstraintsInfo);

如果 pImageConstraintsInfo->formatConstraintsCount 大于实现定义的限制,则 vkSetBufferCollectionImageConstraintsFUCHSIA 可能会失败。如果发生这种情况,vkSetBufferCollectionImageConstraintsFUCHSIA 将返回 VK_ERROR_INITIALIZATION_FAILED

如果实现不支持 pImageConstraintsInfo 结构描述的任何格式,则 vkSetBufferCollectionImageConstraintsFUCHSIA 可能会失败。如果发生这种情况,vkSetBufferCollectionImageConstraintsFUCHSIA 将返回 VK_ERROR_FORMAT_NOT_SUPPORTED

有效用法
  • VUID-vkSetBufferCollectionImageConstraintsFUCHSIA-collection-06394
    不得在 collection 上调用 vkSetBufferCollectionImageConstraintsFUCHSIAvkSetBufferCollectionBufferConstraintsFUCHSIA

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

  • VUID-vkSetBufferCollectionImageConstraintsFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

  • VUID-vkSetBufferCollectionImageConstraintsFUCHSIA-pImageConstraintsInfo-parameter
    pImageConstraintsInfo 必须是指向有效 VkImageConstraintsInfoFUCHSIA 结构的有效指针

  • VUID-vkSetBufferCollectionImageConstraintsFUCHSIA-collection-parent
    collection 必须已从 device 创建、分配或检索

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_FORMAT_NOT_SUPPORTED

VkImageConstraintsInfoFUCHSIA 结构定义如下

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkImageConstraintsInfoFUCHSIA {
    VkStructureType                               sType;
    const void*                                   pNext;
    uint32_t                                      formatConstraintsCount;
    const VkImageFormatConstraintsInfoFUCHSIA*    pFormatConstraints;
    VkBufferCollectionConstraintsInfoFUCHSIA      bufferCollectionConstraints;
    VkImageConstraintsInfoFlagsFUCHSIA            flags;
} VkImageConstraintsInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • formatConstraintsCountpFormatConstraints 中的元素数。

  • pFormatConstraints 是指向大小为 formatConstraintsCountVkImageFormatConstraintsInfoFUCHSIA 结构数组的指针,该数组用于进一步约束基于图像的缓冲区集合的格式选择。

  • bufferCollectionConstraints 是一个 VkBufferCollectionConstraintsInfoFUCHSIA 结构,用于为基于缓冲区的缓冲区集合的协商和分配提供参数。

  • flags 是一个 VkImageConstraintsInfoFlagBitsFUCHSIA 值,指定有关 Sysmem 应为缓冲区集合分配的内存类型的提示。

有效用法
  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06395
    pFormatConstraints 的所有元素必须在其 VkImageFormatConstraintsInfoFUCHSIA::requiredFormatFeatures 中至少设置一个位。

  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06396
    如果 pFormatConstraints->imageCreateInfo→usage 包含 VK_IMAGE_USAGE_SAMPLED_BIT,则 pFormatConstraints->requiredFormatFeatures 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT

  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06397
    如果 pFormatConstraints->imageCreateInfo→usage 包含 VK_IMAGE_USAGE_STORAGE_BIT,则 pFormatConstraints->requiredFormatFeatures 必须包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT

  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06398
    如果 pFormatConstraints->imageCreateInfo→usage 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,则 pFormatConstraints->requiredFormatFeatures 必须包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06399
    如果 pFormatConstraints->imageCreateInfo→usage 包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,则 pFormatConstraints->requiredFormatFeatures 必须包含 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT

  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06400
    如果 pFormatConstraints->imageCreateInfo→usage 包含 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,则 pFormatConstraints->requiredFormatFeatures 必须至少包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT 中的一个。

  • VUID-VkImageConstraintsInfoFUCHSIA-attachmentFragmentShadingRate-06401
    如果启用了 attachmentFragmentShadingRate 功能,并且 pFormatConstraints->imageCreateInfo→usage 包含 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,则 pFormatConstraints->requiredFormatFeatures 必须包含 VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

有效用法(隐式)
  • VUID-VkImageConstraintsInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA

  • VUID-VkImageConstraintsInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-parameter
    pFormatConstraints 必须是指向 formatConstraintsCount 个有效 VkImageFormatConstraintsInfoFUCHSIA 结构体数组的有效指针。

  • VUID-VkImageConstraintsInfoFUCHSIA-bufferCollectionConstraints-parameter
    bufferCollectionConstraints 必须是一个有效的 VkBufferCollectionConstraintsInfoFUCHSIA 结构体。

  • VUID-VkImageConstraintsInfoFUCHSIA-flags-parameter
    flags 必须VkImageConstraintsInfoFlagBitsFUCHSIA 值的有效组合。

  • VUID-VkImageConstraintsInfoFUCHSIA-formatConstraintsCount-arraylength
    formatConstraintsCount 必须大于 0

// Provided by VK_FUCHSIA_buffer_collection
typedef VkFlags VkImageConstraintsInfoFlagsFUCHSIA;

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

VkImageConstraintsInfoFlagBitsFUCHSIA::flags可以设置的位包括:

// Provided by VK_FUCHSIA_buffer_collection
typedef enum VkImageConstraintsInfoFlagBitsFUCHSIA {
    VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA = 0x00000001,
    VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA = 0x00000002,
    VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA = 0x00000004,
    VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA = 0x00000008,
    VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA = 0x00000010,
} VkImageConstraintsInfoFlagBitsFUCHSIA;

关于 Sysmem 应根据缓冲区集合中图像的预期用途分配的内存类型的一般提示包括:

  • VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA

  • VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA

  • VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA

  • VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA

对于受保护的内存:

  • VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA 指定缓冲区集合的受保护内存是可选的。

请注意,如果缓冲区集合中的所有参与者(Vulkan 或其他)都指定受保护的内存是可选的,则 Sysmem 将不会分配受保护的内存。

VkImageFormatConstraintsInfoFUCHSIA 结构体的定义如下:

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkImageFormatConstraintsInfoFUCHSIA {
    VkStructureType                         sType;
    const void*                             pNext;
    VkImageCreateInfo                       imageCreateInfo;
    VkFormatFeatureFlags                    requiredFormatFeatures;
    VkImageFormatConstraintsFlagsFUCHSIA    flags;
    uint64_t                                sysmemPixelFormat;
    uint32_t                                colorSpaceCount;
    const VkSysmemColorSpaceFUCHSIA*        pColorSpaces;
} VkImageFormatConstraintsInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • imageCreateInfo 是用于创建 VkImageVkImageCreateInfo,该 VkImage 将使用来自 VkBufferCollectionFUCHSIA 的内存。

  • requiredFormatFeatures 是一个 VkFormatFeatureFlagBits 的位掩码,指定缓冲区集合中所需的缓冲区功能。

  • flags 保留供将来使用。

  • sysmemPixelFormat 是来自 fuchsia.sysmem/image_formats.fidl FIDL 接口的 PixelFormatType 值。

  • colorSpaceCountpColorSpaces 的元素计数。

  • pColorSpaces 是指向大小为 colorSpaceCountVkSysmemColorSpaceFUCHSIA 结构体数组的指针。

有效用法(隐式)
  • VUID-VkImageFormatConstraintsInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA

  • VUID-VkImageFormatConstraintsInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageFormatConstraintsInfoFUCHSIA-imageCreateInfo-parameter
    imageCreateInfo 必须是一个有效的 VkImageCreateInfo 结构体。

  • VUID-VkImageFormatConstraintsInfoFUCHSIA-requiredFormatFeatures-parameter
    requiredFormatFeatures 必须VkFormatFeatureFlagBits 值的有效组合。

  • VUID-VkImageFormatConstraintsInfoFUCHSIA-requiredFormatFeatures-requiredbitmask
    requiredFormatFeatures 必须不能为 0

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

  • VUID-VkImageFormatConstraintsInfoFUCHSIA-pColorSpaces-parameter
    pColorSpaces 必须是指向 colorSpaceCount 个有效的 VkSysmemColorSpaceFUCHSIA 结构体的数组的有效指针。

  • VUID-VkImageFormatConstraintsInfoFUCHSIA-colorSpaceCount-arraylength
    colorSpaceCount 必须大于 0

// Provided by VK_FUCHSIA_buffer_collection
typedef VkFlags VkImageFormatConstraintsFlagsFUCHSIA;

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

VkBufferCollectionConstraintsInfoFUCHSIA 结构体的定义如下:

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionConstraintsInfoFUCHSIA {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           minBufferCount;
    uint32_t           maxBufferCount;
    uint32_t           minBufferCountForCamping;
    uint32_t           minBufferCountForDedicatedSlack;
    uint32_t           minBufferCountForSharedSlack;
} VkBufferCollectionConstraintsInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • minBufferCount 是集合中可用的最小缓冲区数。

  • maxBufferCount 是集合中允许的最大缓冲区数。

  • minBufferCountForCamping 是每个参与者的最小缓冲露营数。

  • minBufferCountForDedicatedSlack 是每个参与者的专用松弛的最小缓冲区数。

  • minBufferCountForSharedSlack 是每个参与者的共享松弛的最小缓冲区数。

Sysmem 结合使用所有缓冲区计数参数来确定它将分配的缓冲区数量。 Sysmem 在 fuchsia.sysmem/constraints.fidl 中定义缓冲区计数约束。

minBufferCountForCamping 中提到的露营是指参与者不用于临时使用的可用缓冲区数量。此数量的缓冲区是参与者逻辑操作所必需的。

minBufferCountForDedicatedSlackminBufferCountForSharedSlack 中提到的Slack,指的是参与者为了获得最佳性能而期望的缓冲区数量。minBufferCountForDedicatedSlack 指的是当前参与者。minBufferCountForSharedSlack 指的是集合中所有参与者的缓冲区空闲量。

有效用法(隐式)
  • VUID-VkBufferCollectionConstraintsInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA

  • VUID-VkBufferCollectionConstraintsInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

VkSysmemColorSpaceFUCHSIA 结构定义如下

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

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

  • Sysmem ColorSpaceTypecolorSpace

有效用法
  • VUID-VkSysmemColorSpaceFUCHSIA-colorSpace-06402
    colorSpace 必须fuchsia.sysmem/image_formats.fidl 中定义的 ColorSpaceType

有效用法(隐式)
  • VUID-VkSysmemColorSpaceFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA

  • VUID-VkSysmemColorSpaceFUCHSIA-pNext-pNext
    pNext 必须NULL

设置基于缓冲区的缓冲区集合约束

要设置 VkBuffer 缓冲区集合的约束,请调用

// Provided by VK_FUCHSIA_buffer_collection
VkResult vkSetBufferCollectionBufferConstraintsFUCHSIA(
    VkDevice                                    device,
    VkBufferCollectionFUCHSIA                   collection,
    const VkBufferConstraintsInfoFUCHSIA*       pBufferConstraintsInfo);

如果实现不支持 bufferCollectionConstraints 结构中指定的约束,则 vkSetBufferCollectionBufferConstraintsFUCHSIA 可能会失败。如果发生这种情况,vkSetBufferCollectionBufferConstraintsFUCHSIA 将返回 VK_ERROR_FORMAT_NOT_SUPPORTED

有效用法
  • VUID-vkSetBufferCollectionBufferConstraintsFUCHSIA-collection-06403
    不得在 collection 上调用 vkSetBufferCollectionImageConstraintsFUCHSIAvkSetBufferCollectionBufferConstraintsFUCHSIA

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

  • VUID-vkSetBufferCollectionBufferConstraintsFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

  • VUID-vkSetBufferCollectionBufferConstraintsFUCHSIA-pBufferConstraintsInfo-parameter
    pBufferConstraintsInfo 必须是指向有效 VkBufferConstraintsInfoFUCHSIA 结构的有效指针

  • VUID-vkSetBufferCollectionBufferConstraintsFUCHSIA-collection-parent
    collection 必须已从 device 创建、分配或检索

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_FORMAT_NOT_SUPPORTED

VkBufferConstraintsInfoFUCHSIA 结构定义如下

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferConstraintsInfoFUCHSIA {
    VkStructureType                             sType;
    const void*                                 pNext;
    VkBufferCreateInfo                          createInfo;
    VkFormatFeatureFlags                        requiredFormatFeatures;
    VkBufferCollectionConstraintsInfoFUCHSIA    bufferCollectionConstraints;
} VkBufferConstraintsInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pBufferCreateInfo 是指向 VkBufferCreateInfo 结构的指针,该结构描述了缓冲区集合的缓冲区属性

  • requiredFormatFeaturesVkFormatFeatureFlagBits 的位掩码,表示缓冲区集合中缓冲区的所需特性

  • bufferCollectionConstraints 用于提供缓冲区集合的协商和分配参数

有效用法
  • VUID-VkBufferConstraintsInfoFUCHSIA-requiredFormatFeatures-06404
    VkFormatFeatureFlagBitsrequiredFormatFeatures 位掩码 必须缓冲区兼容格式特性 中列出的缓冲区兼容格式特性中选择

有效用法(隐式)
  • VUID-VkBufferConstraintsInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIA

  • VUID-VkBufferConstraintsInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

  • VUID-VkBufferConstraintsInfoFUCHSIA-createInfo-parameter
    createInfo 必须是有效的 VkBufferCreateInfo 结构

  • VUID-VkBufferConstraintsInfoFUCHSIA-requiredFormatFeatures-parameter
    requiredFormatFeatures 必须VkFormatFeatureFlagBits 值的有效组合。

  • VUID-VkBufferConstraintsInfoFUCHSIA-bufferCollectionConstraints-parameter
    bufferCollectionConstraints 必须是一个有效的 VkBufferCollectionConstraintsInfoFUCHSIA 结构体。

检索缓冲区集合属性

通过调用 vkSetBufferCollectionImageConstraintsFUCHSIAvkSetBufferCollectionBufferConstraintsFUCHSIA 在缓冲区集合上设置约束后,调用 vkGetBufferCollectionPropertiesFUCHSIA 来检索缓冲区集合的协商和最终属性。

vkGetBufferCollectionPropertiesFUCHSIA 的调用是同步的。它会等待 Sysmem 格式协商和缓冲区集合分配完成,然后再返回。

// Provided by VK_FUCHSIA_buffer_collection
VkResult vkGetBufferCollectionPropertiesFUCHSIA(
    VkDevice                                    device,
    VkBufferCollectionFUCHSIA                   collection,
    VkBufferCollectionPropertiesFUCHSIA*        pProperties);

对于基于图像的缓冲区集合,在调用 vkGetBufferCollectionPropertiesFUCHSIA 时,Sysmem 将选择 VkImageConstraintsInfoFUCHSIA::pImageCreateInfos 的一个元素,该元素由先前对 vkSetBufferCollectionImageConstraintsFUCHSIA 的调用建立。所选元素的索引存储在 VkBufferCollectionPropertiesFUCHSIA::createInfoIndex 中,并可从中检索。

对于基于缓冲区的缓冲区集合,将单个 VkBufferCreateInfo 指定为 VkBufferConstraintsInfoFUCHSIA::createInfoVkBufferCollectionPropertiesFUCHSIA::createInfoIndex 因此始终为零。

如果 Sysmem 无法解析缓冲区集合中所有参与者的约束,则 vkGetBufferCollectionPropertiesFUCHSIA 可能会失败。如果发生这种情况,vkGetBufferCollectionPropertiesFUCHSIA 将返回 VK_ERROR_INITIALIZATION_FAILED

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

  • VUID-vkGetBufferCollectionPropertiesFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

  • VUID-vkGetBufferCollectionPropertiesFUCHSIA-pProperties-parameter
    pProperties 必须是指向 VkBufferCollectionPropertiesFUCHSIA 结构的有效指针。

  • VUID-vkGetBufferCollectionPropertiesFUCHSIA-collection-parent
    collection 必须已从 device 创建、分配或检索

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

VkBufferCollectionPropertiesFUCHSIA 结构的定义如下:

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionPropertiesFUCHSIA {
    VkStructureType                  sType;
    void*                            pNext;
    uint32_t                         memoryTypeBits;
    uint32_t                         bufferCount;
    uint32_t                         createInfoIndex;
    uint64_t                         sysmemPixelFormat;
    VkFormatFeatureFlags             formatFeatures;
    VkSysmemColorSpaceFUCHSIA        sysmemColorSpaceIndex;
    VkComponentMapping               samplerYcbcrConversionComponents;
    VkSamplerYcbcrModelConversion    suggestedYcbcrModel;
    VkSamplerYcbcrRange              suggestedYcbcrRange;
    VkChromaLocation                 suggestedXChromaOffset;
    VkChromaLocation                 suggestedYChromaOffset;
} VkBufferCollectionPropertiesFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • memoryTypeBits 是一个位掩码,其中为每个可以作为缓冲集合导入的内存类型设置一位。

  • bufferCount 是集合中缓冲区的数量。

  • createInfoIndexSysmem 选择的创建信息 中所述。

  • sysmemPixelFormat 是 Sysmem 的 PixelFormatType,定义在 fuchsia.sysmem/image_formats.fidl 中。

  • formatFeatures 是缓冲集合共享的 VkFormatFeatureFlagBits 的位掩码。

  • sysmemColorSpaceIndex 是一个 VkSysmemColorSpaceFUCHSIA 结构,指定颜色空间。

  • samplerYcbcrConversionComponents 是一个 VkComponentMapping 结构,指定组件映射。

  • suggestedYcbcrModel 是一个 VkSamplerYcbcrModelConversion 值,指定建议的 Y′CBCR 模型。

  • suggestedYcbcrRange 是一个 VkSamplerYcbcrRange 值,指定建议的 Y′CBCR 范围。

  • suggestedXChromaOffset 是一个 VkChromaLocation 值,指定建议的 X 色度偏移。

  • suggestedYChromaOffset 是一个 VkChromaLocation 值,指定建议的 Y 色度偏移。

sysmemColorSpace 仅针对基于图像的缓冲集合设置,其中约束条件是在调用 vkSetBufferCollectionImageConstraintsFUCHSIA 时使用 VkImageConstraintsInfoFUCHSIA 指定的。

对于基于图像的缓冲集合,createInfoIndex 将标识 VkImageConstraintsInfoFUCHSIA::pImageCreateInfos 元素和 VkImageConstraintsInfoFUCHSIA::pFormatConstraints 元素,这些元素是由 Sysmem 在调用 vkSetBufferCollectionImageConstraintsFUCHSIA 时选择的。sysmemColorSpaceIndex 的值将是 VkImageFormatConstraintsInfoFUCHSIA::pColorSpaces 数组中提供的颜色空间之一的索引。

实现必须使 formatFeatures 具有所有在 VkImageFormatConstraintsInfoFUCHSIA::requiredFormatFeatures 中设置的位,这些位是通过调用 vkSetBufferCollectionImageConstraintsFUCHSIAcreateInfoIndex 处设置的(其他位也可以设置)。

有效用法(隐式)
  • VUID-VkBufferCollectionPropertiesFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA

  • VUID-VkBufferCollectionPropertiesFUCHSIA-pNext-pNext
    pNext 必须NULL

内存分配

要将内存从缓冲集合导入到 VkImageVkBuffer 中,请将 VkImportMemoryBufferCollectionFUCHSIA 结构链接到调用 vkAllocateMemoryVkMemoryAllocateInfopNext 成员。

VkImportMemoryBufferCollectionFUCHSIA 结构的定义如下:

// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkImportMemoryBufferCollectionFUCHSIA {
    VkStructureType              sType;
    const void*                  pNext;
    VkBufferCollectionFUCHSIA    collection;
    uint32_t                     index;
} VkImportMemoryBufferCollectionFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • collectionVkBufferCollectionFUCHSIA 句柄

  • index 要从 collection 导入的缓冲区的索引。

有效用法
有效用法(隐式)
  • VUID-VkImportMemoryBufferCollectionFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA

  • VUID-VkImportMemoryBufferCollectionFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

要释放一个 VkBufferCollectionFUCHSIA

// Provided by VK_FUCHSIA_buffer_collection
void vkDestroyBufferCollectionFUCHSIA(
    VkDevice                                    device,
    VkBufferCollectionFUCHSIA                   collection,
    const VkAllocationCallbacks*                pAllocator);
有效用法
有效用法(隐式)
  • VUID-vkDestroyBufferCollectionFUCHSIA-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkDestroyBufferCollectionFUCHSIA-collection-parameter
    collection 必须 是有效的 VkBufferCollectionFUCHSIA 句柄

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

  • VUID-vkDestroyBufferCollectionFUCHSIA-collection-parent
    collection 必须已从 device 创建、分配或检索