Vulkan Specification(Vulkan规范):第十一章 11.3. 图像

本文详细介绍Vulkan API中图像的创建过程,包括VkImageCreateInfo结构体的各个字段解释,图像使用方式的枚举,以及图像创建时的限制条件。同时,文章还介绍了如何查询图像子资源布局,以及图像销毁的相关命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11.3. 图像

图像表示多维(最多3维)的数组数据,可用于各种目的(比如:附件,纹理),通过描述符集合把它们绑定到一个图形或者计算管线, 或者直接当作参数直接传递个某些命令。

图像通过VkImage类型的handle表示:

VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)

可调用下列命令来创建图像:

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

  • pCreateInfo 是一个指针,指向一个 VkImageCreateInfo 数据结构实例,它包含了创建图像所需的信息。

  • pAllocator 控制CPU端内存分配,如 内存分配 一章详述。

  • pImage 指向已创建并返回的 VkImage handle。

Valid Usage

  • 若 pCreateInfo的成员flags 包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT,创建这个VkImage 不能导致当前有效稀疏资源 在总体需求的稀疏内存超过 VkPhysicalDeviceLimits::sparseAddressSpaceSize

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • pCreateInfo must be a pointer to a valid VkImageCreateInfo structure

  • If pAllocator is not NULLpAllocator must be a pointer to a valid VkAllocationCallbacks structure

  • pImage must be a pointer to a VkImage handle

Return Codes

Success

  • VK_SUCCESS

Failure

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkImageCreateInfo 类型数据结构定义如下:

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 是数据结构的类型。

  • pNext 是 NULL 或者一个指向 拓展特定的数据结构的指针。

  • flags 是一个位掩码,描述了图像的附加参数。参考 如下VkImageCreateFlagBits 关于受支持的bit描述。

  • imageType 是一个 VkImageType,指定了图像的基础维度,如下所描述。数组纹理的层次作为图像类别时并不能算作维度

  • format 是一个 VkFormat ,描述了数据元素的格式与类型,数据包含在图像中。

  • extent 是一个VkExtent3D,描述了基础层次中每一个维度的元素的个数。

  • mipLevels 描述了图向下采样的细节层次的个数。

  • arrayLayers 是图像中的层数。

  • samples 是图像中sub-data 元素采样的个数,其在VkSampleCountFlagBits 中被定义。 参考Multisampling

  • tiling是一个 VkImageTiling,指定了内存中数据元素的tiling组织方式,如下所描述。

  • usage 是一个 bitmask,描述图像的目标使用方式。参考如下的 VkImageUsageFlagBits 支持的bit。

  • sharingMode 是当多个队列族的访问时图像的共享模式, 且 必须: 是下一节的 Resource Sharing 的VkSharingMode描述的值之一。

  • queueFamilyIndexCount 是  pQueueFamilyIndices 数组元素的个数。

  • pQueueFamilyIndices 是一个队列族的列表,该队列族将访问此图像 (ignored if sharingMode is notVK_SHARING_MODE_CONCURRENT)。

  • initialLayout 选择 此图像的所有图像子资源的 初始 VkImageLayout 状态。 参看 Image LayoutsinitialLayout 必须: 是 VK_IMAGE_LAYOUT_UNDEFINED 或者 VK_IMAGE_LAYOUT_PREINITIALIZED

使用tiling值为VK_IMAGE_TILING_LINEAR 创建的图像,比使用tiling值为VK_IMAGE_TILING_OPTIMAL创建的图像由更多的限制。 使用 VK_IMAGE_TILING_LINEAR 创建的图像可能不被支持,除非其他参数满足如下限制:

  • imageType 是 VK_IMAGE_TYPE_2D

  • format 不是 depth/stencil 格式

  • mipLevels 是 1

  • arrayLayers 是 1

  • samples 是 VK_SAMPLE_COUNT_1_BIT

  • usage 只包含 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 和/或  VK_IMAGE_USAGE_TRANSFER_DST_BIT

除了上面表格所列,Vulkan实现可能支持附加的限制条件和功能。

对于给定的 formattypetilingusage, and flags组合方式的能力,可以通过调用 vkGetPhysicalDeviceImageFormatProperties来 向Vulkan实现查询。 返回值可表示对于图像的该种组合方式是否受支持。 若支持, VkImageFormatProperties 输出参数表示有效的 samples bits和  extent参数的限制的集合。

可调用如下函数来获知对于给定格式有效的标志位集合:

Valid Usage

  • format, typetilingusage,和flags 的组合 必须: 被支持, 若把对应的值传递到相对应的参数里,并调用vkGetPhysicalDeviceImageFormatProperties ,其返回值为VK_SUCCESS 可表明支持。

  • 若 sharingMode 是 VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices 必须: 是一个指向 a pointer to an array of元素类型为uint32_t ,元素个数为 queueFamilyIndexCount 的数组的指针。

  • 若 sharingMode 是 VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount 必须: 大于 1

  • format 不能: 是 VK_FORMAT_UNDEFINED

  • extent的成员widthheight, 和 depth 不能: 全大于`0`

  • mipLevels 必须: 大于 0

  • arrayLayers 必须: 大于 0

  • 若 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, imageType 必须是 VK_IMAGE_TYPE_2D

  • 若 imageType 是 VK_IMAGE_TYPE_1Dextent.width 必须: 小于等于VkPhysicalDeviceLimits::maxImageDimension1D 或者 VkImageFormatProperties::maxExtent.width (as returned by vkGetPhysicalDeviceImageFormatProperties with formattypetilingusage, and flags 等于 those in this structure) - 与值大的比较。

  • 若 imageType 是 VK_IMAGE_TYPE_2D 且 flags 不包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BITextent.width 和 extent.height 必须: 小于等于VkPhysicalDeviceLimits::maxImageDimension2D, 或者 VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with formattypetilingusage, and flags 等于 those in this structure) - 与值大的比较。

  • 若 imageType 是 VK_IMAGE_TYPE_2D 且 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BITextent.width且 extent.height 必须: 小于等于 VkPhysicalDeviceLimits::maxImageDimensionCube, 或者VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with formattypetilingusage, and flags 等于 those in this structure) - 与值大的比较。

  • 若 imageType 是 VK_IMAGE_TYPE_2D 且 flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width且 extent.height 必须: 相等 且 arrayLayers 必须: 大于等于 6

  • 若 imageType 是 VK_IMAGE_TYPE_3Dextent.widthextent.height 且 extent.depth 必须: 小于等于 VkPhysicalDeviceLimits::maxImageDimension3D, 或者VkImageFormatProperties::maxExtent.width/height/depth (as returned by vkGetPhysicalDeviceImageFormatProperties with formattypetilingusage, and flags 等于 those in this structure) - 与值大的比较。

  • 若 imageType 是 VK_IMAGE_TYPE_1D,  extent.height 和 extent.depth 都 必须: 等于`1`

  • 若 imageType 是 VK_IMAGE_TYPE_2D, extent.depth 必须: 等于 1

  • mipLevels 必须: 小于等于 ⌊log2(max(extent.widthextent.heightextent.depth))⌋ + 1.

  • 若 extent.widthextent.height, 或者 extent.depth 之中任意一个大于VkPhysicalDeviceLimits::maxImageDimension3D 中对等的名字的成员的数量, mipLevels 必须: 小于等于VkImageFormatProperties::maxMipLevels (as returned by vkGetPhysicalDeviceImageFormatPropertieswith formattypetilingusage, and flags 等于 those in this structure)

  • arrayLayers 必须小于等于 VkImageFormatProperties::maxArrayLayers (as returned byvkGetPhysicalDeviceImageFormatProperties with formattypetilingusage, and flags 等于 those in this structure)

  • 若 imageType 是 VK_IMAGE_TYPE_3D, arrayLayers 必须: 等于  1.

  • samples 不是 VK_SAMPLE_COUNT_1_BITimageType 必须 是 VK_IMAGE_TYPE_2Dflags 必须不能包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BITtiling 必须 be VK_IMAGE_TILING_OPTIMAL, and mipLevels 必须 be 等于 1

  • usage 包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, then bits other than VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, andVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 必须 not be set

  • usage 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,或 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITextent.width 必须 be 小于或 等于 VkPhysicalDeviceLimits::maxFramebufferWidth

  • usage 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,或 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITextent.height 必须 be 小于或 等于 VkPhysicalDeviceLimits::maxFramebufferHeight

  • usage 包含 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BITusage 必须也包含至少VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT中的一个。

  • samples 必须是一个bit value,被设置到 VkImageFormatProperties::sampleCounts,该数值可通过 以等于此数据集结构中的 formattypetilingusage, and flags 参数来调用vkGetPhysicalDeviceImageFormatProperties 返回。

  • 若 ETC2 texture compression 特征没有被启用,format 必须不能是 VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCKVK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCKVK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCKVK_FORMAT_EAC_R11_UNORM_BLOCK,VK_FORMAT_EAC_R11_SNORM_BLOCKVK_FORMAT_EAC_R11G11_UNORM_BLOCK,或VK_FORMAT_EAC_R11G11_SNORM_BLOCK

  • ASTC LDR texture compression 特征没有被启用,format 必须不能是 VK_FORMAT_ASTC_4x4_UNORM_BLOCK,VK_FORMAT_ASTC_4x4_SRGB_BLOCKVK_FORMAT_ASTC_5x4_UNORM_BLOCKVK_FORMAT_ASTC_5x4_SRGB_BLOCK,VK_FORMAT_ASTC_5x5_UNORM_BLOCKVK_FORMAT_ASTC_5x5_SRGB_BLOCKVK_FORMAT_ASTC_6x5_UNORM_BLOCK,VK_FORMAT_ASTC_6x5_SRGB_BLOCKVK_FORMAT_ASTC_6x6_UNORM_BLOCKVK_FORMAT_ASTC_6x6_SRGB_BLOCK,VK_FORMAT_ASTC_8x5_UNORM_BLOCKVK_FORMAT_ASTC_8x5_SRGB_BLOCKVK_FORMAT_ASTC_8x6_UNORM_BLOCK,VK_FORMAT_ASTC_8x6_SRGB_BLOCKVK_FORMAT_ASTC_8x8_UNORM_BLOCKVK_FORMAT_ASTC_8x8_SRGB_BLOCK,VK_FORMAT_ASTC_10x5_UNORM_BLOCKVK_FORMAT_ASTC_10x5_SRGB_BLOCK,VK_FORMAT_ASTC_10x6_UNORM_BLOCKVK_FORMAT_ASTC_10x6_SRGB_BLOCK,VK_FORMAT_ASTC_10x8_UNORM_BLOCKVK_FORMAT_ASTC_10x8_SRGB_BLOCK,VK_FORMAT_ASTC_10x10_UNORM_BLOCKVK_FORMAT_ASTC_10x10_SRGB_BLOCK,VK_FORMAT_ASTC_12x10_UNORM_BLOCKVK_FORMAT_ASTC_12x10_SRGB_BLOCK,VK_FORMAT_ASTC_12x12_UNORM_BLOCK,或 VK_FORMAT_ASTC_12x12_SRGB_BLOCK

  • 若 BC texture compression 特征没有被启用,format 必须不能是 VK_FORMAT_BC1_RGB_UNORM_BLOCKVK_FORMAT_BC1_RGB_SRGB_BLOCKVK_FORMAT_BC1_RGBA_UNORM_BLOCKVK_FORMAT_BC1_RGBA_SRGB_BLOCKVK_FORMAT_BC2_UNORM_BLOCKVK_FORMAT_BC2_SRGB_BLOCKVK_FORMAT_BC3_UNORM_BLOCK,VK_FORMAT_BC3_SRGB_BLOCKVK_FORMAT_BC4_UNORM_BLOCKVK_FORMAT_BC4_SNORM_BLOCKVK_FORMAT_BC5_UNORM_BLOCKVK_FORMAT_BC5_SNORM_BLOCKVK_FORMAT_BC6H_UFLOAT_BLOCK,VK_FORMAT_BC6H_SFLOAT_BLOCKVK_FORMAT_BC7_UNORM_BLOCK,或 VK_FORMAT_BC7_SRGB_BLOCK

  • multisampled storage images 特征没有被启用,且usage包含 VK_IMAGE_USAGE_STORAGE_BITsamples 必须是VK_SAMPLE_COUNT_1_BIT

  • sparse bindings 特征没有被启用,flags 必须 不能包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT

  • imageType is VK_IMAGE_TYPE_1Dflags 必须 不能 包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • 若 sparse residency for 2D images特征没有被启用, 且 imageType 是 VK_IMAGE_TYPE_2Dflags 必须 不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • sparse residency for 3D images特征没有被启用, 且 imageType is VK_IMAGE_TYPE_3Dflags 必须不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • 若the sparse residency for images with 2 samples特征没有被启用, imageType 是 VK_IMAGE_TYPE_2D, 且 samples是 VK_SAMPLE_COUNT_2_BITflags 必须 不能包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • sparse residency for images with 4 samples特征没有被启用, imageType 是 VK_IMAGE_TYPE_2D, 且 samples 是VK_SAMPLE_COUNT_4_BITflags 必须 不能包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • 若 sparse residency for images with 8 samples特征没有被启用, imageType 是 VK_IMAGE_TYPE_2D, 且 samples 是VK_SAMPLE_COUNT_8_BITflags 必须 不能包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • sparse residency for images with 16 samples特征没有被启用, imageType 是 VK_IMAGE_TYPE_2D, 且 samples 是VK_SAMPLE_COUNT_16_BITflags 必须 不能包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT

  • tiling is VK_IMAGE_TILING_LINEARformat 必须是一个 VkFormatProperties::linearTilingFeatures数据中的一个特征bit的格式,该数据是通过以format相同值为参数 调用 vkGetPhysicalDeviceFormatProperties获取的。

  • tiling is VK_IMAGE_TILING_LINEAR, 和 VkFormatProperties::linearTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_BITusage 必须不能包含 VK_IMAGE_USAGE_SAMPLED_BIT

  • tiling is VK_IMAGE_TILING_LINEAR, 和 VkFormatProperties::linearTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_STORAGE_IMAGE_BITusage 必须不能包含 VK_IMAGE_USAGE_STORAGE_BIT

  • tiling is VK_IMAGE_TILING_LINEAR, 和 VkFormatProperties::linearTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITusage 必须不能 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT

  • tiling is VK_IMAGE_TILING_LINEAR, 和 VkFormatProperties::linearTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BITusage must not包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • tiling 是 VK_IMAGE_TILING_OPTIMALformat 必须 是 value of VkFormatProperties::optimalTilingFeatures 其中一个受支持的特征bit的格式 ,该数据是通过以format相同值为参数 调用 vkGetPhysicalDeviceFormatProperties 获取的。

  • tiling 是 VK_IMAGE_TILING_OPTIMAL, 且 VkFormatProperties::optimalTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_BITusage 必须不能包含 VK_IMAGE_USAGE_SAMPLED_BIT

  • tiling 是 VK_IMAGE_TILING_OPTIMAL, 且 VkFormatProperties::optimalTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_STORAGE_IMAGE_BITusage 必须不能包含 VK_IMAGE_USAGE_STORAGE_BIT

  • tiling 是 VK_IMAGE_TILING_OPTIMAL, 且 VkFormatProperties::optimalTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BITusage 必须不能 包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT

  • tiling 是 VK_IMAGE_TILING_OPTIMAL, 且 VkFormatProperties::optimalTilingFeatures (as returned byvkGetPhysicalDeviceFormatProperties with the same value of format) 不包含VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BITusage 不能 包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

  • flags包含 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT或 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, 它必须也包含 VK_IMAGE_CREATE_SPARSE_BINDING_BIT

Valid Usage (Implicit)

图像的目标使用方式由 VkImageCreateInfo::usage 掩码表示。 可用标志位如下:

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,
} VkImageUsageFlagBits;

这些bit 有如下的意义:

  • VK_IMAGE_USAGE_TRANSFER_SRC_BIT 表示图像 可以 被用作 转移命令的源。

  • VK_IMAGE_USAGE_TRANSFER_DST_BIT 表示图像 可以 被用作 转移命令的目标。

  • VK_IMAGE_USAGE_SAMPLED_BIT 表示图像 可以 被用于创建 适于占用 VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE 或VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER类型,且可被着色器采样的VkDescriptorSet槽的 VkImageView 。

  • VK_IMAGE_USAGE_STORAGE_BIT 表示 图像可以被用于创建适于占用 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE类型的 VkDescriptorSet 槽。

  • VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT表示 该图像可以 被用于创建  VkImageView,其适于被用作 VkFramebuffer中的 一个颜色 或 resolve 附件。

  • VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT表示 该图像可以被用于创建 VkImageView, 其适于被用作VkFramebuffer中的 depth/stencil 附件。

  • VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT表示 绑定到此图像的内存使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT (参考 内存分配 获取详细内容) 标志位被创建的。 这个bit可以 设置给任何图像,该图像必须可以被用于创建 一个适于用作颜色、resolve、depth/stencil 或 输入附件。

  • VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT表示 that该图像可以 被用于创建 一个 VkImageView,其适于占用一个VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 类型的 VkDescriptorSet 槽; 可从着色器中作为 输入附件 被读取;且可在缓冲区中被用作一个输入附件。

图像的其他参数可以通过 VkImageCreateInfo::flags 指定。 可以设置的 Bits 包括:

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,
} VkImageCreateFlagBits;

这些bit的含义如下:

  • VK_IMAGE_CREATE_SPARSE_BINDING_BIT 表示图像将使用稀疏内存绑定来存储。

  • VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 表示图像可部分的使用稀疏内存绑定来存储。 使用此flog创建的图像也可以使用 VK_IMAGE_CREATE_SPARSE_BINDING_BIT flag创建。

  • VK_IMAGE_CREATE_SPARSE_ALIASED_BIT表示 该图像 将使用稀疏内存绑定来存储,内存区间可能同时存储其他图像(或者同一图像的其他部分)。 带有此flag被创建的图像 必须也带有 VK_IMAGE_CREATE_SPARSE_BINDING_BIT 标志位。

  • VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT表示 该图像可以 被用于创建与此图像格式不同的格式的 VkImageView

  • VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT表示 该图像可以 被用于创建 VK_IMAGE_VIEW_TYPE_CUBE或 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY类型的VkImageView 。

如果VK_IMAGE_CREATE_SPARSE_BINDING_BITVK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, 或者 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT 之一被设置过了, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 就不能被设置了。

参考 Sparse Resource Features 和 Sparse Physical Device Features 来获取更多细节。

图像的基础维度是通过VkImageCreateInfo::imageType 指定的,必须是如下值之一:

typedef enum VkImageType {
    VK_IMAGE_TYPE_1D = 0,
    VK_IMAGE_TYPE_2D = 1,
    VK_IMAGE_TYPE_3D = 2,
} VkImageType;

这些值各自指定了一维-,二维-或者三维- 图像。

The tiling arrangement of data elements in an image is specified by VkImageCreateInfo::tiling, which 必须 be one of the values

typedef enum VkImageTiling {
    VK_IMAGE_TILING_OPTIMAL = 0,
    VK_IMAGE_TILING_LINEAR = 1,
} VkImageTiling;

VK_IMAGE_TILING_OPTIMAL specifies optimal tiling (texels are laid out in an implementation-dependent arrangement, for more optimal memory access), and VK_IMAGE_TILING_LINEAR specifies linear tiling (texels are laid out in memory in row-major或der, possibly with some padding on each row).

对于以线性tiling 创建的图像,可调用如下命令来查询图像子资源的主机端访问布局:

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

  • image 被查询布局的图像。

  • pSubresource 是一个指向 VkImageSubresource 数据结构的指针,为图像子资源选择了指定的图像。

  • pLayout 指向一个 VkSubresourceLayout 数据结构,存储被返回的布局。

vkGetImageSubresourceLayout 对于单个图像的生命周期来说是不变的。

Valid Usage

  • image 必须: 是使用 tiling 为  VK_IMAGE_TILING_LINEAR的参数创建的。

  • pSubresourceaspectMask 成员 必须: 只能让其一个bit 被设置。

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • image must be a valid VkImage handle

  • pSubresource must be a pointer to a valid VkImageSubresource structure

  • pLayout must be a pointer to a VkSubresourceLayout structure

  • image must have been created, allocated, or retrieved from device

VkImageSubresource 数据结构定义如下:

typedef struct VkImageSubresource {
    VkImageAspectFlags    aspectMask;
    uint32_t              mipLevel;
    uint32_t              arrayLayer;
} VkImageSubresource;
  • aspectMask 是一个 VkImageAspectFlags ,筛选图像的 aspect

  • mipLevel 选择了mipmap层级。

  • arrayLayer 选择了array layer。

Valid Usage

  • mipLevel 必须: 小于 mipLevels,由图像被创建时的VkImageCreateInfo 所指定。

  • arrayLayer 必须: 小于 arrayLayers,由图像被创建时的  VkImageCreateInfo 所指定。

Valid Usage (Implicit)

该图像子资源的布局的信息 被封装在VkSubresourceLayout 数据结构中被返回:

typedef struct VkSubresourceLayout {
    VkDeviceSize    offset;
    VkDeviceSize    size;
    VkDeviceSize    rowPitch;
    VkDeviceSize    arrayPitch;
    VkDeviceSize    depthPitch;
} VkSubresourceLayout;
  • offset 是该图像子资源起始的偏移字节数。

  • size 该图像子资源的字节大小。 size 包含 要求基于rowPitch的 任何 额外内存。

  • rowPitch 描述了一个图像内每行纹素的字节数。

  • arrayPitch 描述了一个图像内每个array layer 的字节数。

  • depthPitch 描述了3D图像的每个切分的字节数。

对于线性排列创建的图像,rowPitcharrayPitch 和 depthPitch 描述 该图像子资源再线性内存中的布局。 对于未压缩的格式, rowPitch 是相邻行(y坐标相差1)之间相同x坐标的纹素之间的字节数。 arrayPitch 是该图像的相邻array layer 的同x、y坐标纹素之间的字节数。 depthPitch 是3D图像相邻切片(z坐标相差1)内同x、y坐标之间纹素之间的字节数。 通过一个寻址表达式来表示,一个图像子资源的纹素的起始字节 地址为:

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

对于压缩格式,rowPitch 是相邻行的压缩的纹素块的字节数。 arrayPitch 是相邻array layers的压缩纹素块之间的字节数。 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 is undefined for images that were not created as arrays. depthPitch is defined only for 3D images.

对于颜色格式, VkImageSubresourceaspectMask 成员 必须 是 VK_IMAGE_ASPECT_COLOR_BIT. 对于depth/stencil 格式,aspectMask 必须是 VK_IMAGE_ASPECT_DEPTH_BIT或 VK_IMAGE_ASPECT_STENCIL_BIT 二者其一。 On implementations that store depth and stencil aspects separately, querying each of these image subresource layouts will return a different offset and size representing the region of memory used for that aspect. On implementations that store depth and stencil aspects interleaved, the same offset and size are returned and represent the interleaved memory allocation.

可调用如下命令来销毁图像:

void vkDestroyImage(
    VkDevice                                    device,
    VkImage                                     image,
    const VkAllocationCallbacks*                pAllocator);
  • device 是拥有需被销毁图像的逻辑设备。

  • image 是需被销毁的图像。

  • pAllocator 控制CPU端内存分配,如 内存分配 一章详述。

Valid Usage

  • 所有直接或 通过一个VkImageView引用image的已提交的命令,必须已经完成执行。

  • 若创建图像时 提供了VkAllocationCallbacks,那么在此处必须提供兼容的回调。

  • 若创建图像时没有提供VkAllocationCallbacks,那么pAllocator 必须为 NULL

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • If image is not VK_NULL_HANDLEimage must be a valid VkImage handle

  • If pAllocator is not NULLpAllocator must be a pointer to a valid VkAllocationCallbacks structure

  • If image is a valid handle, it must have been created, allocated, or retrieved from device

Host Synchronization

  • Host access to image must be externally synchronized

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值