复制命令

应用程序可以使用本章中描述的几种方法复制缓冲区和图像数据,具体取决于数据传输的类型。

所有复制命令都被视为同步屏障的“传输”操作。

所有源格式在其格式描述中具有 X 分量的复制命令都将从这些位读取未定义的值。

所有目标格式在其格式描述中具有 X 分量的复制命令都将向这些位写入未定义的值。

在缓冲区之间复制数据

要在缓冲区对象之间复制数据,请调用

// Provided by VK_VERSION_1_0
void vkCmdCopyBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    srcBuffer,
    VkBuffer                                    dstBuffer,
    uint32_t                                    regionCount,
    const VkBufferCopy*                         pRegions);
  • commandBuffer 是将记录命令的命令缓冲区。

  • srcBuffer 是源缓冲区。

  • dstBuffer 是目标缓冲区。

  • regionCount 是要复制的区域数。

  • pRegions 是指向指定要复制的区域的 VkBufferCopy 结构数组的指针。

pRegions 指定的每个源区域都从源缓冲区复制到目标缓冲区的目标区域。如果 srcBuffer 中指定的任何区域在内存中与 dstBuffer 中指定的任何区域重叠,则从这些重叠区域读取的值是未定义的。

有效用法
  • VUID-vkCmdCopyBuffer-commandBuffer-01822
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyBuffer-commandBuffer-01823
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyBuffer-commandBuffer-01824
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是一个不受保护的缓冲区

  • VUID-vkCmdCopyBuffer-srcOffset-00113
    pRegions 的每个元素的 srcOffset 成员必须小于 srcBuffer 的大小

  • VUID-vkCmdCopyBuffer-dstOffset-00114
    pRegions 的每个元素的 dstOffset 成员必须小于 dstBuffer 的大小

  • VUID-vkCmdCopyBuffer-size-00115
    pRegions 的每个元素的 size 成员必须小于或等于 srcBuffer 的大小减去 srcOffset

  • VUID-vkCmdCopyBuffer-size-00116
    pRegions 的每个元素的 size 成员必须小于或等于 dstBuffer 的大小减去 dstOffset

  • VUID-vkCmdCopyBuffer-pRegions-00117
    pRegions 的元素指定的源区域的并集和目标区域的并集必须在内存中不重叠

  • VUID-vkCmdCopyBuffer-srcBuffer-00118
    srcBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_SRC_BIT 使用标志创建

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

  • VUID-vkCmdCopyBuffer-dstBuffer-00120
    dstBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 使用标志创建

  • VUID-vkCmdCopyBuffer-dstBuffer-00121
    如果 dstBuffer 不是稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

有效使用(隐式)
  • VUID-vkCmdCopyBuffer-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyBuffer-srcBuffer-parameter
    srcBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkCmdCopyBuffer-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkCmdCopyBuffer-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效的 VkBufferCopy 结构的数组的有效指针。

  • VUID-vkCmdCopyBuffer-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyBuffer-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyBuffer-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyBuffer-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdCopyBuffer-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-vkCmdCopyBuffer-commonparent
    commandBufferdstBuffersrcBuffer 中的每一个必须已从同一个 VkDevice 创建、分配或检索。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkBufferCopy 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkBufferCopy {
    VkDeviceSize    srcOffset;
    VkDeviceSize    dstOffset;
    VkDeviceSize    size;
} VkBufferCopy;
  • srcOffset 是从 srcBuffer 开头起的起始偏移量(以字节为单位)。

  • dstOffset 是从 dstBuffer 开头起的起始偏移量(以字节为单位)。

  • size 是要复制的字节数。

有效用法
  • VUID-VkBufferCopy-size-01988
    size 必须大于 0

下面定义了复制缓冲区命令的更可扩展的版本。

要在缓冲区对象之间复制数据,请调用

// Provided by VK_VERSION_1_3
void vkCmdCopyBuffer2(
    VkCommandBuffer                             commandBuffer,
    const VkCopyBufferInfo2*                    pCopyBufferInfo);

或等效的命令

// Provided by VK_KHR_copy_commands2
void vkCmdCopyBuffer2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyBufferInfo2*                    pCopyBufferInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pCopyBufferInfo 是指向描述复制参数的 VkCopyBufferInfo2 结构的指针。

pCopyBufferInfo->pRegions 指定的每个源区域都从源缓冲区复制到目标缓冲区的目标区域。如果 pCopyBufferInfo->srcBuffer 中指定的任何区域在内存中与 pCopyBufferInfo->dstBuffer 中指定的任何区域重叠,则从这些重叠区域读取的值是未定义的

有效用法
  • VUID-vkCmdCopyBuffer2-commandBuffer-01822
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyBuffer2-commandBuffer-01823
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyBuffer2-commandBuffer-01824
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是一个不受保护的缓冲区

有效使用(隐式)
  • VUID-vkCmdCopyBuffer2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyBuffer2-pCopyBufferInfo-parameter
    pCopyBufferInfo 必须是指向有效的 VkCopyBufferInfo2 结构的有效指针。

  • VUID-vkCmdCopyBuffer2-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyBuffer2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyBuffer2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyBuffer2-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkCopyBufferInfo2 结构定义为

// Provided by VK_VERSION_1_3
typedef struct VkCopyBufferInfo2 {
    VkStructureType         sType;
    const void*             pNext;
    VkBuffer                srcBuffer;
    VkBuffer                dstBuffer;
    uint32_t                regionCount;
    const VkBufferCopy2*    pRegions;
} VkCopyBufferInfo2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkCopyBufferInfo2 VkCopyBufferInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcBuffer 是源缓冲区。

  • dstBuffer 是目标缓冲区。

  • regionCount 是要复制的区域数。

  • pRegions 是指向指定要复制的区域的 VkBufferCopy2 结构数组的指针。

有效用法
  • VUID-VkCopyBufferInfo2-srcOffset-00113
    pRegions 的每个元素的 srcOffset 成员必须小于 srcBuffer 的大小

  • VUID-VkCopyBufferInfo2-dstOffset-00114
    pRegions 的每个元素的 dstOffset 成员必须小于 dstBuffer 的大小

  • VUID-VkCopyBufferInfo2-size-00115
    pRegions 的每个元素的 size 成员必须小于或等于 srcBuffer 的大小减去 srcOffset

  • VUID-VkCopyBufferInfo2-size-00116
    pRegions 的每个元素的 size 成员必须小于或等于 dstBuffer 的大小减去 dstOffset

  • VUID-VkCopyBufferInfo2-pRegions-00117
    pRegions 的元素指定的源区域的并集和目标区域的并集必须在内存中不重叠

  • VUID-VkCopyBufferInfo2-srcBuffer-00118
    srcBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_SRC_BIT 使用标志创建

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

  • VUID-VkCopyBufferInfo2-dstBuffer-00120
    dstBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 使用标志创建

  • VUID-VkCopyBufferInfo2-dstBuffer-00121
    如果 dstBuffer 不是稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

有效使用(隐式)
  • VUID-VkCopyBufferInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2

  • VUID-VkCopyBufferInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyBufferInfo2-srcBuffer-parameter
    srcBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkCopyBufferInfo2-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkCopyBufferInfo2-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效的 VkBufferCopy2 结构数组的有效指针。

  • VUID-VkCopyBufferInfo2-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkCopyBufferInfo2-commonparent
    dstBuffersrcBuffer必须已从同一个 VkDevice 创建、分配或检索。

VkBufferCopy2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkBufferCopy2 {
    VkStructureType    sType;
    const void*        pNext;
    VkDeviceSize       srcOffset;
    VkDeviceSize       dstOffset;
    VkDeviceSize       size;
} VkBufferCopy2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkBufferCopy2 VkBufferCopy2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcOffset 是从 srcBuffer 开头起的起始偏移量(以字节为单位)。

  • dstOffset 是从 dstBuffer 开头起的起始偏移量(以字节为单位)。

  • size 是要复制的字节数。

有效用法
  • VUID-VkBufferCopy2-size-01988
    size 必须大于 0

有效使用(隐式)
  • VUID-VkBufferCopy2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_COPY_2

  • VUID-VkBufferCopy2-pNext-pNext
    pNext 必须NULL

在图像之间复制数据

要将数据在图像对象之间复制,请调用:

// Provided by VK_VERSION_1_0
void vkCmdCopyImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkImageCopy*                          pRegions);
  • commandBuffer 是将记录命令的命令缓冲区。

  • srcImage 是源图像。

  • srcImageLayout 是源图像子资源的当前布局。

  • dstImage 是目标图像。

  • dstImageLayout 是目标图像子资源的当前布局。

  • regionCount 是要复制的区域数。

  • pRegions 是一个指向 VkImageCopy 结构体数组的指针,该数组指定要复制的区域。

pRegions 指定的每个源区域都从源图像复制到目标图像的目标区域。如果 srcImage 中指定的任何区域在内存中与 dstImage 中指定的任何区域重叠,则从这些重叠区域读取的值是未定义的。如果任何区域访问 dstImage 中的深度方面,并且未启用 VK_EXT_depth_range_unrestricted 扩展,则从范围 [0,1] 之外的 srcBuffer 复制的值将被写入目标图像,作为未定义的值。

多平面图像只能在每个平面的基础上进行复制,并且在复制到或从这些图像复制时,每个区域中使用的子资源必须仅指定一个平面,但是不同的区域可以指定不同的平面。在复制多平面图像的平面时,所考虑的格式是该平面的兼容格式,而不是多平面图像的格式。

如果目标图像的格式与源图像的格式具有不同的块范围(例如,一个是压缩格式),则为每个指定区域的偏移量和范围将根据每个格式的块范围进行缩放以匹配大小。每个图像的复制区域必须与每个维度中的纹素块范围的倍数对齐,但在图像的边缘,区域范围必须与图像的边缘匹配。

图像数据可以在具有不同图像类型的图像之间复制。如果一个图像是 VK_IMAGE_TYPE_3D,而另一个图像是具有多个图层的 VK_IMAGE_TYPE_2D,则每个切片都复制到不同的图层或从不同的图层复制;3D 图像中的 depth 切片对应于 2D 图像中的 layerCount 层,2D 图像的有效 depth1。如果启用了maintenance5功能,则允许所有其他组合,并且其功能就像1D图像是高度为1的2D图像一样。否则,不允许其他图像类型的组合。

有效用法
  • VUID-vkCmdCopyImage-commandBuffer-01825
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdCopyImage-commandBuffer-01826
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdCopyImage-commandBuffer-01827
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

  • VUID-vkCmdCopyImage-commandBuffer-10217
    如果用于创建 commandBuffer 分配来源的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pRegions 的每个元素,其中 srcSubresourceaspectMask 成员为 VK_IMAGE_ASPECT_COLOR_BIT,则 dstSubresourceaspectMask 必须不能为 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdCopyImage-commandBuffer-10218
    如果用于创建 commandBuffer 分配来源的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pRegions 的每个元素,其中 dstSubresourceaspectMask 成员为 VK_IMAGE_ASPECT_COLOR_BIT,则 srcSubresourceaspectMask 必须不能为 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdCopyImage-pRegions-00124
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-vkCmdCopyImage-srcImage-01995
    srcImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

  • VUID-vkCmdCopyImage-srcImageLayout-00128
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-vkCmdCopyImage-srcImageLayout-01917
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdCopyImage-srcImage-09460
    如果 srcImagedstImage 相同,并且 pRegions 的任何元素都包含 srcSubresourcedstSubresource,其匹配的 mipLevel 和重叠的数组层,则 srcImageLayoutdstImageLayout 必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_SHARED_PRESENT_KHR

  • VUID-vkCmdCopyImage-dstImage-01996
    dstImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

  • VUID-vkCmdCopyImage-dstImageLayout-00133
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-vkCmdCopyImage-dstImageLayout-01395
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdCopyImage-srcImage-01548
    如果 srcImagedstImageVkFormat 都不是多平面格式,则 srcImagedstImageVkFormat 必须 尺寸兼容

  • VUID-vkCmdCopyImage-None-01549
    在复制到多平面图像的平面或从其平面复制时,图像和平面的 VkFormat 必须 根据 兼容平面的描述与被复制的平面兼容。

  • VUID-vkCmdCopyImage-srcImage-09247
    如果 srcImagedstImageVkFormat 都是压缩图像格式,则这些格式必须具有相同的纹素块范围。

  • VUID-vkCmdCopyImage-srcImage-00136
    srcImagedstImage 的采样计数必须匹配。

  • VUID-vkCmdCopyImage-srcOffset-01783
    pRegions 的每个元素的 srcOffsetextent 成员必须遵守 commandBuffer 的命令池的队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述。

  • VUID-vkCmdCopyImage-dstOffset-01784
    pRegions 的每个元素的 dstOffsetextent 成员必须遵守 commandBuffer 的命令池的队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述。

  • VUID-vkCmdCopyImage-srcImage-01551
    如果 srcImagedstImage 均不具有多平面图像格式 并且未启用 maintenance8 功能,则对于 pRegions 的每个元素,srcSubresource.aspectMaskdstSubresource.aspectMask 必须匹配。

  • VUID-vkCmdCopyImage-srcSubresource-10214
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 dstSubresource.aspectMask 必须 不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 两者。

  • VUID-vkCmdCopyImage-dstSubresource-10215
    如果 dstSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 srSubresource.aspectMask 必须 不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 两者。

  • VUID-vkCmdCopyImage-srcImage-08713
    如果 srcImage 具有多平面图像格式,则对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 是单个有效的多平面纵横比掩码位。

  • VUID-vkCmdCopyImage-dstImage-08714
    如果 dstImage 具有多平面图像格式,则对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 是单个有效的多平面纵横比掩码位。

  • VUID-vkCmdCopyImage-srcImage-01556
    如果 srcImage 具有多平面图像格式,而 dstImage 不具有多平面图像格式,则对于 pRegions 的每个元素,dstSubresource.aspectMask 必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-vkCmdCopyImage-dstImage-01557
    如果 dstImage 具有多平面图像格式,而 srcImage 不具有多平面图像格式,则对于 pRegions 的每个元素,srcSubresource.aspectMask 必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-vkCmdCopyImage-srcSubresource-10209
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,则必须启用 maintenance8

  • VUID-vkCmdCopyImage-srcSubresource-10210
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则必须启用 maintenance8

  • VUID-vkCmdCopyImage-srcSubresource-10211
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,则 srcImagedstImageVkFormat必须根据兼容的深度/模板和颜色格式列表兼容。

  • VUID-vkCmdCopyImage-srcSubresource-10212
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 srcImagedstImageVkFormat必须根据兼容的深度/模板和颜色格式列表兼容。

  • VUID-vkCmdCopyImage-apiVersion-07932
    如果未启用 VK_KHR_maintenance1 扩展,或者 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 srcImagedstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayerdstSubresource.baseArrayLayer 必须均为 0,并且 srcSubresource.layerCountdstSubresource.layerCount 必须均为 1

  • VUID-vkCmdCopyImage-srcImage-04443
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayer 必须0,并且 srcSubresource.layerCount 必须1

  • VUID-vkCmdCopyImage-dstImage-04444
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,且 dstSubresource.layerCount 必须1

  • VUID-vkCmdCopyImage-aspectMask-00142
    对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 指定 srcImage 中存在的 aspect。

  • VUID-vkCmdCopyImage-aspectMask-00143
    对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 指定 dstImage 中存在的 aspect。

  • VUID-vkCmdCopyImage-srcOffset-00144
    对于 pRegions 的每个元素,srcOffset.x(extent.width + srcOffset.x) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-vkCmdCopyImage-srcOffset-00145
    对于 pRegions 的每个元素,srcOffset.y(extent.height + srcOffset.y) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-vkCmdCopyImage-srcImage-00146
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.y 必须0,且 extent.height 必须1

  • VUID-vkCmdCopyImage-srcOffset-00147
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcOffset.z(extent.depth + srcOffset.z) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的深度。

  • VUID-vkCmdCopyImage-srcImage-01785
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.z 必须0,且 extent.depth 必须1

  • VUID-vkCmdCopyImage-dstImage-01786
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,dstOffset.z 必须0,且 extent.depth 必须1

  • VUID-vkCmdCopyImage-srcImage-01787
    如果 srcImage 的类型为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffset.z 必须0

  • VUID-vkCmdCopyImage-dstImage-01788
    如果 dstImage 的类型为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffset.z 必须0

  • VUID-vkCmdCopyImage-apiVersion-07933
    如果 VK_KHR_maintenance1 扩展未启用,且 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则 srcImagedstImage 必须 具有相同的 VkImageType

  • VUID-vkCmdCopyImage-apiVersion-08969
    如果 VK_KHR_maintenance1 扩展未启用,且 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 srcImagedstImage 的类型为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,extent.depth 必须1

  • VUID-vkCmdCopyImage-srcImage-07743
    如果 srcImagedstImage 具有不同的 VkImageType,且未启用 maintenance5 功能,则其中一个 必须VK_IMAGE_TYPE_3D,另一个 必须VK_IMAGE_TYPE_2D

  • VUID-vkCmdCopyImage-srcImage-08793
    如果 srcImagedstImage 具有相同的 VkImageType,则对于 pRegions 的每个元素,如果 srcSubresourcedstSubresourcelayerCount 成员都不是 VK_REMAINING_ARRAY_LAYERS,则 srcSubresourcedstSubresourcelayerCount 成员 必须 匹配。

  • VUID-vkCmdCopyImage-srcImage-08794
    如果 srcImagedstImage 具有相同的 VkImageType,并且 srcSubresourcedstSubresourcelayerCount 成员之一为 VK_REMAINING_ARRAY_LAYERS,则另一个成员 必须VK_REMAINING_ARRAY_LAYERS 或等于用于创建图像的 VkImageCreateInfoarrayLayers 成员减去 baseArrayLayer

  • VUID-vkCmdCopyImage-srcImage-01790
    如果 srcImagedstImage 的类型均为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,extent.depth 必须1

  • VUID-vkCmdCopyImage-srcImage-01791
    如果 srcImage 的类型为 VK_IMAGE_TYPE_2D,且 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,extent.depth 必须 等于 srcSubresource.layerCount

  • VUID-vkCmdCopyImage-dstImage-01792
    如果 dstImage 的类型为 VK_IMAGE_TYPE_2D,且 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,extent.depth 必须 等于 dstSubresource.layerCount

  • VUID-vkCmdCopyImage-dstOffset-00150
    对于 pRegions 的每个元素,dstOffset.x(extent.width + dstOffset.x) 必须 都大于或等于 0,且小于或等于 dstImage 的指定 dstSubresource 的宽度。

  • VUID-vkCmdCopyImage-dstOffset-00151
    对于 pRegions 中的每个元素,dstOffset.y(extent.height + dstOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度。

  • VUID-vkCmdCopyImage-dstImage-00152
    如果 dstImage 的类型是 VK_IMAGE_TYPE_1D,则对于 pRegions 中的每个元素,dstOffset.y 必须0,且 extent.height 必须1

  • VUID-vkCmdCopyImage-dstOffset-00153
    如果 dstImage 的类型是 VK_IMAGE_TYPE_3D,则对于 pRegions 中的每个元素,dstOffset.z(extent.depth + dstOffset.z) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的深度。

  • VUID-vkCmdCopyImage-pRegions-07278
    对于 pRegions 中的每个元素,srcOffset.x 必须srcImage纹素块范围宽度的倍数,该宽度由 srcImageVkFormat 指定。

  • VUID-vkCmdCopyImage-pRegions-07279
    对于 pRegions 中的每个元素,srcOffset.y 必须srcImage纹素块范围高度的倍数,该高度由 srcImageVkFormat 指定。

  • VUID-vkCmdCopyImage-pRegions-07280
    对于 pRegions 中的每个元素,srcOffset.z 必须srcImage纹素块范围深度的倍数,该深度由 srcImageVkFormat 指定。

  • VUID-vkCmdCopyImage-pRegions-07281
    对于 pRegions 中的每个元素,dstOffset.x 必须dstImage纹素块范围宽度的倍数,该宽度由 dstImageVkFormat 指定。

  • VUID-vkCmdCopyImage-pRegions-07282
    对于 pRegions 中的每个元素,dstOffset.y 必须dstImage纹素块范围高度的倍数,该高度由 dstImageVkFormat 指定。

  • VUID-vkCmdCopyImage-pRegions-07283
    对于 pRegions 中的每个元素,dstOffset.z 必须dstImage纹素块范围深度的倍数,该深度由 dstImageVkFormat 指定。

  • VUID-vkCmdCopyImage-srcImage-01728
    对于 pRegions 中的每个元素,如果 srcOffset.xextent.width 的总和不等于 srcSubresource 指定的子资源的宽度,则 extent.width 必须srcImage纹素块范围宽度的倍数,该宽度由 srcImageVkFormat 指定。

  • VUID-vkCmdCopyImage-srcImage-01729
    对于 pRegions 中的每个元素,如果 srcOffset.yextent.height 的总和不等于 srcSubresource 指定的子资源的高度,则 extent.height 必须srcImage纹素块范围高度的倍数,该高度由 srcImageVkFormat 指定。

  • VUID-vkCmdCopyImage-srcImage-01730
    对于 pRegions 中的每个元素,如果 srcOffset.zextent.depth 的总和不等于 srcSubresource 指定的子资源的深度,则 extent.depth 必须srcImage纹素块范围深度的倍数,该深度由 srcImageVkFormat 指定。

  • VUID-vkCmdCopyImage-dstImage-01732
    对于 pRegions 中的每个元素,如果 dstOffset.xextent.width 的总和不等于 dstSubresource 指定的子资源的宽度,则 extent.width 必须dstImage纹素块范围宽度的倍数,该宽度由 dstImageVkFormat 指定。

  • VUID-vkCmdCopyImage-dstImage-01733
    对于 pRegions 中的每个元素,如果 dstOffset.yextent.height 的总和不等于 dstSubresource 指定的子资源的高度,则 extent.height 必须dstImage纹素块范围高度的倍数,该高度由 dstImageVkFormat 指定。

  • VUID-vkCmdCopyImage-dstImage-01734
    对于 pRegions 中的每个元素,如果 dstOffset.zextent.depth 的总和不等于 dstSubresource 指定的子资源的深度,则 extent.depth 必须dstImage纹素块范围深度的倍数,该深度由 dstImageVkFormat 指定。

  • VUID-vkCmdCopyImage-aspect-06662
    如果 pRegions 的任何元素的 aspect 成员包含除 VK_IMAGE_ASPECT_STENCIL_BIT 之外的任何标志,或者 srcImage 不是使用 单独的模板使用 创建的,则 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 必须已包含在用于创建 srcImageVkImageCreateInfo::usage 中。

  • VUID-vkCmdCopyImage-aspect-06663
    如果 pRegions 的任何元素的 aspect 成员包含除 VK_IMAGE_ASPECT_STENCIL_BIT 之外的任何标志,或者 dstImage 不是使用 单独的模板使用 创建的,则 VK_IMAGE_USAGE_TRANSFER_DST_BIT 必须已包含在用于创建 dstImageVkImageCreateInfo::usage 中。

  • VUID-vkCmdCopyImage-aspect-06664
    如果 pRegions 中任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,且 srcImage 是使用独立的模板使用创建的,则在用于创建 srcImageVkImageStencilUsageCreateInfo::stencilUsage必须包含 VK_IMAGE_USAGE_TRANSFER_SRC_BIT

  • VUID-vkCmdCopyImage-aspect-06665
    如果 pRegions 中任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,且 dstImage 是使用独立的模板使用创建的,则在用于创建 dstImageVkImageStencilUsageCreateInfo::stencilUsage必须包含 VK_IMAGE_USAGE_TRANSFER_DST_BIT

  • VUID-vkCmdCopyImage-srcImage-07966
    如果 srcImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdCopyImage-srcSubresource-07967
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdCopyImage-srcSubresource-07968
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdCopyImage-srcImage-07969
    创建 srcImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-vkCmdCopyImage-dstImage-07966
    如果 dstImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdCopyImage-dstSubresource-07967
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdCopyImage-dstSubresource-07968
    如果 dstSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须小于或等于创建 dstImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdCopyImage-dstImage-07969
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

有效使用(隐式)
  • VUID-vkCmdCopyImage-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyImage-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdCopyImage-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdCopyImage-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdCopyImage-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdCopyImage-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效 VkImageCopy 结构的有效指针数组。

  • VUID-vkCmdCopyImage-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyImage-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyImage-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyImage-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdCopyImage-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-vkCmdCopyImage-commonparent
    commandBufferdstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkImageCopy 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkImageCopy {
    VkImageSubresourceLayers    srcSubresource;
    VkOffset3D                  srcOffset;
    VkImageSubresourceLayers    dstSubresource;
    VkOffset3D                  dstOffset;
    VkExtent3D                  extent;
} VkImageCopy;
  • srcSubresourcedstSubresourceVkImageSubresourceLayers 结构,分别指定用于源和目标图像数据的图像子资源。

  • srcOffsetdstOffset 选择源和目标图像数据子区域中纹素的初始 xyz 偏移量。

  • extent 是要复制的图像的纹素大小,包括 widthheightdepth

有效用法
  • VUID-VkImageCopy-apiVersion-07940
    如果未启用 VK_KHR_sampler_ycbcr_conversion 扩展,并且VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则 srcSubresourcedstSubresourceaspectMask 成员必须匹配。

  • VUID-VkImageCopy-apiVersion-07941
    如果未启用 VK_KHR_maintenance1 扩展,并且VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则 srcSubresourcedstSubresourcelayerCount 成员必须匹配。

  • VUID-VkImageCopy-extent-06668
    extent.width 必须不为 0。

  • VUID-VkImageCopy-extent-06669
    extent.height 必须 不为 0

  • VUID-VkImageCopy-extent-06670
    extent.depth 必须 不为 0

有效使用(隐式)

VkImageSubresourceLayers 结构体定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkImageSubresourceLayers {
    VkImageAspectFlags    aspectMask;
    uint32_t              mipLevel;
    uint32_t              baseArrayLayer;
    uint32_t              layerCount;
} VkImageSubresourceLayers;
  • aspectMaskVkImageAspectFlagBits 的组合,用于选择要复制的颜色、深度和/或模板方面。

  • mipLevel 是要复制的 mipmap 级别

  • baseArrayLayerlayerCount 是要复制的起始层和层数。

有效用法
  • VUID-VkImageSubresourceLayers-aspectMask-00167
    如果 aspectMask 包含 VK_IMAGE_ASPECT_COLOR_BIT,则它必须不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 中的任何一个

  • VUID-VkImageSubresourceLayers-aspectMask-00168
    aspectMask 必须 不包含 VK_IMAGE_ASPECT_METADATA_BIT

  • VUID-VkImageSubresourceLayers-aspectMask-02247
    aspectMask 必须 不包含任何索引 iVK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT

  • VUID-VkImageSubresourceLayers-layerCount-09243
    如果 maintenance5 功能未启用,则 layerCount 必须 不为 VK_REMAINING_ARRAY_LAYERS

  • VUID-VkImageSubresourceLayers-layerCount-01700
    如果 layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则它必须大于 0

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

  • VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask
    aspectMask 必须 不为 0

下面定义了复制图像命令的更可扩展版本。

要将数据在图像对象之间复制,请调用:

// Provided by VK_VERSION_1_3
void vkCmdCopyImage2(
    VkCommandBuffer                             commandBuffer,
    const VkCopyImageInfo2*                     pCopyImageInfo);

或等效的命令

// Provided by VK_KHR_copy_commands2
void vkCmdCopyImage2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyImageInfo2*                     pCopyImageInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pCopyImageInfo 是指向 VkCopyImageInfo2 结构体的指针,该结构体描述了复制参数。

此命令在功能上与 vkCmdCopyImage 相同,但包含可扩展的子结构,其中包括 sTypepNext 参数,从而可以更轻松地进行扩展。

有效用法
  • VUID-vkCmdCopyImage2-commandBuffer-01825
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdCopyImage2-commandBuffer-01826
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdCopyImage2-commandBuffer-01827
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

  • VUID-vkCmdCopyImage2-commandBuffer-10217
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pCopyImageInfo->pRegions 的每个元素,其中 srcSubresourceaspectMask 成员为 VK_IMAGE_ASPECT_COLOR_BIT,则 dstSubresourceaspectMask 必须 不为 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdCopyImage2-commandBuffer-10218
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pCopyImageInfo->pRegions 的每个元素,其中 dstSubresourceaspectMask 成员为 VK_IMAGE_ASPECT_COLOR_BIT,则 srcSubresourceaspectMask 必须 不为 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

有效使用(隐式)
  • VUID-vkCmdCopyImage2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyImage2-pCopyImageInfo-parameter
    pCopyImageInfo 必须 是指向有效 VkCopyImageInfo2 结构体的有效指针

  • VUID-vkCmdCopyImage2-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyImage2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyImage2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyImage2-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkCopyImageInfo2 结构体定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkCopyImageInfo2 {
    VkStructureType        sType;
    const void*            pNext;
    VkImage                srcImage;
    VkImageLayout          srcImageLayout;
    VkImage                dstImage;
    VkImageLayout          dstImageLayout;
    uint32_t               regionCount;
    const VkImageCopy2*    pRegions;
} VkCopyImageInfo2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkCopyImageInfo2 VkCopyImageInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcImage 是源图像。

  • srcImageLayout 是源图像子资源的当前布局。

  • dstImage 是目标图像。

  • dstImageLayout 是目标图像子资源的当前布局。

  • regionCount 是要复制的区域数。

  • pRegions 是指向 VkImageCopy2 结构体数组的指针,该数组指定要复制的区域。

有效用法
  • VUID-VkCopyImageInfo2-pRegions-00124
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-VkCopyImageInfo2-srcImage-01995
    srcImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

  • VUID-VkCopyImageInfo2-srcImageLayout-00128
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-VkCopyImageInfo2-srcImageLayout-01917
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkCopyImageInfo2-srcImage-09460
    如果 srcImagedstImage 相同,并且 pRegions 的任何元素都包含 srcSubresourcedstSubresource,其匹配的 mipLevel 和重叠的数组层,则 srcImageLayoutdstImageLayout 必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_SHARED_PRESENT_KHR

  • VUID-VkCopyImageInfo2-dstImage-01996
    dstImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

  • VUID-VkCopyImageInfo2-dstImageLayout-00133
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-VkCopyImageInfo2-dstImageLayout-01395
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkCopyImageInfo2-srcImage-01548
    如果 srcImagedstImageVkFormat 都不是多平面格式,则 srcImagedstImageVkFormat 必须 尺寸兼容

  • VUID-VkCopyImageInfo2-None-01549
    在复制到多平面图像的平面或从其平面复制时,图像和平面的 VkFormat 必须 根据 兼容平面的描述与被复制的平面兼容。

  • VUID-VkCopyImageInfo2-srcImage-09247
    如果 srcImagedstImageVkFormat 都是压缩图像格式,则这些格式必须具有相同的纹素块范围。

  • VUID-VkCopyImageInfo2-srcImage-00136
    srcImagedstImage 的采样计数必须匹配。

  • VUID-VkCopyImageInfo2-srcOffset-01783
    pRegions 的每个元素的 srcOffsetextent 成员必须遵守 commandBuffer 的命令池的队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述。

  • VUID-VkCopyImageInfo2-dstOffset-01784
    pRegions 的每个元素的 dstOffsetextent 成员必须遵守 commandBuffer 的命令池的队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述。

  • VUID-VkCopyImageInfo2-srcImage-01551
    如果 srcImagedstImage 均不具有多平面图像格式 并且未启用 maintenance8 功能,则对于 pRegions 的每个元素,srcSubresource.aspectMaskdstSubresource.aspectMask 必须匹配。

  • VUID-VkCopyImageInfo2-srcSubresource-10214
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 dstSubresource.aspectMask 必须 不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 两者。

  • VUID-VkCopyImageInfo2-dstSubresource-10215
    如果 dstSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 srSubresource.aspectMask 必须 不包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 两者。

  • VUID-VkCopyImageInfo2-srcImage-08713
    如果 srcImage 具有多平面图像格式,则对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 是单个有效的多平面纵横比掩码位。

  • VUID-VkCopyImageInfo2-dstImage-08714
    如果 dstImage 具有多平面图像格式,则对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 是单个有效的多平面纵横比掩码位。

  • VUID-VkCopyImageInfo2-srcImage-01556
    如果 srcImage 具有多平面图像格式,而 dstImage 不具有多平面图像格式,则对于 pRegions 的每个元素,dstSubresource.aspectMask 必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkCopyImageInfo2-dstImage-01557
    如果 dstImage 具有多平面图像格式,而 srcImage 不具有多平面图像格式,则对于 pRegions 的每个元素,srcSubresource.aspectMask 必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkCopyImageInfo2-srcSubresource-10209
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,则必须启用 maintenance8

  • VUID-VkCopyImageInfo2-srcSubresource-10210
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则必须启用 maintenance8

  • VUID-VkCopyImageInfo2-srcSubresource-10211
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,则 srcImagedstImageVkFormat必须根据兼容的深度/模板和颜色格式列表兼容。

  • VUID-VkCopyImageInfo2-srcSubresource-10212
    如果 srcSubresource.aspectMaskVK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT,并且 dstSubresource.aspectMaskVK_IMAGE_ASPECT_COLOR_BIT,则 srcImagedstImageVkFormat必须根据兼容的深度/模板和颜色格式列表兼容。

  • VUID-VkCopyImageInfo2-apiVersion-07932
    如果未启用 VK_KHR_maintenance1 扩展,或者 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 srcImagedstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayerdstSubresource.baseArrayLayer 必须均为 0,并且 srcSubresource.layerCountdstSubresource.layerCount 必须均为 1

  • VUID-VkCopyImageInfo2-srcImage-04443
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayer 必须0,并且 srcSubresource.layerCount 必须1

  • VUID-VkCopyImageInfo2-dstImage-04444
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,且 dstSubresource.layerCount 必须1

  • VUID-VkCopyImageInfo2-aspectMask-00142
    对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 指定 srcImage 中存在的 aspect。

  • VUID-VkCopyImageInfo2-aspectMask-00143
    对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 指定 dstImage 中存在的 aspect。

  • VUID-VkCopyImageInfo2-srcOffset-00144
    对于 pRegions 的每个元素,srcOffset.x(extent.width + srcOffset.x) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-VkCopyImageInfo2-srcOffset-00145
    对于 pRegions 的每个元素,srcOffset.y(extent.height + srcOffset.y) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-VkCopyImageInfo2-srcImage-00146
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.y 必须0,且 extent.height 必须1

  • VUID-VkCopyImageInfo2-srcOffset-00147
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcOffset.z(extent.depth + srcOffset.z) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的深度。

  • VUID-VkCopyImageInfo2-srcImage-01785
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.z 必须0,且 extent.depth 必须1

  • VUID-VkCopyImageInfo2-dstImage-01786
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,dstOffset.z 必须0,且 extent.depth 必须1

  • VUID-VkCopyImageInfo2-srcImage-01787
    如果 srcImage 的类型为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffset.z 必须0

  • VUID-VkCopyImageInfo2-dstImage-01788
    如果 dstImage 的类型为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffset.z 必须0

  • VUID-VkCopyImageInfo2-apiVersion-07933
    如果 VK_KHR_maintenance1 扩展未启用,且 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则 srcImagedstImage 必须 具有相同的 VkImageType

  • VUID-VkCopyImageInfo2-apiVersion-08969
    如果 VK_KHR_maintenance1 扩展未启用,且 VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,并且 srcImagedstImage 的类型为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,extent.depth 必须1

  • VUID-VkCopyImageInfo2-srcImage-07743
    如果 srcImagedstImage 具有不同的 VkImageType,且未启用 maintenance5 功能,则其中一个 必须VK_IMAGE_TYPE_3D,另一个 必须VK_IMAGE_TYPE_2D

  • VUID-VkCopyImageInfo2-srcImage-08793
    如果 srcImagedstImage 具有相同的 VkImageType,则对于 pRegions 的每个元素,如果 srcSubresourcedstSubresourcelayerCount 成员都不是 VK_REMAINING_ARRAY_LAYERS,则 srcSubresourcedstSubresourcelayerCount 成员 必须 匹配。

  • VUID-VkCopyImageInfo2-srcImage-08794
    如果 srcImagedstImage 具有相同的 VkImageType,并且 srcSubresourcedstSubresourcelayerCount 成员之一为 VK_REMAINING_ARRAY_LAYERS,则另一个成员 必须VK_REMAINING_ARRAY_LAYERS 或等于用于创建图像的 VkImageCreateInfoarrayLayers 成员减去 baseArrayLayer

  • VUID-VkCopyImageInfo2-srcImage-01790
    如果 srcImagedstImage 的类型均为 VK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,extent.depth 必须1

  • VUID-VkCopyImageInfo2-srcImage-01791
    如果 srcImage 的类型为 VK_IMAGE_TYPE_2D,且 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,extent.depth 必须 等于 srcSubresource.layerCount

  • VUID-VkCopyImageInfo2-dstImage-01792
    如果 dstImage 的类型为 VK_IMAGE_TYPE_2D,且 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,extent.depth 必须 等于 dstSubresource.layerCount

  • VUID-VkCopyImageInfo2-dstOffset-00150
    对于 pRegions 的每个元素,dstOffset.x(extent.width + dstOffset.x) 必须 都大于或等于 0,且小于或等于 dstImage 的指定 dstSubresource 的宽度。

  • VUID-VkCopyImageInfo2-dstOffset-00151
    对于 pRegions 中的每个元素,dstOffset.y(extent.height + dstOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度。

  • VUID-VkCopyImageInfo2-dstImage-00152
    如果 dstImage 的类型是 VK_IMAGE_TYPE_1D,则对于 pRegions 中的每个元素,dstOffset.y 必须0,且 extent.height 必须1

  • VUID-VkCopyImageInfo2-dstOffset-00153
    如果 dstImage 的类型是 VK_IMAGE_TYPE_3D,则对于 pRegions 中的每个元素,dstOffset.z(extent.depth + dstOffset.z) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的深度。

  • VUID-VkCopyImageInfo2-pRegions-07278
    对于 pRegions 中的每个元素,srcOffset.x 必须srcImage纹素块范围宽度的倍数,该宽度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-pRegions-07279
    对于 pRegions 中的每个元素,srcOffset.y 必须srcImage纹素块范围高度的倍数,该高度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-pRegions-07280
    对于 pRegions 中的每个元素,srcOffset.z 必须srcImage纹素块范围深度的倍数,该深度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-pRegions-07281
    对于 pRegions 中的每个元素,dstOffset.x 必须dstImage纹素块范围宽度的倍数,该宽度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-pRegions-07282
    对于 pRegions 中的每个元素,dstOffset.y 必须dstImage纹素块范围高度的倍数,该高度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-pRegions-07283
    对于 pRegions 中的每个元素,dstOffset.z 必须dstImage纹素块范围深度的倍数,该深度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-srcImage-01728
    对于 pRegions 中的每个元素,如果 srcOffset.xextent.width 的总和不等于 srcSubresource 指定的子资源的宽度,则 extent.width 必须srcImage纹素块范围宽度的倍数,该宽度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-srcImage-01729
    对于 pRegions 中的每个元素,如果 srcOffset.yextent.height 的总和不等于 srcSubresource 指定的子资源的高度,则 extent.height 必须srcImage纹素块范围高度的倍数,该高度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-srcImage-01730
    对于 pRegions 中的每个元素,如果 srcOffset.zextent.depth 的总和不等于 srcSubresource 指定的子资源的深度,则 extent.depth 必须srcImage纹素块范围深度的倍数,该深度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-dstImage-01732
    对于 pRegions 中的每个元素,如果 dstOffset.xextent.width 的总和不等于 dstSubresource 指定的子资源的宽度,则 extent.width 必须dstImage纹素块范围宽度的倍数,该宽度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-dstImage-01733
    对于 pRegions 中的每个元素,如果 dstOffset.yextent.height 的总和不等于 dstSubresource 指定的子资源的高度,则 extent.height 必须dstImage纹素块范围高度的倍数,该高度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-dstImage-01734
    对于 pRegions 中的每个元素,如果 dstOffset.zextent.depth 的总和不等于 dstSubresource 指定的子资源的深度,则 extent.depth 必须dstImage纹素块范围深度的倍数,该深度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageInfo2-aspect-06662
    如果 pRegions 的任何元素的 aspect 成员包含除 VK_IMAGE_ASPECT_STENCIL_BIT 之外的任何标志,或者 srcImage 不是使用 单独的模板使用 创建的,则 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 必须已包含在用于创建 srcImageVkImageCreateInfo::usage 中。

  • VUID-VkCopyImageInfo2-aspect-06663
    如果 pRegions 的任何元素的 aspect 成员包含除 VK_IMAGE_ASPECT_STENCIL_BIT 之外的任何标志,或者 dstImage 不是使用 单独的模板使用 创建的,则 VK_IMAGE_USAGE_TRANSFER_DST_BIT 必须已包含在用于创建 dstImageVkImageCreateInfo::usage 中。

  • VUID-VkCopyImageInfo2-aspect-06664
    如果 pRegions 中任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,且 srcImage 是使用独立的模板使用创建的,则在用于创建 srcImageVkImageStencilUsageCreateInfo::stencilUsage必须包含 VK_IMAGE_USAGE_TRANSFER_SRC_BIT

  • VUID-VkCopyImageInfo2-aspect-06665
    如果 pRegions 中任何元素的 aspect 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,且 dstImage 是使用独立的模板使用创建的,则在用于创建 dstImageVkImageStencilUsageCreateInfo::stencilUsage必须包含 VK_IMAGE_USAGE_TRANSFER_DST_BIT

  • VUID-VkCopyImageInfo2-srcImage-07966
    如果 srcImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageInfo2-srcSubresource-07967
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyImageInfo2-srcSubresource-07968
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyImageInfo2-srcImage-07969
    创建 srcImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyImageInfo2-dstImage-07966
    如果 dstImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageInfo2-dstSubresource-07967
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyImageInfo2-dstSubresource-07968
    如果 dstSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须小于或等于创建 dstImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyImageInfo2-dstImage-07969
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

有效使用(隐式)
  • VUID-VkCopyImageInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2

  • VUID-VkCopyImageInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyImageInfo2-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyImageInfo2-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyImageInfo2-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyImageInfo2-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyImageInfo2-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效 VkImageCopy2 结构体数组的有效指针

  • VUID-VkCopyImageInfo2-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkCopyImageInfo2-commonparent
    dstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

VkImageCopy2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkImageCopy2 {
    VkStructureType             sType;
    const void*                 pNext;
    VkImageSubresourceLayers    srcSubresource;
    VkOffset3D                  srcOffset;
    VkImageSubresourceLayers    dstSubresource;
    VkOffset3D                  dstOffset;
    VkExtent3D                  extent;
} VkImageCopy2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkImageCopy2 VkImageCopy2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcSubresourcedstSubresourceVkImageSubresourceLayers 结构,分别指定用于源和目标图像数据的图像子资源。

  • srcOffsetdstOffset 选择源和目标图像数据子区域中纹素的初始 xyz 偏移量。

  • extent 是要复制的图像的纹素大小,包括 widthheightdepth

有效用法
  • VUID-VkImageCopy2-apiVersion-07940
    如果未启用 VK_KHR_sampler_ycbcr_conversion 扩展,并且VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则 srcSubresourcedstSubresourceaspectMask 成员必须匹配。

  • VUID-VkImageCopy2-apiVersion-07941
    如果未启用 VK_KHR_maintenance1 扩展,并且VkPhysicalDeviceProperties::apiVersion 小于 Vulkan 1.1,则 srcSubresourcedstSubresourcelayerCount 成员必须匹配。

  • VUID-VkImageCopy2-extent-06668
    extent.width 必须不为 0。

  • VUID-VkImageCopy2-extent-06669
    extent.height 必须 不为 0

  • VUID-VkImageCopy2-extent-06670
    extent.depth 必须 不为 0

有效使用(隐式)
  • VUID-VkImageCopy2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_COPY_2

  • VUID-VkImageCopy2-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageCopy2-srcSubresource-parameter
    srcSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

  • VUID-VkImageCopy2-dstSubresource-parameter
    dstSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

在缓冲区和图像之间复制数据

数据可以在缓冲区和图像之间复制,使应用程序能够在图像和缓冲区内存中应用程序定义的偏移量之间加载和存储数据。

在缓冲区和图像之间复制时,图像中的纹素和缓冲区中的字节按如下方式访问。

在图像子资源中,访问每个坐标 (x,y,z,layer) 的纹素,其中

x 的范围为 [imageOffset.x, imageOffset.x + imageExtent.width)

y 的范围为 [imageOffset.y, imageOffset.y + imageExtent.height)

z 的范围为 [imageOffset.z, imageOffset.z + imageExtent.depth)

layer 的范围为 [imageSubresource.baseArrayLayer, imageSubresource.baseArrayLayer + imageSubresource.layerCount)

对于图像中的每个坐标 (x,y,z,layer),访问缓冲区中偏移量范围为 [texelOffset, texelOffset + blockSize) 的字节,其中

texelOffset = bufferOffset + (⌊(x - imageOffset.x) / blockWidth⌋ × blockSize) + (⌊(y - imageOffset.y) / blockHeight⌋ × rowExtent) + (⌊(z - imageOffset.z) / blockDepth⌋ × sliceExtent) + ((layer - imageSubresource.baseArrayLayer) × layerExtent)

rowExtent = ⌈ max(bufferRowLength, imageExtent.width) / blockWidth ⌉ × blockSize

sliceExtent = ⌈ max(bufferImageHeight, imageExtent.height) / blockHeight ⌉ × rowExtent

layerExtent = ⌈ imageExtent.depth / blockDepth ⌉ × sliceExtent

其中 blockSizeblockWidthblockHeightblockDepth 是图像格式的纹素块大小和范围

图像旋转寻址

如果 VkCopyCommandTransformInfoQCOM 指定了旋转,则围绕偏移量旋转正在寻址的图像的 2D 区域,并在图像子资源中访问每个坐标 (x',y',z',layer) 的纹素,其中

  • 如果指定了 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,则不执行旋转

    x'x 的范围相同

    y'y 的范围相同

  • 如果指定了 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR

    x' 的范围为 [imageOffset.x - imageExtent.height, imageOffset.x)

    y' 的范围为 [imageOffset.y, imageOffset.y + imageExtent.width)

  • 如果指定了 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR

    x' 的范围为 [imageOffset.x - imageExtent.width, imageOffset.x)

    y' 的范围为 [imageOffset.y - imageExtent.height, imageOffset.y)

  • 如果指定了 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR

    x' 的范围为 [imageOffset.x, imageOffset.x + imageExtent.height)

    y' 的范围为 [imageOffset.y - imageExtent.width, imageOffset.y)

缓冲区寻址计算不受此旋转的影响。

当在缓冲区和图像的深度或模板方面之间复制时,假定缓冲区中的数据以单独的平面而不是交错的方式排列。因此,根据方面,为与基本图像不同的格式执行寻址计算,如下表所述

表 1. 深度/模板方面复制表
基本格式 深度方面格式 模板方面格式

VK_FORMAT_D16_UNORM

VK_FORMAT_D16_UNORM

-

VK_FORMAT_X8_D24_UNORM_PACK32

VK_FORMAT_X8_D24_UNORM_PACK32

-

VK_FORMAT_D32_SFLOAT

VK_FORMAT_D32_SFLOAT

-

VK_FORMAT_S8_UINT

-

VK_FORMAT_S8_UINT

VK_FORMAT_D16_UNORM_S8_UINT

VK_FORMAT_D16_UNORM

VK_FORMAT_S8_UINT

VK_FORMAT_D24_UNORM_S8_UINT

VK_FORMAT_X8_D24_UNORM_PACK32

VK_FORMAT_S8_UINT

VK_FORMAT_D32_SFLOAT_S8_UINT

VK_FORMAT_D32_SFLOAT

VK_FORMAT_S8_UINT

当在缓冲区和多平面图像的任何平面之间复制时,寻址计算使用该平面的兼容格式执行,而不是使用多平面图像的格式。

每个纹素块根据上述寻址公式从一个资源复制到另一个资源。

要将数据从缓冲区对象复制到图像对象,请调用

// Provided by VK_VERSION_1_0
void vkCmdCopyBufferToImage(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    srcBuffer,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkBufferImageCopy*                    pRegions);
  • commandBuffer 是将记录命令的命令缓冲区。

  • srcBuffer 是源缓冲区。

  • dstImage 是目标图像。

  • dstImageLayout 是用于复制的目标图像子资源的布局。

  • regionCount 是要复制的区域数。

  • pRegions 是指向 VkBufferImageCopy 结构数组的指针,该结构指定要复制的区域。

根据每个资源的寻址计算,从源缓冲区将 pRegions 指定的每个源区域复制到目标图像的目标区域。如果 srcBuffer 中指定的任何区域与 dstImage 中指定的任何区域在内存中重叠,则从这些重叠区域读取的值是未定义的。如果任何区域访问 dstImage 中的深度方面,并且未启用 VK_EXT_depth_range_unrestricted 扩展,则从 srcBuffer 复制的范围 [0,1] 之外的值将作为未定义的值写入目标图像。

图像的复制区域必须在每个维度上与纹素块范围的倍数对齐,但图像边缘除外,在图像边缘,区域范围必须与图像边缘匹配。

有效用法
  • VUID-vkCmdCopyBufferToImage-dstImage-07966
    如果 dstImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdCopyBufferToImage-imageSubresource-07967
    pRegions 的每个元素的 imageSubresource.mipLevel 成员必须小于创建 dstImageVkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdCopyBufferToImage-imageSubresource-07968
    如果 imageSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 imageSubresource.baseArrayLayer + imageSubresource.layerCount必须小于或等于创建 dstImageVkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdCopyBufferToImage-dstImage-07969
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-vkCmdCopyBufferToImage-imageSubresource-07970
    pRegions 的每个元素指定的图像区域必须包含在 dstImage 的指定 imageSubresource

  • VUID-vkCmdCopyBufferToImage-imageSubresource-07971
    对于 pRegions 的每个元素,imageOffset.x(imageExtent.width + imageOffset.x) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的宽度

  • VUID-vkCmdCopyBufferToImage-imageSubresource-07972
    对于 pRegions 的每个元素,imageOffset.y(imageExtent.height + imageOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的高度

  • VUID-vkCmdCopyBufferToImage-dstImage-07973
    dstImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-vkCmdCopyBufferToImage-commandBuffer-01828
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyBufferToImage-commandBuffer-01829
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdCopyBufferToImage-commandBuffer-01830
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

  • VUID-vkCmdCopyBufferToImage-commandBuffer-07737
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 pRegions 的任何元素的 bufferOffset 成员必须4 的倍数

  • VUID-vkCmdCopyBufferToImage-imageOffset-07738
    pRegions 的每个元素的 imageOffsetimageExtent 成员必须符合 commandBuffer 的命令池队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述

  • VUID-vkCmdCopyBufferToImage-commandBuffer-07739
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pRegions 的每个元素,imageSubresourceaspectMask 成员不能VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdCopyBufferToImage-pRegions-00171
    对于 pRegions 的每个元素,srcBuffer 的大小必须足以包含根据 缓冲区和图像寻址访问的所有缓冲区位置

  • VUID-vkCmdCopyBufferToImage-pRegions-00173
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-vkCmdCopyBufferToImage-srcBuffer-00174
    srcBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-vkCmdCopyBufferToImage-dstImage-01997
    dstImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

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

  • VUID-vkCmdCopyBufferToImage-dstImage-00177
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

  • VUID-vkCmdCopyBufferToImage-dstImageLayout-00180
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-vkCmdCopyBufferToImage-dstImageLayout-01396
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdCopyBufferToImage-pRegions-07931
    如果未启用 VK_EXT_depth_range_unrestricted,则对于 pRegions 的每个 imageSubresource 包含深度方面的元素,srcBuffer 中的数据必须[0,1] 范围内

  • VUID-vkCmdCopyBufferToImage-dstImage-07979
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,imageOffset.y 必须0,并且 imageExtent.height 必须1

  • VUID-vkCmdCopyBufferToImage-imageOffset-09104
    对于 pRegions 的每个元素,imageOffset.z(imageExtent.depth + imageOffset.z) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的深度

  • VUID-vkCmdCopyBufferToImage-dstImage-07980
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,imageOffset.z 必须0,并且 imageExtent.depth 必须1

  • VUID-vkCmdCopyBufferToImage-dstImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数

  • VUID-vkCmdCopyBufferToImage-imageOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.x 不等于 imageSubresource 指定的子资源的宽度,则 imageOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数

  • VUID-vkCmdCopyBufferToImage-dstImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.y 必须dstImageVkFormat纹素块范围高度的倍数

  • VUID-vkCmdCopyBufferToImage-imageOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,并且 imageOffset.y 不等于 imageSubresource 指定的子资源的高度,则 imageOffset.y 必须dstImageVkFormat纹素块范围高度的倍数

  • VUID-vkCmdCopyBufferToImage-dstImage-07276
    对于 pRegions 的每个元素,imageOffset.z 必须dstImageVkFormat纹素块范围深度的倍数

  • VUID-vkCmdCopyBufferToImage-dstImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.xextent.width 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.width **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.xextent.height 的差值**必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.xextent.width 的差值**必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 imageOffset.xextent.height 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.height **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-vkCmdCopyBufferToImage-dstImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.yextent.height 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.height **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.yextent.width 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.width **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.yextent.height 的差值**必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.yextent.width 的差值**必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-vkCmdCopyBufferToImage-dstImage-00209
    对于 pRegions 的每个元素,如果 imageOffset.zextent.depth 的总和不等于 srcSubresource 指定的子资源的深度,则 extent.depth **必须**是 dstImageVkFormat纹素块扩展深度 的倍数。

  • VUID-vkCmdCopyBufferToImage-imageSubresource-09105
    对于 pRegions 的每个元素,imageSubresource.aspectMask **必须**指定 dstImage 中存在的方面。

  • VUID-vkCmdCopyBufferToImage-dstImage-07981
    如果 dstImage 具有多平面图像格式,则对于 pRegions 的每个元素,imageSubresource.aspectMask **必须**是单个有效的多平面方面掩码位。

  • VUID-vkCmdCopyBufferToImage-dstImage-07983
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,imageSubresource.baseArrayLayer **必须**为 0,并且 imageSubresource.layerCount **必须**为 1

  • VUID-vkCmdCopyBufferToImage-bufferRowLength-09106
    对于 pRegions 的每个元素,bufferRowLength **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-vkCmdCopyBufferToImage-bufferImageHeight-09107
    对于 pRegions 的每个元素,bufferImageHeight **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-vkCmdCopyBufferToImage-bufferRowLength-09108
    对于 pRegions 的每个元素,bufferRowLength 除以纹素块扩展宽度,然后乘以 dstImage 的纹素块大小,**必须**小于或等于231-1

  • VUID-vkCmdCopyBufferToImage-dstImage-07975
    如果 dstImage 没有深度/模板格式或多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须纹素块大小的倍数

  • VUID-vkCmdCopyBufferToImage-dstImage-07976
    如果 dstImage 具有多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须是格式的兼容格式的元素大小的倍数,并且 imageSubresourceaspectMask 的定义在多平面格式的平面的兼容格式

  • VUID-vkCmdCopyBufferToImage-dstImage-07978
    如果 dstImage 具有深度/模板格式,则 pRegions 的任何元素的 bufferOffset 成员 必须4 的倍数

有效使用(隐式)
  • VUID-vkCmdCopyBufferToImage-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyBufferToImage-srcBuffer-parameter
    srcBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkCmdCopyBufferToImage-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdCopyBufferToImage-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdCopyBufferToImage-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效 VkBufferImageCopy 结构的数组的有效指针

  • VUID-vkCmdCopyBufferToImage-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyBufferToImage-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyBufferToImage-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdCopyBufferToImage-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-vkCmdCopyBufferToImage-commonparent
    commandBufferdstImagesrcBuffer 中的每一个 必须是从同一个 VkDevice 创建、分配或检索的

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

要将数据从图像对象复制到缓冲区对象,请调用

// Provided by VK_VERSION_1_0
void vkCmdCopyImageToBuffer(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkBuffer                                    dstBuffer,
    uint32_t                                    regionCount,
    const VkBufferImageCopy*                    pRegions);
  • commandBuffer 是将记录命令的命令缓冲区。

  • srcImage 是源图像。

  • srcImageLayout 是复制的源图像子资源的布局。

  • dstBuffer 是目标缓冲区。

  • regionCount 是要复制的区域数。

  • pRegions 是指向 VkBufferImageCopy 结构数组的指针,该结构指定要复制的区域。

根据每个资源的寻址计算pRegions 指定的每个源区域都从源图像复制到目标缓冲区的目标区域。如果 srcImage 中指定的任何区域在内存中与 dstBuffer 中指定的任何区域重叠,则从这些重叠区域读取的值是 未定义的

图像的复制区域必须在每个维度上与纹素块范围的倍数对齐,但图像边缘除外,在图像边缘,区域范围必须与图像边缘匹配。

有效用法
  • VUID-vkCmdCopyImageToBuffer-srcImage-07966
    如果 srcImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdCopyImageToBuffer-imageSubresource-07967
    pRegions 的每个元素的 imageSubresource.mipLevel 成员 必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdCopyImageToBuffer-imageSubresource-07968
    如果 imageSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 imageSubresource.baseArrayLayer + imageSubresource.layerCount 必须小于或等于创建 srcImage 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdCopyImageToBuffer-srcImage-07969
    创建 srcImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-vkCmdCopyImageToBuffer-imageSubresource-07970
    pRegions 的每个元素指定的图像区域 必须包含在 srcImage 的指定 imageSubresource

  • VUID-vkCmdCopyImageToBuffer-imageSubresource-07971
    对于 pRegions 的每个元素,imageOffset.x(imageExtent.width + imageOffset.x) 必须都大于或等于 0 且小于或等于 srcImage 的指定 imageSubresource 的宽度

  • VUID-vkCmdCopyImageToBuffer-imageSubresource-07972
    对于 pRegions 的每个元素,imageOffset.y(imageExtent.height + imageOffset.y) 必须都大于或等于 0 且小于或等于 srcImage 的指定 imageSubresource 的高度

  • VUID-vkCmdCopyImageToBuffer-srcImage-07973
    srcImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的样本计数

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-01831
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-01832
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-01833
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是一个不受保护的缓冲区

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-07746
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 pRegions 的任何元素的 bufferOffset 成员必须4 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-07747
    pRegions 的每个元素的 imageOffsetimageExtent 成员必须符合 commandBuffer 的命令池队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-10216
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pRegions 的每个元素,imageSubresourceaspectMask 成员不能VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdCopyImageToBuffer-pRegions-00183
    dstBuffer 必须足够大,以便容纳根据缓冲区和图像寻址访问的所有缓冲区位置,对于 pRegions 的每个元素

  • VUID-vkCmdCopyImageToBuffer-pRegions-00184
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-vkCmdCopyImageToBuffer-srcImage-00186
    srcImage 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-vkCmdCopyImageToBuffer-srcImage-01998
    srcImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

  • VUID-vkCmdCopyImageToBuffer-dstBuffer-00191
    dstBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 使用标志创建

  • VUID-vkCmdCopyImageToBuffer-dstBuffer-00192
    如果 dstBuffer 不是稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdCopyImageToBuffer-srcImage-07979
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,imageOffset.y 必须0imageExtent.height 必须1

  • VUID-vkCmdCopyImageToBuffer-imageOffset-09104
    对于 pRegions 的每个元素,imageOffset.z(imageExtent.depth + imageOffset.z) 必须 都大于或等于 0 且小于或等于 srcImage 指定的 imageSubresource 的深度

  • VUID-vkCmdCopyImageToBuffer-srcImage-07980
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,imageOffset.z 必须0imageExtent.depth 必须1

  • VUID-vkCmdCopyImageToBuffer-srcImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.x 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,且 imageOffset.x 不等于由 imageSubresource 指定的子资源的宽度,则 imageOffset.x 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-vkCmdCopyImageToBuffer-srcImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.y 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,且 imageOffset.y 不等于由 imageSubresource 指定的子资源的高度,则 imageOffset.y 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-vkCmdCopyImageToBuffer-srcImage-07276
    对于 pRegions 的每个元素,imageOffset.z 必须srcImageVkFormat纹素块深度 的倍数

  • VUID-vkCmdCopyImageToBuffer-srcImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.xextent.width 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.width 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.xextent.height 的差值 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.xextent.width 的差值 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 imageOffset.xextent.height 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.height 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-vkCmdCopyImageToBuffer-srcImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.yextent.height 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.height 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.yextent.width 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.width 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.yextent.height 的差值必须srcImageVkFormat纹素块高度的倍数。

  • VUID-vkCmdCopyImageToBuffer-imageOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.yextent.width 的差值必须srcImageVkFormat纹素块高度的倍数。

  • VUID-vkCmdCopyImageToBuffer-srcImage-00209
    对于 pRegions 的每个元素,如果 imageOffset.zextent.depth 的总和不等于由 srcSubresource 指定的子资源的深度,则 extent.depth 必须srcImageVkFormat纹素块深度的倍数。

  • VUID-vkCmdCopyImageToBuffer-imageSubresource-09105
    对于 pRegions 的每个元素,imageSubresource.aspectMask 必须指定 srcImage 中存在的方面。

  • VUID-vkCmdCopyImageToBuffer-srcImage-07981
    如果 srcImage 具有多平面图像格式,则对于 pRegions 的每个元素,imageSubresource.aspectMask 必须是单个有效的多平面方面掩码位。

  • VUID-vkCmdCopyImageToBuffer-srcImage-07983
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,imageSubresource.baseArrayLayer 必须0,并且 imageSubresource.layerCount 必须1

  • VUID-vkCmdCopyImageToBuffer-bufferRowLength-09106
    对于 pRegions 的每个元素,bufferRowLength 必须srcImageVkFormat纹素块宽度的倍数。

  • VUID-vkCmdCopyImageToBuffer-bufferImageHeight-09107
    对于 pRegions 的每个元素,bufferImageHeight 必须srcImageVkFormat纹素块高度的倍数。

  • VUID-vkCmdCopyImageToBuffer-bufferRowLength-09108
    对于 pRegions 的每个元素,bufferRowLength 除以纹素块宽度,然后乘以 srcImage 的纹素块大小的结果必须小于或等于231-1

  • VUID-vkCmdCopyImageToBuffer-srcImage-07975
    如果 srcImage 没有深度/模板格式或多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须纹素块大小的倍数。

  • VUID-vkCmdCopyImageToBuffer-srcImage-07976
    如果 srcImage 具有多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须多平面格式的兼容平面格式中定义的,与格式和 imageSubresourceaspectMask 兼容的元素大小的倍数。

  • VUID-vkCmdCopyImageToBuffer-srcImage-07978
    如果 srcImage 具有深度/模板格式,则 pRegions 的任何元素的 bufferOffset 成员必须4 的倍数。

有效使用(隐式)
  • VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyImageToBuffer-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdCopyImageToBuffer-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdCopyImageToBuffer-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkCmdCopyImageToBuffer-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效 VkBufferImageCopy 结构的数组的有效指针

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyImageToBuffer-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyImageToBuffer-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdCopyImageToBuffer-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-vkCmdCopyImageToBuffer-commonparent
    commandBufferdstBuffersrcImage 中的每一个都必须已从同一个 VkDevice 创建、分配或检索。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

对于 vkCmdCopyBufferToImagevkCmdCopyImageToBufferpRegions 的每个元素都是一个定义为以下内容的结构:

// Provided by VK_VERSION_1_0
typedef struct VkBufferImageCopy {
    VkDeviceSize                bufferOffset;
    uint32_t                    bufferRowLength;
    uint32_t                    bufferImageHeight;
    VkImageSubresourceLayers    imageSubresource;
    VkOffset3D                  imageOffset;
    VkExtent3D                  imageExtent;
} VkBufferImageCopy;
  • bufferOffset 是从缓冲区对象的开始到复制或从中复制图像数据的字节偏移量。

  • bufferRowLengthbufferImageHeight 在纹素中指定缓冲区内存中较大的二维或三维图像的子区域,并控制寻址计算。如果这些值中的任何一个为零,则认为缓冲区内存的该方面根据 imageExtent 紧密打包。

  • imageSubresource 是一个 VkImageSubresourceLayers,用于指定用于源或目标图像数据的图像的特定图像子资源。

  • imageOffset 选择源或目标图像数据子区域中纹素的初始 xyz 偏移量。

  • imageExtent 是要复制的图像的大小,以纹素为单位,包括 widthheightdepth

有效用法
  • VUID-VkBufferImageCopy-bufferRowLength-09101
    bufferRowLength 必须0,或者大于或等于 imageExtentwidth 成员。

  • VUID-VkBufferImageCopy-bufferImageHeight-09102
    bufferImageHeight 必须0,或者大于或等于 imageExtentheight 成员。

  • VUID-VkBufferImageCopy-aspectMask-09103
    imageSubresourceaspectMask 成员必须只设置一个位。

  • VUID-VkBufferImageCopy-imageExtent-06659
    imageExtent.width 不得为 0。

  • VUID-VkBufferImageCopy-imageExtent-06660
    imageExtent.height 必须不为 0

  • VUID-VkBufferImageCopy-imageExtent-06661
    imageExtent.depth 必须不为 0

有效使用(隐式)
  • VUID-VkBufferImageCopy-imageSubresource-parameter
    imageSubresource 必须是一个有效的 VkImageSubresourceLayers 结构体

下面定义了在缓冲区和图像之间复制的命令的更可扩展的版本。

要将数据从缓冲区对象复制到图像对象,请调用

// Provided by VK_VERSION_1_3
void vkCmdCopyBufferToImage2(
    VkCommandBuffer                             commandBuffer,
    const VkCopyBufferToImageInfo2*             pCopyBufferToImageInfo);

或等效的命令

// Provided by VK_KHR_copy_commands2
void vkCmdCopyBufferToImage2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyBufferToImageInfo2*             pCopyBufferToImageInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pCopyBufferToImageInfo 是一个指向 VkCopyBufferToImageInfo2 结构体的指针,该结构体描述了复制参数。

此命令在功能上与 vkCmdCopyBufferToImage 相同,但包含可扩展的子结构,其中包括 sTypepNext 参数,从而可以更轻松地进行扩展。

有效用法
  • VUID-vkCmdCopyBufferToImage2-commandBuffer-01828
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyBufferToImage2-commandBuffer-01829
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdCopyBufferToImage2-commandBuffer-01830
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

  • VUID-vkCmdCopyBufferToImage2-commandBuffer-07737
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 pCopyBufferToImageInfo->pRegions 的任何元素的 bufferOffset 成员必须4 的倍数。

  • VUID-vkCmdCopyBufferToImage2-imageOffset-07738
    pCopyBufferToImageInfo->pRegions 的每个元素的 imageOffsetimageExtent 成员必须遵守 commandBuffer 的命令池的队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述。

  • VUID-vkCmdCopyBufferToImage2-commandBuffer-07739
    如果用于创建 commandBuffer 所分配的 VkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pCopyBufferToImageInfo->pRegions 的每个元素,imageSubresourceaspectMask 成员必须不为 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

有效使用(隐式)
  • VUID-vkCmdCopyBufferToImage2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyBufferToImage2-pCopyBufferToImageInfo-parameter
    pCopyBufferToImageInfo 必须是一个指向有效 VkCopyBufferToImageInfo2 结构体的有效指针

  • VUID-vkCmdCopyBufferToImage2-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyBufferToImage2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyBufferToImage2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyBufferToImage2-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkCopyBufferToImageInfo2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkCopyBufferToImageInfo2 {
    VkStructureType              sType;
    const void*                  pNext;
    VkBuffer                     srcBuffer;
    VkImage                      dstImage;
    VkImageLayout                dstImageLayout;
    uint32_t                     regionCount;
    const VkBufferImageCopy2*    pRegions;
} VkCopyBufferToImageInfo2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkCopyBufferToImageInfo2 VkCopyBufferToImageInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcBuffer 是源缓冲区。

  • dstImage 是目标图像。

  • dstImageLayout 是用于复制的目标图像子资源的布局。

  • regionCount 是要复制的区域数。

  • pRegions 是一个指向 VkBufferImageCopy2 结构体数组的指针,该数组指定要复制的区域。

有效用法
  • VUID-VkCopyBufferToImageInfo2-pRegions-00171
    对于 pRegions 的每个元素,srcBuffer 的大小必须足以包含根据 缓冲区和图像寻址访问的所有缓冲区位置

  • VUID-VkCopyBufferToImageInfo2-pRegions-00173
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-VkCopyBufferToImageInfo2-srcBuffer-00174
    srcBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-VkCopyBufferToImageInfo2-dstImage-01997
    dstImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

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

  • VUID-VkCopyBufferToImageInfo2-dstImage-00177
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

  • VUID-VkCopyBufferToImageInfo2-dstImageLayout-00180
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-VkCopyBufferToImageInfo2-dstImageLayout-01396
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkCopyBufferToImageInfo2-pRegions-07931
    如果未启用 VK_EXT_depth_range_unrestricted,则对于 pRegions 的每个 imageSubresource 包含深度方面的元素,srcBuffer 中的数据必须[0,1] 范围内

  • VUID-VkCopyBufferToImageInfo2-dstImage-07966
    如果 dstImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyBufferToImageInfo2-imageSubresource-07967
    pRegions 的每个元素的 imageSubresource.mipLevel 成员必须小于创建 dstImageVkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyBufferToImageInfo2-imageSubresource-07968
    如果 imageSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 imageSubresource.baseArrayLayer + imageSubresource.layerCount必须小于或等于创建 dstImageVkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyBufferToImageInfo2-dstImage-07969
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyBufferToImageInfo2-dstImage-07973
    dstImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-VkCopyBufferToImageInfo2-dstImage-07979
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,imageOffset.y 必须0,并且 imageExtent.height 必须1

  • VUID-VkCopyBufferToImageInfo2-imageOffset-09104
    对于 pRegions 的每个元素,imageOffset.z(imageExtent.depth + imageOffset.z) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的深度

  • VUID-VkCopyBufferToImageInfo2-dstImage-07980
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,imageOffset.z 必须0,并且 imageExtent.depth 必须1

  • VUID-VkCopyBufferToImageInfo2-dstImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.x 不等于 imageSubresource 指定的子资源的宽度,则 imageOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数

  • VUID-VkCopyBufferToImageInfo2-dstImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.y 必须dstImageVkFormat纹素块范围高度的倍数

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,并且 imageOffset.y 不等于 imageSubresource 指定的子资源的高度,则 imageOffset.y 必须dstImageVkFormat纹素块范围高度的倍数

  • VUID-VkCopyBufferToImageInfo2-dstImage-07276
    对于 pRegions 的每个元素,imageOffset.z 必须dstImageVkFormat纹素块范围深度的倍数

  • VUID-VkCopyBufferToImageInfo2-dstImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.xextent.width 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.width **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.xextent.height 的差值**必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.xextent.width 的差值**必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 imageOffset.xextent.height 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.height **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-dstImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.yextent.height 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.height **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.yextent.width 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.width **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.yextent.height 的差值**必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.yextent.width 的差值**必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-dstImage-00209
    对于 pRegions 的每个元素,如果 imageOffset.zextent.depth 的总和不等于 srcSubresource 指定的子资源的深度,则 extent.depth **必须**是 dstImageVkFormat纹素块扩展深度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-imageSubresource-09105
    对于 pRegions 的每个元素,imageSubresource.aspectMask **必须**指定 dstImage 中存在的方面。

  • VUID-VkCopyBufferToImageInfo2-dstImage-07981
    如果 dstImage 具有多平面图像格式,则对于 pRegions 的每个元素,imageSubresource.aspectMask **必须**是单个有效的多平面方面掩码位。

  • VUID-VkCopyBufferToImageInfo2-dstImage-07983
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,imageSubresource.baseArrayLayer **必须**为 0,并且 imageSubresource.layerCount **必须**为 1

  • VUID-VkCopyBufferToImageInfo2-bufferRowLength-09106
    对于 pRegions 的每个元素,bufferRowLength **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-bufferImageHeight-09107
    对于 pRegions 的每个元素,bufferImageHeight **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyBufferToImageInfo2-bufferRowLength-09108
    对于 pRegions 的每个元素,bufferRowLength 除以纹素块扩展宽度,然后乘以 dstImage 的纹素块大小,**必须**小于或等于231-1

  • VUID-VkCopyBufferToImageInfo2-dstImage-07975
    如果 dstImage 没有深度/模板格式或多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须纹素块大小的倍数

  • VUID-VkCopyBufferToImageInfo2-dstImage-07976
    如果 dstImage 具有多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须是格式的兼容格式的元素大小的倍数,并且 imageSubresourceaspectMask 的定义在多平面格式的平面的兼容格式

  • VUID-VkCopyBufferToImageInfo2-dstImage-07978
    如果 dstImage 具有深度/模板格式,则 pRegions 的任何元素的 bufferOffset 成员 必须4 的倍数

  • VUID-VkCopyBufferToImageInfo2-pRegions-06223
    对于 pRegions 的每个元素,如果其 pNext 链中不包含 VkCopyCommandTransformInfoQCOM,则 imageOffset.x(imageExtent.width + imageOffset.x) **必须**都大于等于 0 且小于等于 dstImage 指定 imageSubresource 的宽度

  • VUID-VkCopyBufferToImageInfo2-pRegions-06224
    对于 pRegions 的每个元素,如果其 pNext 链中不包含 VkCopyCommandTransformInfoQCOM,则 imageOffset.y(imageExtent.height + imageOffset.y) **必须**都大于等于 0 且小于等于 dstImage 指定 imageSubresource 的高度

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

  • VUID-VkCopyBufferToImageInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyBufferToImageInfo2-srcBuffer-parameter
    srcBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkCopyBufferToImageInfo2-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyBufferToImageInfo2-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyBufferToImageInfo2-pRegions-parameter
    pRegions **必须**是指向 regionCount 个有效的 VkBufferImageCopy2 结构的有效指针数组

  • VUID-VkCopyBufferToImageInfo2-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkCopyBufferToImageInfo2-commonparent
    dstImagesrcBuffer 都 **必须** 是从同一个 VkDevice 创建、分配或检索的。

要将数据从图像对象复制到缓冲区对象,请调用

// Provided by VK_VERSION_1_3
void vkCmdCopyImageToBuffer2(
    VkCommandBuffer                             commandBuffer,
    const VkCopyImageToBufferInfo2*             pCopyImageToBufferInfo);

或等效的命令

// Provided by VK_KHR_copy_commands2
void vkCmdCopyImageToBuffer2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyImageToBufferInfo2*             pCopyImageToBufferInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pCopyImageToBufferInfo 是指向 VkCopyImageToBufferInfo2 结构的指针,该结构描述了复制参数。

此命令在功能上与 vkCmdCopyImageToBuffer 相同,但包括可扩展的子结构,其中包含 sTypepNext 参数,从而可以更容易地扩展它们。

有效用法
  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-01831
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-01832
    如果 commandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-01833
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstBuffer 必须不是一个不受保护的缓冲区

  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-07746
    如果用于创建从中分配 commandBufferVkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,则 pCopyImageToBufferInfo->pRegions 的任何元素的 bufferOffset 成员 **必须** 是 4 的倍数

  • VUID-vkCmdCopyImageToBuffer2-imageOffset-07747
    pCopyImageToBufferInfo->pRegions 的每个元素的 imageOffsetimageExtent 成员 **必须** 遵守 VkQueueFamilyProperties 中描述的 commandBuffer 的命令池队列族的图像传输粒度要求

  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-10216
    如果用于创建从中分配 commandBufferVkCommandPool 的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于 pCopyImageToBufferInfo->pRegions 的每个元素,imageSubresourceaspectMask 成员 **必须** 不是 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

有效使用(隐式)
  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyImageToBuffer2-pCopyImageToBufferInfo-parameter
    pCopyImageToBufferInfo **必须** 是指向有效的 VkCopyImageToBufferInfo2 结构的有效指针

  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyImageToBuffer2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyImageToBuffer2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyImageToBuffer2-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkCopyImageToBufferInfo2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkCopyImageToBufferInfo2 {
    VkStructureType              sType;
    const void*                  pNext;
    VkImage                      srcImage;
    VkImageLayout                srcImageLayout;
    VkBuffer                     dstBuffer;
    uint32_t                     regionCount;
    const VkBufferImageCopy2*    pRegions;
} VkCopyImageToBufferInfo2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkCopyImageToBufferInfo2 VkCopyImageToBufferInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcImage 是源图像。

  • srcImageLayout 是复制的源图像子资源的布局。

  • dstBuffer 是目标缓冲区。

  • regionCount 是要复制的区域数。

  • pRegions 是一个指向 VkBufferImageCopy2 结构体数组的指针,该数组指定要复制的区域。

有效用法
  • VUID-VkCopyImageToBufferInfo2-pRegions-00183
    dstBuffer 必须足够大,以便容纳根据缓冲区和图像寻址访问的所有缓冲区位置,对于 pRegions 的每个元素

  • VUID-VkCopyImageToBufferInfo2-pRegions-00184
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-VkCopyImageToBufferInfo2-srcImage-00186
    srcImage 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-VkCopyImageToBufferInfo2-srcImage-01998
    srcImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

  • VUID-VkCopyImageToBufferInfo2-dstBuffer-00191
    dstBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 使用标志创建

  • VUID-VkCopyImageToBufferInfo2-dstBuffer-00192
    如果 dstBuffer 不是稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageToBufferInfo2-srcImageLayout-00189
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-VkCopyImageToBufferInfo2-srcImageLayout-01397
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkCopyImageToBufferInfo2-srcImage-07966
    如果 srcImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageToBufferInfo2-imageSubresource-07967
    pRegions 的每个元素的 imageSubresource.mipLevel 成员 必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyImageToBufferInfo2-imageSubresource-07968
    如果 imageSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 imageSubresource.baseArrayLayer + imageSubresource.layerCount 必须小于或等于创建 srcImage 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyImageToBufferInfo2-srcImage-07969
    创建 srcImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyImageToBufferInfo2-srcImage-07973
    srcImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的样本计数

  • VUID-VkCopyImageToBufferInfo2-srcImage-07979
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,imageOffset.y 必须0imageExtent.height 必须1

  • VUID-VkCopyImageToBufferInfo2-imageOffset-09104
    对于 pRegions 的每个元素,imageOffset.z(imageExtent.depth + imageOffset.z) 必须 都大于或等于 0 且小于或等于 srcImage 指定的 imageSubresource 的深度

  • VUID-VkCopyImageToBufferInfo2-srcImage-07980
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,imageOffset.z 必须0imageExtent.depth 必须1

  • VUID-VkCopyImageToBufferInfo2-srcImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.x 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,且 imageOffset.x 不等于由 imageSubresource 指定的子资源的宽度,则 imageOffset.x 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToBufferInfo2-srcImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.y 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,且 imageOffset.y 不等于由 imageSubresource 指定的子资源的高度,则 imageOffset.y 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToBufferInfo2-srcImage-07276
    对于 pRegions 的每个元素,imageOffset.z 必须srcImageVkFormat纹素块深度 的倍数

  • VUID-VkCopyImageToBufferInfo2-srcImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.xextent.width 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.width 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.xextent.height 的差值 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.xextent.width 的差值 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 imageOffset.xextent.height 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.height 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToBufferInfo2-srcImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.yextent.height 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.height 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.yextent.width 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.width 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.yextent.height 的差值必须srcImageVkFormat纹素块高度的倍数。

  • VUID-VkCopyImageToBufferInfo2-imageOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.yextent.width 的差值必须srcImageVkFormat纹素块高度的倍数。

  • VUID-VkCopyImageToBufferInfo2-srcImage-00209
    对于 pRegions 的每个元素,如果 imageOffset.zextent.depth 的总和不等于由 srcSubresource 指定的子资源的深度,则 extent.depth 必须srcImageVkFormat纹素块深度的倍数。

  • VUID-VkCopyImageToBufferInfo2-imageSubresource-09105
    对于 pRegions 的每个元素,imageSubresource.aspectMask 必须指定 srcImage 中存在的方面。

  • VUID-VkCopyImageToBufferInfo2-srcImage-07981
    如果 srcImage 具有多平面图像格式,则对于 pRegions 的每个元素,imageSubresource.aspectMask 必须是单个有效的多平面方面掩码位。

  • VUID-VkCopyImageToBufferInfo2-srcImage-07983
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,imageSubresource.baseArrayLayer 必须0,并且 imageSubresource.layerCount 必须1

  • VUID-VkCopyImageToBufferInfo2-bufferRowLength-09106
    对于 pRegions 的每个元素,bufferRowLength 必须srcImageVkFormat纹素块宽度的倍数。

  • VUID-VkCopyImageToBufferInfo2-bufferImageHeight-09107
    对于 pRegions 的每个元素,bufferImageHeight 必须srcImageVkFormat纹素块高度的倍数。

  • VUID-VkCopyImageToBufferInfo2-bufferRowLength-09108
    对于 pRegions 的每个元素,bufferRowLength 除以纹素块宽度,然后乘以 srcImage 的纹素块大小的结果必须小于或等于231-1

  • VUID-VkCopyImageToBufferInfo2-srcImage-07975
    如果 srcImage 没有深度/模板格式或多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须纹素块大小的倍数。

  • VUID-VkCopyImageToBufferInfo2-srcImage-07976
    如果 srcImage 具有多平面格式,则对于 pRegions 的每个元素,bufferOffset 必须多平面格式的兼容平面格式中定义的,与格式和 imageSubresourceaspectMask 兼容的元素大小的倍数。

  • VUID-VkCopyImageToBufferInfo2-srcImage-07978
    如果 srcImage 具有深度/模板格式,则 pRegions 的任何元素的 bufferOffset 成员必须4 的倍数。

  • VUID-VkCopyImageToBufferInfo2-imageOffset-00197
    对于 pRegions 中在其 pNext 链中不包含 VkCopyCommandTransformInfoQCOM 的每个元素,imageOffset.x(imageExtent.width + imageOffset.x) 必须都大于或等于 0 且小于或等于 srcImage 的指定 imageSubresource 的宽度。

  • VUID-VkCopyImageToBufferInfo2-imageOffset-00198
    对于 pRegions 中在其 pNext 链中不包含 VkCopyCommandTransformInfoQCOM 的每个元素,imageOffset.y(imageExtent.height + imageOffset.y) 必须都大于或等于 0 且小于或等于 srcImage 的指定 imageSubresource 的高度。

有效使用(隐式)
  • VUID-VkCopyImageToBufferInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2

  • VUID-VkCopyImageToBufferInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyImageToBufferInfo2-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyImageToBufferInfo2-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyImageToBufferInfo2-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkCopyImageToBufferInfo2-pRegions-parameter
    pRegions **必须**是指向 regionCount 个有效的 VkBufferImageCopy2 结构的有效指针数组

  • VUID-VkCopyImageToBufferInfo2-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkCopyImageToBufferInfo2-commonparent
    dstBuffersrcImage必须由同一个 VkDevice 创建、分配或检索。

对于 vkCmdCopyBufferToImage2vkCmdCopyImageToBuffer2pRegions 的每个元素都定义为一个结构体,如下:

// Provided by VK_VERSION_1_3
typedef struct VkBufferImageCopy2 {
    VkStructureType             sType;
    const void*                 pNext;
    VkDeviceSize                bufferOffset;
    uint32_t                    bufferRowLength;
    uint32_t                    bufferImageHeight;
    VkImageSubresourceLayers    imageSubresource;
    VkOffset3D                  imageOffset;
    VkExtent3D                  imageExtent;
} VkBufferImageCopy2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkBufferImageCopy2 VkBufferImageCopy2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • bufferOffset 是从缓冲区对象的开始到复制或从中复制图像数据的字节偏移量。

  • bufferRowLengthbufferImageHeight 在纹素中指定缓冲区内存中较大的二维或三维图像的子区域,并控制寻址计算。如果这些值中的任何一个为零,则认为缓冲区内存的该方面根据 imageExtent 紧密打包。

  • imageSubresource 是一个 VkImageSubresourceLayers,用于指定用于源或目标图像数据的图像的特定图像子资源。

  • imageOffset 选择源或目标图像数据子区域中纹素的初始 xyz 偏移量。

  • imageExtent 是要复制的图像的大小,以纹素为单位,包括 widthheightdepth

此结构体在功能上与 VkBufferImageCopy 相同,但添加了 sTypepNext 参数,使其更易于扩展。

有效用法
  • VUID-VkBufferImageCopy2-bufferRowLength-09101
    bufferRowLength 必须0,或者大于或等于 imageExtentwidth 成员。

  • VUID-VkBufferImageCopy2-bufferImageHeight-09102
    bufferImageHeight 必须0,或者大于或等于 imageExtentheight 成员。

  • VUID-VkBufferImageCopy2-aspectMask-09103
    imageSubresourceaspectMask 成员必须只设置一个位。

  • VUID-VkBufferImageCopy2-imageExtent-06659
    imageExtent.width 不得为 0。

  • VUID-VkBufferImageCopy2-imageExtent-06660
    imageExtent.height 必须不为 0

  • VUID-VkBufferImageCopy2-imageExtent-06661
    imageExtent.depth 必须不为 0

有效使用(隐式)
  • VUID-VkBufferImageCopy2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2

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

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

  • VUID-VkBufferImageCopy2-imageSubresource-parameter
    imageSubresource 必须是一个有效的 VkImageSubresourceLayers 结构体

VkCopyCommandTransformInfoQCOM 结构体定义如下:

// Provided by VK_QCOM_rotated_copy_commands
typedef struct VkCopyCommandTransformInfoQCOM {
    VkStructureType                  sType;
    const void*                      pNext;
    VkSurfaceTransformFlagBitsKHR    transform;
} VkCopyCommandTransformInfoQCOM;

VkBufferImageCopy2pNext 链中包含此结构体,定义了在图像和缓冲区之间复制时要执行的旋转。在 VkBlitImageInfo2pNext 链中包含此结构体,定义了在两个图像之间 blit 时要执行的旋转。如果在这两种情况下都没有指定此结构体,则实现的行为就像指定了一个 transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR 的结构体一样。

为图像和缓冲区之间的复制指定变换 会使图像中访问的区域围绕偏移量旋转。为 blit 指定变换执行类似于 具有缩放和旋转的图像 Blit 中描述的变换。

除了 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR 之外的旋转只能为具有 1x1x1 纹素块范围 的单平面 2D 图像指定。

有效用法
  • VUID-VkCopyCommandTransformInfoQCOM-transform-04560
    transform 必须VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR

有效使用(隐式)
  • VUID-VkCopyCommandTransformInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM

以下命令可用于在主机内存和图像之间进行复制。主机内存中的字节和图像中的纹素按照 在缓冲区和图像之间复制数据 中指定的方式访问,其中缓冲区替换为主机内存。

在主机上进出图像的复制不会在内部同步。同时访问(涉及写入)主机上重叠的图像内存构成 数据竞争

要将数据从主机内存复制到图像对象,请调用

// Provided by VK_VERSION_1_4
VkResult vkCopyMemoryToImage(
    VkDevice                                    device,
    const VkCopyMemoryToImageInfo*              pCopyMemoryToImageInfo);

或等效的命令

// Provided by VK_EXT_host_image_copy
VkResult vkCopyMemoryToImageEXT(
    VkDevice                                    device,
    const VkCopyMemoryToImageInfo*              pCopyMemoryToImageInfo);
  • device 是拥有 pCopyMemoryToImageInfo->dstImage 的设备。

  • pCopyMemoryToImageInfo 是指向描述复制参数的 VkCopyMemoryToImageInfo 结构体的指针。

此命令在功能上类似于 vkCmdCopyBufferToImage2,只是它在主机上执行,并从主机内存而不是缓冲区读取。主机访问 pCopyMemoryToImageInfo->dstImage 的内存,就好像它是 一致的

由于队列提交 自动使主机内存对设备可见,因此在使用设备上此复制操作的结果之前,无需进行内存屏障。

有效使用(隐式)
  • VUID-vkCopyMemoryToImage-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCopyMemoryToImage-pCopyMemoryToImageInfo-parameter
    pCopyMemoryToImageInfo 必须是指向有效 VkCopyMemoryToImageInfo 结构体的有效指针

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_MEMORY_MAP_FAILED

VkCopyMemoryToImageInfo 结构体的定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkCopyMemoryToImageInfo {
    VkStructureType               sType;
    const void*                   pNext;
    VkHostImageCopyFlags          flags;
    VkImage                       dstImage;
    VkImageLayout                 dstImageLayout;
    uint32_t                      regionCount;
    const VkMemoryToImageCopy*    pRegions;
} VkCopyMemoryToImageInfo;

或等效的

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

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

  • flags 是一个 VkHostImageCopyFlagBits 值的位掩码,描述了额外的复制参数。

  • dstImage 是目标图像。

  • dstImageLayout 是用于复制的目标图像子资源的布局。

  • regionCount 是要复制的区域数。

  • pRegions 是指向 VkMemoryToImageCopy 结构体数组的指针,指定要复制的区域。

vkCopyMemoryToImage 在执行复制之前不检查与 dstImage 关联的设备内存当前是否正在使用。应用程序必须保证任何先前提交的从复制区域读取或写入的命令在主机执行复制之前已完成。

图像的复制区域必须在每个维度上与纹素块范围的倍数对齐,但图像边缘除外,在图像边缘,区域范围必须与图像边缘匹配。

有效用法
  • VUID-VkCopyMemoryToImageInfo-dstImage-09109
    如果 dstImage 是稀疏的,那么复制命令访问的所有内存范围必须按照绑定资源内存中所述进行绑定。

  • VUID-VkCopyMemoryToImageInfo-dstImage-09111
    如果访问了 dstImage 的模板方面,并且 dstImage 创建时未使用单独的模板用途,则 dstImage 必须VkImageCreateInfo::usage 中设置了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkCopyMemoryToImageInfo-dstImage-09112
    如果访问了 dstImage 的模板方面,并且 dstImage 创建时使用了单独的模板用途,则 dstImage 必须VkImageStencilUsageCreateInfo::stencilUsage 中设置了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkCopyMemoryToImageInfo-dstImage-09113
    如果访问了 dstImage 的非模板方面,则 dstImage 必须VkImageCreateInfo::usage 中设置了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkCopyMemoryToImageInfo-imageOffset-09114
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则 pRegions 中每个元素的 imageOffset 成员的 xyz 成员必须0

  • VUID-VkCopyMemoryToImageInfo-dstImage-09115
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则 pRegions 中每个元素的 imageExtent 成员必须等于由 imageSubresource 标识的 dstImage 的范围。

  • VUID-VkCopyMemoryToImageInfo-dstImage-07966
    如果 dstImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyMemoryToImageInfo-imageSubresource-07967
    pRegions 的每个元素的 imageSubresource.mipLevel 成员必须小于创建 dstImageVkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyMemoryToImageInfo-imageSubresource-07968
    如果 imageSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 imageSubresource.baseArrayLayer + imageSubresource.layerCount必须小于或等于创建 dstImageVkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyMemoryToImageInfo-dstImage-07969
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyMemoryToImageInfo-imageSubresource-07970
    pRegions 的每个元素指定的图像区域必须包含在 dstImage 的指定 imageSubresource

  • VUID-VkCopyMemoryToImageInfo-imageSubresource-07971
    对于 pRegions 的每个元素,imageOffset.x(imageExtent.width + imageOffset.x) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的宽度

  • VUID-VkCopyMemoryToImageInfo-imageSubresource-07972
    对于 pRegions 的每个元素,imageOffset.y(imageExtent.height + imageOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的高度

  • VUID-VkCopyMemoryToImageInfo-dstImage-07973
    dstImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-VkCopyMemoryToImageInfo-dstImage-07979
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,imageOffset.y 必须0,并且 imageExtent.height 必须1

  • VUID-VkCopyMemoryToImageInfo-imageOffset-09104
    对于 pRegions 的每个元素,imageOffset.z(imageExtent.depth + imageOffset.z) 必须都大于等于 0 且小于等于 dstImage 的指定 imageSubresource 的深度

  • VUID-VkCopyMemoryToImageInfo-dstImage-07980
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,imageOffset.z 必须0,并且 imageExtent.depth 必须1

  • VUID-VkCopyMemoryToImageInfo-dstImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.x 不等于 imageSubresource 指定的子资源的宽度,则 imageOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数

  • VUID-VkCopyMemoryToImageInfo-dstImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.y 必须dstImageVkFormat纹素块范围高度的倍数

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,并且 imageOffset.y 不等于 imageSubresource 指定的子资源的高度,则 imageOffset.y 必须dstImageVkFormat纹素块范围高度的倍数

  • VUID-VkCopyMemoryToImageInfo-dstImage-07276
    对于 pRegions 的每个元素,imageOffset.z 必须dstImageVkFormat纹素块范围深度的倍数

  • VUID-VkCopyMemoryToImageInfo-dstImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.xextent.width 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.width **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.xextent.height 的差值**必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.xextent.width 的差值**必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 imageOffset.xextent.height 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.height **必须**是 dstImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-dstImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.yextent.height 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.height **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.yextent.width 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.width **必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.yextent.height 的差值**必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.yextent.width 的差值**必须**是 dstImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-dstImage-00209
    对于 pRegions 的每个元素,如果 imageOffset.zextent.depth 的总和不等于 srcSubresource 指定的子资源的深度,则 extent.depth **必须**是 dstImageVkFormat纹素块扩展深度 的倍数。

  • VUID-VkCopyMemoryToImageInfo-imageSubresource-09105
    对于 pRegions 的每个元素,imageSubresource.aspectMask **必须**指定 dstImage 中存在的方面。

  • VUID-VkCopyMemoryToImageInfo-dstImage-07981
    如果 dstImage 具有多平面图像格式,则对于 pRegions 的每个元素,imageSubresource.aspectMask **必须**是单个有效的多平面方面掩码位。

  • VUID-VkCopyMemoryToImageInfo-dstImage-07983
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,imageSubresource.baseArrayLayer **必须**为 0,并且 imageSubresource.layerCount **必须**为 1

  • VUID-VkCopyMemoryToImageInfo-memoryRowLength-09106
    对于 pRegions 的每个元素,memoryRowLength 必须dstImageVkFormat纹素块扩展宽度的倍数。

  • VUID-VkCopyMemoryToImageInfo-memoryImageHeight-09107
    对于 pRegions 的每个元素,memoryImageHeight 必须dstImageVkFormat纹素块扩展高度的倍数。

  • VUID-VkCopyMemoryToImageInfo-memoryRowLength-09108
    对于 pRegions 的每个元素,memoryRowLength 除以纹素块扩展宽度,然后乘以 dstImage 的纹素块大小,必须小于或等于 231-1

  • VUID-VkCopyMemoryToImageInfo-dstImageLayout-09059
    dstImageLayout 必须指定 pRegions 中指定的 dstImage 的图像子资源的当前布局。

  • VUID-VkCopyMemoryToImageInfo-dstImageLayout-09060
    dstImageLayout 必须VkPhysicalDeviceHostImageCopyProperties::pCopyDstLayouts 中返回的图像布局之一。

  • VUID-VkCopyMemoryToImageInfo-flags-09393
    如果 flags 包括 VK_HOST_IMAGE_COPY_MEMCPY,则对于 pRegions 中的每个区域,memoryRowLengthmemoryImageHeight 必须都为 0。

有效使用(隐式)
  • VUID-VkCopyMemoryToImageInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO

  • VUID-VkCopyMemoryToImageInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyMemoryToImageInfo-flags-parameter
    flags 必须VkHostImageCopyFlagBits 值的有效组合。

  • VUID-VkCopyMemoryToImageInfo-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyMemoryToImageInfo-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyMemoryToImageInfo-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效的 VkMemoryToImageCopy 结构体数组的有效指针。

  • VUID-VkCopyMemoryToImageInfo-regionCount-arraylength
    regionCount 必须大于 0

VkCopyMemoryToImageInfo::pRegions 的每个元素都是一个定义如下的结构体:

// Provided by VK_VERSION_1_4
typedef struct VkMemoryToImageCopy {
    VkStructureType             sType;
    const void*                 pNext;
    const void*                 pHostPointer;
    uint32_t                    memoryRowLength;
    uint32_t                    memoryImageHeight;
    VkImageSubresourceLayers    imageSubresource;
    VkOffset3D                  imageOffset;
    VkExtent3D                  imageExtent;
} VkMemoryToImageCopy;

或等效的

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

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

  • pHostPointer 是主机内存地址,它是复制操作的源。

  • memoryRowLengthmemoryImageHeight 在纹素中指定主机内存中较大的二维或三维图像的子区域,并控制寻址计算。如果这些值中的任何一个为零,则认为主机内存的该方面根据 imageExtent 紧密打包。

  • imageSubresource 是一个 VkImageSubresourceLayers,用于指定用于源或目标图像数据的图像的特定图像子资源。

  • imageOffset 选择目标图像数据的子区域中初始的 xyz 纹素偏移量。

  • imageExtent 是要复制的图像的大小,以纹素为单位,包括 widthheightdepth

此结构在功能上类似于 VkBufferImageCopy2,不同之处在于它定义主机内存作为复制的源,而不是缓冲区。特别是,与该结构相同的 数据打包规则 和限制也适用于此处。

有效用法
  • VUID-VkMemoryToImageCopy-pHostPointer-09061
    pHostPointer 必须指向足够大的内存,以包含根据 缓冲区和图像寻址访问的所有内存位置,对于 pRegions 的每个元素。

  • VUID-VkMemoryToImageCopy-pRegions-09062
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-VkMemoryToImageCopy-memoryRowLength-09101
    memoryRowLength 必须0,或者大于或等于 imageExtentwidth 成员。

  • VUID-VkMemoryToImageCopy-memoryImageHeight-09102
    memoryImageHeight 必须0,或者大于或等于 imageExtentheight 成员。

  • VUID-VkMemoryToImageCopy-aspectMask-09103
    imageSubresourceaspectMask 成员必须只设置一个位。

  • VUID-VkMemoryToImageCopy-imageExtent-06659
    imageExtent.width 不得为 0。

  • VUID-VkMemoryToImageCopy-imageExtent-06660
    imageExtent.height 必须不为 0

  • VUID-VkMemoryToImageCopy-imageExtent-06661
    imageExtent.depth 必须不为 0

有效使用(隐式)
  • VUID-VkMemoryToImageCopy-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY

  • VUID-VkMemoryToImageCopy-pNext-pNext
    pNext 必须NULL

  • VUID-VkMemoryToImageCopy-pHostPointer-parameter
    pHostPointer 必须是一个指针值。

  • VUID-VkMemoryToImageCopy-imageSubresource-parameter
    imageSubresource 必须是一个有效的 VkImageSubresourceLayers 结构体

要将数据从图像对象复制到主机内存,请调用:

// Provided by VK_VERSION_1_4
VkResult vkCopyImageToMemory(
    VkDevice                                    device,
    const VkCopyImageToMemoryInfo*              pCopyImageToMemoryInfo);

或等效的命令

// Provided by VK_EXT_host_image_copy
VkResult vkCopyImageToMemoryEXT(
    VkDevice                                    device,
    const VkCopyImageToMemoryInfo*              pCopyImageToMemoryInfo);
  • device 是拥有 pCopyImageToMemoryInfo->srcImage 的设备。

  • pCopyImageToMemoryInfo 是指向 VkCopyImageToMemoryInfo 结构的指针,该结构描述了复制参数。

此命令在功能上类似于 vkCmdCopyImageToBuffer2,不同之处在于它在主机上执行并写入主机内存而不是缓冲区。主机访问 pCopyImageToMemoryInfo->srcImage 的内存,就像 一致的 一样。

如果设备已写入图像内存,则它不会自动对主机可用。在调用此复制命令之前,必须已在设备上发布此图像的内存屏障,其中第二个同步范围包括 VK_PIPELINE_STAGE_HOST_BITVK_ACCESS_HOST_READ_BIT

有效使用(隐式)
  • VUID-vkCopyImageToMemory-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCopyImageToMemory-pCopyImageToMemoryInfo-parameter
    pCopyImageToMemoryInfo 必须是指向有效 VkCopyImageToMemoryInfo 结构的有效指针。

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_MEMORY_MAP_FAILED

VkCopyImageToMemoryInfo 结构的定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkCopyImageToMemoryInfo {
    VkStructureType               sType;
    const void*                   pNext;
    VkHostImageCopyFlags          flags;
    VkImage                       srcImage;
    VkImageLayout                 srcImageLayout;
    uint32_t                      regionCount;
    const VkImageToMemoryCopy*    pRegions;
} VkCopyImageToMemoryInfo;

或等效的

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

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

  • flags 是一个 VkHostImageCopyFlagBits 值的位掩码,描述了额外的复制参数。

  • srcImage 是源图像。

  • srcImageLayout 是复制的源图像子资源的布局。

  • regionCount 是要复制的区域数。

  • pRegions 是指向 VkImageToMemoryCopy 结构体数组的指针,该数组指定要复制的区域。

vkCopyImageToMemory 在执行复制之前,不检查与 srcImage 关联的设备内存当前是否正在使用。应用程序必须保证,任何先前提交的写入复制区域的命令在主机执行复制之前已完成。

图像的复制区域必须在每个维度上与纹素块范围的倍数对齐,但图像边缘除外,在图像边缘,区域范围必须与图像边缘匹配。

有效用法
  • VUID-VkCopyImageToMemoryInfo-srcImage-09109
    如果 srcImage 是稀疏的,那么复制命令访问的所有内存范围必须按照 绑定资源内存中所述进行绑定。

  • VUID-VkCopyImageToMemoryInfo-srcImage-09111
    如果访问了 srcImage 的模板方面,并且创建 srcImage 时未使用 单独的模板用法,则 srcImage 必须已使用 VkImageCreateInfo::usage 中设置的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 创建。

  • VUID-VkCopyImageToMemoryInfo-srcImage-09112
    如果访问了 srcImage 的模板方面,并且创建 srcImage 时使用了 单独的模板用法,则 srcImage 必须已使用 VkImageStencilUsageCreateInfo::stencilUsage 中设置的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 创建。

  • VUID-VkCopyImageToMemoryInfo-srcImage-09113
    如果访问了 srcImage 的非模板方面,则 srcImage 必须已使用 VkImageCreateInfo::usage 中设置的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 创建。

  • VUID-VkCopyImageToMemoryInfo-imageOffset-09114
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则 pRegions 中每个元素的 imageOffset 成员的 xyz 成员必须0

  • VUID-VkCopyImageToMemoryInfo-srcImage-09115
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则 pRegions 每个元素的 imageExtent 成员必须等于由 imageSubresource 标识的 srcImage 的范围。

  • VUID-VkCopyImageToMemoryInfo-srcImage-07966
    如果 srcImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageToMemoryInfo-imageSubresource-07967
    pRegions 的每个元素的 imageSubresource.mipLevel 成员 必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyImageToMemoryInfo-imageSubresource-07968
    如果 imageSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 imageSubresource.baseArrayLayer + imageSubresource.layerCount 必须小于或等于创建 srcImage 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyImageToMemoryInfo-srcImage-07969
    创建 srcImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyImageToMemoryInfo-imageSubresource-07970
    pRegions 的每个元素指定的图像区域 必须包含在 srcImage 的指定 imageSubresource

  • VUID-VkCopyImageToMemoryInfo-imageSubresource-07971
    对于 pRegions 的每个元素,imageOffset.x(imageExtent.width + imageOffset.x) 必须都大于或等于 0 且小于或等于 srcImage 的指定 imageSubresource 的宽度

  • VUID-VkCopyImageToMemoryInfo-imageSubresource-07972
    对于 pRegions 的每个元素,imageOffset.y(imageExtent.height + imageOffset.y) 必须都大于或等于 0 且小于或等于 srcImage 的指定 imageSubresource 的高度

  • VUID-VkCopyImageToMemoryInfo-srcImage-07973
    srcImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的样本计数

  • VUID-VkCopyImageToMemoryInfo-srcImage-07979
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,imageOffset.y 必须0imageExtent.height 必须1

  • VUID-VkCopyImageToMemoryInfo-imageOffset-09104
    对于 pRegions 的每个元素,imageOffset.z(imageExtent.depth + imageOffset.z) 必须 都大于或等于 0 且小于或等于 srcImage 指定的 imageSubresource 的深度

  • VUID-VkCopyImageToMemoryInfo-srcImage-07980
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,imageOffset.z 必须0imageExtent.depth 必须1

  • VUID-VkCopyImageToMemoryInfo-srcImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.x 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,且 imageOffset.x 不等于由 imageSubresource 指定的子资源的宽度,则 imageOffset.x 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToMemoryInfo-srcImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.y 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,且 imageOffset.y 不等于由 imageSubresource 指定的子资源的高度,则 imageOffset.y 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToMemoryInfo-srcImage-07276
    对于 pRegions 的每个元素,imageOffset.z 必须srcImageVkFormat纹素块深度 的倍数

  • VUID-VkCopyImageToMemoryInfo-srcImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.xextent.width 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.width 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 imageOffset.xextent.height 的差值 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.xextent.width 的差值 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 imageOffset.xextent.height 的总和不等于 imageSubresource 指定的子资源的宽度,则 extent.height 必须srcImageVkFormat纹素块宽度 的倍数

  • VUID-VkCopyImageToMemoryInfo-srcImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 imageOffset.yextent.height 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.height 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 imageOffset.yextent.width 的总和不等于 imageSubresource 指定的子资源的高度,则 extent.width 必须srcImageVkFormat纹素块高度 的倍数

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 imageOffset.yextent.height 的差值必须srcImageVkFormat纹素块高度的倍数。

  • VUID-VkCopyImageToMemoryInfo-imageOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 imageOffset.yextent.width 的差值必须srcImageVkFormat纹素块高度的倍数。

  • VUID-VkCopyImageToMemoryInfo-srcImage-00209
    对于 pRegions 的每个元素,如果 imageOffset.zextent.depth 的总和不等于由 srcSubresource 指定的子资源的深度,则 extent.depth 必须srcImageVkFormat纹素块深度的倍数。

  • VUID-VkCopyImageToMemoryInfo-imageSubresource-09105
    对于 pRegions 的每个元素,imageSubresource.aspectMask 必须指定 srcImage 中存在的方面。

  • VUID-VkCopyImageToMemoryInfo-srcImage-07981
    如果 srcImage 具有多平面图像格式,则对于 pRegions 的每个元素,imageSubresource.aspectMask 必须是单个有效的多平面方面掩码位。

  • VUID-VkCopyImageToMemoryInfo-srcImage-07983
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,imageSubresource.baseArrayLayer 必须0,并且 imageSubresource.layerCount 必须1

  • VUID-VkCopyImageToMemoryInfo-memoryRowLength-09106
    对于 pRegions 的每个元素,memoryRowLength 必须srcImage纹素块宽度 的倍数。

  • VUID-VkCopyImageToMemoryInfo-memoryImageHeight-09107
    对于 pRegions 的每个元素,memoryImageHeight 必须srcImage纹素块高度 的倍数。

  • VUID-VkCopyImageToMemoryInfo-memoryRowLength-09108
    对于 pRegions 的每个元素,memoryRowLength 除以纹素块宽度,然后乘以 srcImage 的纹素块大小 必须 小于或等于 231-1

  • VUID-VkCopyImageToMemoryInfo-srcImageLayout-09064
    srcImageLayout 必须指定 pRegions 中指定的 srcImage 的图像子资源的当前布局。

  • VUID-VkCopyImageToMemoryInfo-srcImageLayout-09065
    srcImageLayout 必须VkPhysicalDeviceHostImageCopyProperties::pCopySrcLayouts 中返回的图像布局之一。

  • VUID-VkCopyImageToMemoryInfo-flags-09394
    如果 flags 包括 VK_HOST_IMAGE_COPY_MEMCPY,则对于 pRegions 中的每个区域,memoryRowLengthmemoryImageHeight 必须都为 0。

有效使用(隐式)
  • VUID-VkCopyImageToMemoryInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO

  • VUID-VkCopyImageToMemoryInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyImageToMemoryInfo-flags-parameter
    flags 必须VkHostImageCopyFlagBits 值的有效组合。

  • VUID-VkCopyImageToMemoryInfo-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyImageToMemoryInfo-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyImageToMemoryInfo-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效的 VkImageToMemoryCopy 结构的有效指针。

  • VUID-VkCopyImageToMemoryInfo-regionCount-arraylength
    regionCount 必须大于 0

VkCopyImageToMemoryInfo::pRegions 的每个元素都是一个定义为

// Provided by VK_VERSION_1_4
typedef struct VkImageToMemoryCopy {
    VkStructureType             sType;
    const void*                 pNext;
    void*                       pHostPointer;
    uint32_t                    memoryRowLength;
    uint32_t                    memoryImageHeight;
    VkImageSubresourceLayers    imageSubresource;
    VkOffset3D                  imageOffset;
    VkExtent3D                  imageExtent;
} VkImageToMemoryCopy;

或等效的

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

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

  • pHostPointer 是主机内存地址,它是复制的目标。

  • memoryRowLengthmemoryImageHeight 在纹素中指定主机内存中较大的二维或三维图像的子区域,并控制寻址计算。如果这些值中的任何一个为零,则认为主机内存的该方面根据 imageExtent 紧密打包。

  • imageSubresource 是一个 VkImageSubresourceLayers,用于指定用于源或目标图像数据的图像的特定图像子资源。

  • imageOffset 选择源图像数据子区域中以纹素为单位的初始 xyz 偏移量。

  • imageExtent 是要复制的图像的大小,以纹素为单位,包括 widthheightdepth

此结构在功能上类似于 VkBufferImageCopy2,除了它定义主机内存作为复制的目标而不是缓冲区。特别是,这里也适用与该结构相同的数据打包规则和限制。

有效用法
  • VUID-VkImageToMemoryCopy-pHostPointer-09066
    pHostPointer 必须指向足够大的内存,以包含根据 缓冲区和图像寻址访问的所有内存位置,对于 pRegions 的每个元素。

  • VUID-VkImageToMemoryCopy-pRegions-09067
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-VkImageToMemoryCopy-memoryRowLength-09101
    memoryRowLength 必须0,或者大于或等于 imageExtentwidth 成员。

  • VUID-VkImageToMemoryCopy-memoryImageHeight-09102
    memoryImageHeight 必须0,或者大于或等于 imageExtentheight 成员。

  • VUID-VkImageToMemoryCopy-aspectMask-09103
    imageSubresourceaspectMask 成员必须只设置一个位。

  • VUID-VkImageToMemoryCopy-imageExtent-06659
    imageExtent.width 不得为 0。

  • VUID-VkImageToMemoryCopy-imageExtent-06660
    imageExtent.height 必须不为 0

  • VUID-VkImageToMemoryCopy-imageExtent-06661
    imageExtent.depth 必须不为 0

有效使用(隐式)
  • VUID-VkImageToMemoryCopy-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY

  • VUID-VkImageToMemoryCopy-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageToMemoryCopy-pHostPointer-parameter
    pHostPointer 必须是一个指针值。

  • VUID-VkImageToMemoryCopy-imageSubresource-parameter
    imageSubresource 必须是一个有效的 VkImageSubresourceLayers 结构体

VkCopyMemoryToImageInfo::flagsVkCopyImageToMemoryInfo::flagsVkCopyImageToImageInfo::flags 中,可以设置的位(用于指定额外的复制参数)包括:

// Provided by VK_VERSION_1_4
typedef enum VkHostImageCopyFlagBits {
    VK_HOST_IMAGE_COPY_MEMCPY = 0x00000001,
  // Provided by VK_EXT_host_image_copy
    VK_HOST_IMAGE_COPY_MEMCPY_EXT = VK_HOST_IMAGE_COPY_MEMCPY,
} VkHostImageCopyFlagBits;

或等效的

// Provided by VK_EXT_host_image_copy
typedef VkHostImageCopyFlagBits VkHostImageCopyFlagBitsEXT;
  • VK_HOST_IMAGE_COPY_MEMCPY 指定在数据复制期间不应用内存布局的置换。对于内存和图像之间的复制,此标志表示主机内存中的图像数据与设备上的图像数据以完全相同的方式进行置换。使用此标志表示实现**可能**使用简单的内存复制来在主机内存和设备内存之间传输数据。主机内存中置换数据的格式取决于平台,并且在此规范中未定义。

// Provided by VK_VERSION_1_4
typedef VkFlags VkHostImageCopyFlags;

或等效的

// Provided by VK_EXT_host_image_copy
typedef VkHostImageCopyFlags VkHostImageCopyFlagsEXT;

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

要使用主机将数据从一个图像对象复制到另一个图像对象,请调用:

// Provided by VK_VERSION_1_4
VkResult vkCopyImageToImage(
    VkDevice                                    device,
    const VkCopyImageToImageInfo*               pCopyImageToImageInfo);

或等效的命令

// Provided by VK_EXT_host_image_copy
VkResult vkCopyImageToImageEXT(
    VkDevice                                    device,
    const VkCopyImageToImageInfo*               pCopyImageToImageInfo);
  • device 是拥有 pCopyImageToImageInfo->srcImagepCopyImageToImageInfo->dstImage 的设备。

  • pCopyImageToImageInfo 是指向 VkCopyImageToImageInfo 结构的指针,该结构描述了复制参数。

此命令的功能与 vkCmdCopyImage2 类似,但它在主机上执行。主机访问 pCopyImageToImageInfo->srcImagepCopyImageToImageInfo->dstImage 的内存,如同它们是一致的

如果设备已写入 pCopyImageToImageInfo->srcImage 的内存,则不会自动使其对主机可用。在调用此复制命令之前,**必须**在设备上为该图像发出一个内存屏障,其中第二个同步范围包括 VK_PIPELINE_STAGE_HOST_BITVK_ACCESS_HOST_READ_BIT

由于队列提交会自动使主机内存对设备可见,因此在设备上使用 pCopyMemoryToImageInfo->dstImage 中的此复制操作的结果之前,无需内存屏障。

有效使用(隐式)
  • VUID-vkCopyImageToImage-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCopyImageToImage-pCopyImageToImageInfo-parameter
    pCopyImageToImageInfo **必须**是指向有效 VkCopyImageToImageInfo 结构的有效指针。

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_MEMORY_MAP_FAILED

VkCopyImageToImageInfo 结构定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkCopyImageToImageInfo {
    VkStructureType         sType;
    const void*             pNext;
    VkHostImageCopyFlags    flags;
    VkImage                 srcImage;
    VkImageLayout           srcImageLayout;
    VkImage                 dstImage;
    VkImageLayout           dstImageLayout;
    uint32_t                regionCount;
    const VkImageCopy2*     pRegions;
} VkCopyImageToImageInfo;

或等效的

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

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

  • flags 是一个 VkHostImageCopyFlagBits 值的位掩码,描述了额外的复制参数。

  • srcImage 是源图像。

  • srcImageLayout 是复制的源图像子资源的布局。

  • dstImage 是目标图像。

  • dstImageLayout 是用于复制的目标图像子资源的布局。

  • regionCount 是要复制的区域数。

  • pRegions 是指向 VkImageCopy2 结构体数组的指针,该数组指定要复制的区域。

在执行复制之前,vkCopyImageToImage 不会检查与 srcImagedstImage 关联的设备内存当前是否正在使用。应用程序**必须**保证在主机执行复制之前,任何先前提交的写入复制区域的命令都已完成。

有效用法
  • VUID-VkCopyImageToImageInfo-srcImage-09069
    srcImagedstImage **必须**使用相同的图像创建参数创建。

  • VUID-VkCopyImageToImageInfo-srcImage-09109
    如果 srcImage 是稀疏的,那么复制命令访问的所有内存范围必须按照 绑定资源内存中所述进行绑定。

  • VUID-VkCopyImageToImageInfo-srcImage-09111
    如果访问了 srcImage 的模板方面,并且创建 srcImage 时未使用 单独的模板用法,则 srcImage 必须已使用 VkImageCreateInfo::usage 中设置的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 创建。

  • VUID-VkCopyImageToImageInfo-srcImage-09112
    如果访问了 srcImage 的模板方面,并且创建 srcImage 时使用了 单独的模板用法,则 srcImage 必须已使用 VkImageStencilUsageCreateInfo::stencilUsage 中设置的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 创建。

  • VUID-VkCopyImageToImageInfo-srcImage-09113
    如果访问了 srcImage 的非模板方面,则 srcImage 必须已使用 VkImageCreateInfo::usage 中设置的 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 创建。

  • VUID-VkCopyImageToImageInfo-srcOffset-09114
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则每个 pRegions 元素中 srcOffset 成员的 xyz 成员**必须**为 0

  • VUID-VkCopyImageToImageInfo-srcImage-09115
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则每个 pRegions 元素的 extent 成员**必须**等于 srcSubresource 标识的 srcImage 的范围。

  • VUID-VkCopyImageToImageInfo-srcImage-07966
    如果 srcImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageToImageInfo-srcSubresource-07967
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyImageToImageInfo-srcSubresource-07968
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyImageToImageInfo-srcImage-07969
    创建 srcImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyImageToImageInfo-srcSubresource-07970
    每个 pRegions 元素指定的图像区域**必须**包含在 srcImage 的指定 srcSubresource 中。

  • VUID-VkCopyImageToImageInfo-srcSubresource-07971
    对于 pRegions 的每个元素,srcOffset.x(extent.width + srcOffset.x) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-VkCopyImageToImageInfo-srcSubresource-07972
    对于 pRegions 的每个元素,srcOffset.y(extent.height + srcOffset.y) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-VkCopyImageToImageInfo-srcImage-07979
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.y 必须0,且 extent.height 必须1

  • VUID-VkCopyImageToImageInfo-srcOffset-09104
    对于 pRegions 的每个元素,srcOffset.z(extent.depth + srcOffset.z) **必须**都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的深度。

  • VUID-VkCopyImageToImageInfo-srcImage-07980
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffset.z **必须**为 0,并且 extent.depth **必须**为 1

  • VUID-VkCopyImageToImageInfo-srcImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 srcOffset.x **必须**是 srcImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 srcOffset.x 不等于 srcSubresource 指定的子资源的宽度,则 srcOffset.x **必须**是 srcImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-srcImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 srcOffset.y **必须**是 srcImageVkFormat纹素块范围高度的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,且 srcOffset.y 不等于 srcSubresource 指定的子资源的高度,则 srcOffset.y 必须srcImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcImage-07276
    对于 pRegions 中的每个元素,srcOffset.z 必须srcImage纹素块范围深度的倍数,该深度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageToImageInfo-srcImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,且 srcOffset.xextent.width 的和不等于 srcSubresource 指定的子资源的宽度,则 extent.width 必须srcImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 srcOffset.xextent.height 的差值必须srcImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 srcOffset.xextent.width 的差值必须srcImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,且 srcOffset.xextent.height 的和不等于 srcSubresource 指定的子资源的宽度,则 extent.height 必须srcImageVkFormat纹素块扩展宽度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,且 srcOffset.yextent.height 的和不等于 srcSubresource 指定的子资源的高度,则 extent.height 必须srcImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,且 srcOffset.yextent.width 的和不等于 srcSubresource 指定的子资源的高度,则 extent.width 必须srcImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 srcOffset.yextent.height 的差值必须srcImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 srcOffset.yextent.width 的差值必须srcImageVkFormat纹素块扩展高度 的倍数。

  • VUID-VkCopyImageToImageInfo-srcImage-00209
    对于 pRegions 中的每个元素,如果 srcOffset.zextent.depth 的总和不等于 srcSubresource 指定的子资源的深度,则 extent.depth 必须srcImage纹素块范围深度的倍数,该深度由 srcImageVkFormat 指定。

  • VUID-VkCopyImageToImageInfo-srcSubresource-09105
    对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 指定 srcImage 中存在的 aspect。

  • VUID-VkCopyImageToImageInfo-srcImage-07981
    如果 srcImage 具有多平面图像格式,则对于 pRegions 的每个元素,srcSubresource.aspectMask 必须是单个有效的多平面方面掩码

  • VUID-VkCopyImageToImageInfo-srcImage-07983
    如果 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayer 必须0,并且 srcSubresource.layerCount 必须1

  • VUID-VkCopyImageToImageInfo-dstImage-09109
    如果 dstImage 是稀疏的,那么复制命令访问的所有内存范围必须按照绑定资源内存中所述进行绑定。

  • VUID-VkCopyImageToImageInfo-dstImage-09111
    如果访问了 dstImage 的模板方面,并且 dstImage 创建时未使用单独的模板用途,则 dstImage 必须VkImageCreateInfo::usage 中设置了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkCopyImageToImageInfo-dstImage-09112
    如果访问了 dstImage 的模板方面,并且 dstImage 创建时使用了单独的模板用途,则 dstImage 必须VkImageStencilUsageCreateInfo::stencilUsage 中设置了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkCopyImageToImageInfo-dstImage-09113
    如果访问了 dstImage 的非模板方面,则 dstImage 必须VkImageCreateInfo::usage 中设置了 VK_IMAGE_USAGE_HOST_TRANSFER_BIT

  • VUID-VkCopyImageToImageInfo-dstOffset-09114
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则 pRegions 的每个元素的 dstOffset 成员的 xyz 成员必须0

  • VUID-VkCopyImageToImageInfo-dstImage-09115
    如果 flags 包含 VK_HOST_IMAGE_COPY_MEMCPY,则 pRegions 中每个元素的 extent 成员必须等于由 dstSubresource 标识的 dstImage 的范围。

  • VUID-VkCopyImageToImageInfo-dstImage-07966
    如果 dstImage 是非稀疏的,则该图像或指定的不相交平面必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkCopyImageToImageInfo-dstSubresource-07967
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkCopyImageToImageInfo-dstSubresource-07968
    如果 dstSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须小于或等于创建 dstImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkCopyImageToImageInfo-dstImage-07969
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-VkCopyImageToImageInfo-dstSubresource-07970
    pRegions 中每个元素指定的图像区域必须包含在 dstImage 的指定 dstSubresource 中。

  • VUID-VkCopyImageToImageInfo-dstSubresource-07971
    对于 pRegions 的每个元素,dstOffset.x(extent.width + dstOffset.x) 必须 都大于或等于 0,且小于或等于 dstImage 的指定 dstSubresource 的宽度。

  • VUID-VkCopyImageToImageInfo-dstSubresource-07972
    对于 pRegions 中的每个元素,dstOffset.y(extent.height + dstOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度。

  • VUID-VkCopyImageToImageInfo-dstImage-07979
    如果 dstImage 的类型是 VK_IMAGE_TYPE_1D,则对于 pRegions 中的每个元素,dstOffset.y 必须0,且 extent.height 必须1

  • VUID-VkCopyImageToImageInfo-dstOffset-09104
    对于 pRegions 的每个元素,dstOffset.z(extent.depth + dstOffset.z)必须大于或等于 0 且小于或等于 dstImage 指定的 dstSubresource 的深度。

  • VUID-VkCopyImageToImageInfo-dstImage-07980
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffset.z 必须0extent.depth 必须1

  • VUID-VkCopyImageToImageInfo-dstImage-07274
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,则 dstOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10051
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 dstOffset.x 不等于由 dstSubresource 指定的子资源的宽度,则 dstOffset.x 必须dstImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-dstImage-07275
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 dstOffset.y 必须dstImageVkFormat纹素块范围高度的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10052
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHRVK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,并且 dstOffset.y 不等于由 dstSubresource 指定的子资源的高度,则 dstOffset.y 必须dstImageVkFormat纹素块范围高度的倍数。

  • VUID-VkCopyImageToImageInfo-dstImage-07276
    对于 pRegions 中的每个元素,dstOffset.z 必须dstImage纹素块范围深度的倍数,该深度由 dstImageVkFormat 指定。

  • VUID-VkCopyImageToImageInfo-dstImage-00207
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 dstOffset.xextent.width 之和不等于由 dstSubresource 指定的子资源的宽度,则 extent.width 必须dstImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10053
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,则 dstOffset.xextent.height 的差值必须dstImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10054
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,则 dstOffset.xextent.width 的差值必须dstImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10055
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,并且 dstOffset.xextent.height 的总和不等于由 dstSubresource 指定的子资源的宽度,则 extent.height 必须dstImageVkFormat纹素块范围宽度的倍数。

  • VUID-VkCopyImageToImageInfo-dstImage-00208
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,并且 dstOffset.yextent.height 的总和不等于由 dstSubresource 指定的子资源的高度,则 extent.height 必须dstImageVkFormat纹素块范围高度的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10056
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,并且 dstOffset.yextent.width 的总和不等于由 dstSubresource 指定的子资源的高度,那么 extent.width 必须dstImageVkFormat纹素块范围高度 的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10057
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,那么 dstOffset.yextent.height 的差值必须dstImageVkFormat纹素块范围高度 的倍数。

  • VUID-VkCopyImageToImageInfo-dstOffset-10058
    对于 pRegions 的每个元素,如果 VkCopyCommandTransformInfoQCOM::transform 等于 VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,那么 dstOffset.yextent.width 的差值必须dstImageVkFormat纹素块范围高度 的倍数。

  • VUID-VkCopyImageToImageInfo-dstImage-00209
    对于 pRegions 的每个元素,如果 dstOffset.zextent.depth 的总和不等于由 srcSubresource 指定的子资源的深度,那么 extent.depth 必须dstImageVkFormat纹素块范围深度 的倍数。

  • VUID-VkCopyImageToImageInfo-dstSubresource-09105
    对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 指定 dstImage 中存在的 aspect。

  • VUID-VkCopyImageToImageInfo-dstImage-07981
    如果 dstImage 具有多平面图像格式,那么对于 pRegions 的每个元素,dstSubresource.aspectMask 必须是单个有效的 多平面纵横比掩码 位。

  • VUID-VkCopyImageToImageInfo-dstImage-07983
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,那么对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,并且 dstSubresource.layerCount 必须1

  • VUID-VkCopyImageToImageInfo-srcImageLayout-09070
    srcImageLayout 必须指定 pRegions 中指定的 srcImage 的图像子资源的当前布局。

  • VUID-VkCopyImageToImageInfo-dstImageLayout-09071
    dstImageLayout 必须指定 pRegions 中指定的 dstImage 的图像子资源的当前布局。

  • VUID-VkCopyImageToImageInfo-srcImageLayout-09072
    srcImageLayout 必须VkPhysicalDeviceHostImageCopyProperties::pCopySrcLayouts 中返回的图像布局之一。

  • VUID-VkCopyImageToImageInfo-dstImageLayout-09073
    dstImageLayout 必须VkPhysicalDeviceHostImageCopyProperties::pCopyDstLayouts 中返回的图像布局之一。

有效使用(隐式)
  • VUID-VkCopyImageToImageInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO

  • VUID-VkCopyImageToImageInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkCopyImageToImageInfo-flags-parameter
    flags 必须VkHostImageCopyFlagBits 值的有效组合。

  • VUID-VkCopyImageToImageInfo-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyImageToImageInfo-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyImageToImageInfo-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-VkCopyImageToImageInfo-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkCopyImageToImageInfo-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效 VkImageCopy2 结构体数组的有效指针

  • VUID-VkCopyImageToImageInfo-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkCopyImageToImageInfo-commonparent
    dstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

间接复制

当复制参数在命令缓冲区创建时未知时,应用程序可以使用间接复制。

要通过在缓冲区中间接指定复制参数来在两个内存区域之间复制数据,请调用

// Provided by VK_NV_copy_memory_indirect
void vkCmdCopyMemoryIndirectNV(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             copyBufferAddress,
    uint32_t                                    copyCount,
    uint32_t                                    stride);
  • commandBuffer 是将记录命令的命令缓冲区。

  • copyBufferAddress 是指定复制参数的缓冲区地址。此缓冲区在内存中布局为 VkCopyMemoryIndirectCommandNV 结构的数组。

  • copyCount 是要执行的复制次数,可以为零。

  • stride 是连续的复制参数集之间的步长(以字节为单位)。

copyBufferAddress 读取的每个区域都从源区域复制到指定的目的地区域。如果任何源区域和目的地区域在内存中重叠,则结果是未定义的

有效用法
  • VUID-vkCmdCopyMemoryIndirectNV-None-07653
    必须启用 indirectCopy 功能。

  • VUID-vkCmdCopyMemoryIndirectNV-copyBufferAddress-07654
    copyBufferAddress 必须是 4 字节对齐的。

  • VUID-vkCmdCopyMemoryIndirectNV-stride-07655
    stride 必须4 的倍数,并且必须大于或等于 sizeof(VkCopyMemoryIndirectCommandNV)。

  • VUID-vkCmdCopyMemoryIndirectNV-commandBuffer-07656
    从其中分配 commandBufferVkCommandPool 必须支持至少一个 VkPhysicalDeviceCopyMemoryIndirectPropertiesNV::supportedQueues

有效使用(隐式)
  • VUID-vkCmdCopyMemoryIndirectNV-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyMemoryIndirectNV-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyMemoryIndirectNV-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyMemoryIndirectNV-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyMemoryIndirectNV-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

描述源和目标内存区域的结构 VkCopyMemoryIndirectCommandNV 定义为

// Provided by VK_NV_copy_memory_indirect
typedef struct VkCopyMemoryIndirectCommandNV {
    VkDeviceAddress    srcAddress;
    VkDeviceAddress    dstAddress;
    VkDeviceSize       size;
} VkCopyMemoryIndirectCommandNV;
  • srcAddress 是要从中复制的源设备内存的起始地址。

  • dstAddress 是要复制到的目标设备内存的起始地址。

  • size 是复制的大小(以字节为单位)。

有效用法
  • VUID-VkCopyMemoryIndirectCommandNV-srcAddress-07657
    srcAddress 必须是 4 字节对齐的。

  • VUID-VkCopyMemoryIndirectCommandNV-dstAddress-07658
    dstAddress 必须是 4 字节对齐的。

  • VUID-VkCopyMemoryIndirectCommandNV-size-07659
    size 必须是 4 字节对齐的。

要通过在缓冲区中指定复制参数来将数据从内存区域复制到图像对象,请调用

// Provided by VK_NV_copy_memory_indirect
void vkCmdCopyMemoryToImageIndirectNV(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             copyBufferAddress,
    uint32_t                                    copyCount,
    uint32_t                                    stride,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    const VkImageSubresourceLayers*             pImageSubresources);
  • commandBuffer 是将记录命令的命令缓冲区。

  • copyBufferAddress 是指定复制参数的缓冲区地址。此缓冲区在内存中布局为 VkCopyMemoryToImageIndirectCommandNV 结构的数组。

  • copyCount 是要执行的复制次数,可以为零。

  • stride 是连续的复制参数集之间的字节步长。

  • dstImage 是目标图像。

  • dstImageLayout 是用于复制的目标图像子资源的布局。

  • pImageSubresources 是一个指向大小为 copyCountVkImageSubresourceLayers 数组的指针,用于指定该复制操作的目标图像数据的特定图像子资源。

copyBufferAddress 中的每个区域都从源内存区域复制到目标图像中的一个区域。如果目标图像类型为 VK_IMAGE_TYPE_3D,则要复制的起始切片和切片数量分别在 pImageSubresources->baseArrayLayerpImageSubresources->layerCount 中指定。该复制操作必须在支持间接复制操作的队列上执行,请参阅 VkPhysicalDeviceCopyMemoryIndirectPropertiesNV

有效用法
  • VUID-vkCmdCopyMemoryToImageIndirectNV-None-07660
    必须启用 indirectCopy 功能。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07661
    dstImage 必须不是受保护的图像

  • VUID-vkCmdCopyMemoryToImageIndirectNV-aspectMask-07662
    pImageSubresources 中每个子资源的 aspectMask 成员必须只设置一个位

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07663
    copyBufferAddress 中每个元素指定的图像区域必须是包含在 dstImage 内的区域

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07664
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

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

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07973
    dstImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImageLayout-07667
    dstImageLayout 必须指定在 VkDevice 上执行此命令时 dstImage 的图像子资源的布局

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImageLayout-07669
    dstImageLayout 必须VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdCopyMemoryToImageIndirectNV-mipLevel-07670
    每个区域指定的 mipLevel 必须小于创建 dstImage 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdCopyMemoryToImageIndirectNV-layerCount-08764
    如果 layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则每个区域指定的 baseArrayLayer + layerCount 必须小于或等于创建 dstImage 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdCopyMemoryToImageIndirectNV-imageOffset-07672
    每个区域的 imageOffsetimageExtent 成员必须遵守 commandBuffer 的命令池的队列族的图像传输粒度要求,如 VkQueueFamilyProperties 中所述

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07673
    创建 dstImage 时,其 flags 必须不包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

  • VUID-vkCmdCopyMemoryToImageIndirectNV-commandBuffer-07674
    如果用于创建 VkCommandPool(从中分配 commandBuffer)的队列族不支持 VK_QUEUE_GRAPHICS_BIT,则对于每个区域,pImageSubresourcesaspectMask 成员必须不能是 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-vkCmdCopyMemoryToImageIndirectNV-imageOffset-07675
    对于 copyBufferAddress 中的每个区域,imageOffset.y(imageExtent.height + imageOffset.y)必须大于或等于 0,并且小于或等于指定子资源的高度

  • VUID-vkCmdCopyMemoryToImageIndirectNV-offset-07676
    offset 必须是 4 字节对齐的

  • VUID-vkCmdCopyMemoryToImageIndirectNV-stride-07677
    stride 必须4 的倍数,并且必须大于或等于 sizeof(VkCopyMemoryToImageIndirectCommandNV)

有效使用(隐式)
  • VUID-vkCmdCopyMemoryToImageIndirectNV-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-pImageSubresources-parameter
    pImageSubresources 必须是一个指向大小为 copyCount 的有效 VkImageSubresourceLayers 结构的有效指针

  • VUID-vkCmdCopyMemoryToImageIndirectNV-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdCopyMemoryToImageIndirectNV-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdCopyMemoryToImageIndirectNV-copyCount-arraylength
    copyCount 必须大于 0

  • VUID-vkCmdCopyMemoryToImageIndirectNV-commonparent
    commandBufferdstImage必须从同一个 VkDevice 创建、分配或检索

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

传输
图形
计算

动作

VkCopyMemoryToImageIndirectCommandNV 定义为

// Provided by VK_NV_copy_memory_indirect
typedef struct VkCopyMemoryToImageIndirectCommandNV {
    VkDeviceAddress             srcAddress;
    uint32_t                    bufferRowLength;
    uint32_t                    bufferImageHeight;
    VkImageSubresourceLayers    imageSubresource;
    VkOffset3D                  imageOffset;
    VkExtent3D                  imageExtent;
} VkCopyMemoryToImageIndirectCommandNV;
  • srcAddress 是要从中复制的源设备内存的起始地址。

  • bufferRowLengthbufferImageHeight 在纹素中指定缓冲区内存中较大的二维或三维图像的子区域,并控制寻址计算。如果这些值中的任何一个为零,则认为缓冲区内存的该方面根据 imageExtent 紧密打包。

  • imageSubresource 是一个 VkImageSubresourceLayers,用于指定目标图像数据所使用的特定图像子资源,它必须与命令记录期间 vkCmdCopyMemoryToImageIndirectNVpImageSubresources 参数中指定的值相匹配。

  • imageOffset 选择目标图像数据的子区域中初始的 xyz 纹素偏移量。

  • imageExtent 是目标图像在 widthheightdepth 中的纹素大小。

有效用法
  • VUID-VkCopyMemoryToImageIndirectCommandNV-srcAddress-07678
    srcAddress 必须是 4 字节对齐的。

  • VUID-VkCopyMemoryToImageIndirectCommandNV-bufferRowLength-07679
    bufferRowLength 必须0,或者大于或等于 imageExtentwidth 成员。

  • VUID-VkCopyMemoryToImageIndirectCommandNV-bufferImageHeight-07680
    bufferImageHeight 必须0,或者大于或等于 imageExtentheight 成员。

  • VUID-VkCopyMemoryToImageIndirectCommandNV-imageOffset-07681
    imageOffset 必须指定目标图像中的有效偏移量

  • VUID-VkCopyMemoryToImageIndirectCommandNV-imageExtent-07682
    imageExtent 必须指定目标图像中的有效区域,并且可以为 0

有效使用(隐式)
  • VUID-VkCopyMemoryToImageIndirectCommandNV-imageSubresource-parameter
    imageSubresource 必须是一个有效的 VkImageSubresourceLayers 结构体

图像复制与缩放

要将源图像的区域复制到目标图像,可能会执行格式转换、任意缩放和过滤,请调用

// Provided by VK_VERSION_1_0
void vkCmdBlitImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkImageBlit*                          pRegions,
    VkFilter                                    filter);
  • commandBuffer 是将记录命令的命令缓冲区。

  • srcImage 是源图像。

  • srcImageLayout 是用于 blit 的源图像子资源的布局。

  • dstImage 是目标图像。

  • dstImageLayout 是用于 blit 的目标图像子资源的布局。

  • regionCount 是要 blit 的区域数量。

  • pRegions 是指向 VkImageBlit 结构数组的指针,这些结构指定要 blit 的区域。

  • filter 是一个 VkFilter,指定如果 blit 需要缩放时要应用的过滤器。

vkCmdBlitImage 不得用于多重采样的源或目标图像。 请为此目的使用 vkCmdResolveImage

由于源和目标范围的大小在任何维度上可以不同,因此源范围中的纹素会缩放并过滤到目标范围。 缩放通过以下操作进行

  • 对于每个目标纹素,该纹素的整数坐标会使用 非规范化到整数转换 中描述的公式的有效逆向转换为非规范化纹理坐标。

    ubase = i + ½

    vbase = j + ½

    wbase = k + ½

  • 这些基本坐标然后通过第一个目标偏移量进行偏移

    uoffset = ubase - xdst0

    voffset = vbase - ydst0

    woffset = wbase - zdst0

    aoffset = a - baseArrayCountdst

  • 缩放比例由源和目标区域确定,并应用于偏移坐标

    scaleu = (xsrc1 - xsrc0) / (xdst1 - xdst0)

    scalev = (ysrc1 - ysrc0) / (ydst1 - ydst0)

    scalew = (zsrc1 - zsrc0) / (zdst1 - zdst0)

    uscaled = uoffset × scaleu

    vscaled = voffset × scalev

    wscaled = woffset × scalew

  • 最后,将源偏移量添加到缩放后的坐标,以确定用于从 srcImage 采样的最终非规范化坐标

    u = uscaled + xsrc0

    v = vscaled + ysrc0

    w = wscaled + zsrc0

    q = mipLevel

    a = aoffset + baseArrayCountsrc

这些坐标用于从源图像进行采样,如 图像操作章节 中所述,其中过滤模式等于 filter 的过滤模式,mipmap 模式为 VK_SAMPLER_MIPMAP_MODE_NEAREST,地址模式为 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE。 实现必须钳制在源图像的边缘,并且可以额外钳制在源区域的边缘。

由于在生成源纹理坐标时允许的舍入误差,因此无法始终保证为给定的 blit 采样哪些源纹素。 由于舍入误差与实现相关,因此 blit 操作的确切结果也与实现相关。

Blit 逐层执行,从源的 srcSubresourcebaseArrayLayer 成员和目标的 dstSubresource 开始。 layerCount 层 blit 到目标图像。

当 blit 3D 纹理时,目标区域中由 dstOffsets[0].z 和 dstOffsets[1].z 限定的切片是从源区域中由 srcOffsets[0].z 和 srcOffsets[1].z 限定的切片采样的。 如果 filter 参数是 VK_FILTER_LINEAR,则从源图像采样的值是通过使用先前方程中由 w 表示的插值 z 坐标执行线性滤波来获得的。 如果 filter 参数是 VK_FILTER_NEAREST,则从源图像采样的值取自单个最近的切片,其实现相关的算术舍入模式。

以下过滤和转换规则适用

  • 整数格式只能转换为具有相同符号的其他整数格式。

  • 深度/模板图像之间不支持格式转换。 格式必须匹配。

  • 图像的复制方面上的 unorm、snorm、缩放和打包浮点格式的格式转换是通过首先将像素转换为浮点值来执行的。

  • 对于 sRGB 源格式,非线性 RGB 值会在过滤之前转换为线性表示形式。

  • 过滤后,浮点值首先被钳制,然后强制转换为目标图像格式。 在 sRGB 目标格式的情况下,线性 RGB 值在将像素写入图像之前转换为非线性表示形式。

有符号和无符号整数的转换方式是:首先钳制到目标格式的可表示范围内,然后强制转换该值。

有效用法
  • VUID-vkCmdBlitImage-commandBuffer-01834
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdBlitImage-commandBuffer-01835
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdBlitImage-commandBuffer-01836
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

  • VUID-vkCmdBlitImage-pRegions-00215
    pRegions 的每个元素指定的源区域必须是包含在 srcImage 中的区域

  • VUID-vkCmdBlitImage-pRegions-00216
    pRegions 的每个元素指定的目标区域必须是包含在 dstImage 中的区域

  • VUID-vkCmdBlitImage-pRegions-00217
    pRegions 的元素指定的所有目标区域的并集,在内存中必须不与在 blit 操作期间可能被采样的任何纹素重叠

  • VUID-vkCmdBlitImage-srcImage-01999
    srcImage格式功能必须包含 VK_FORMAT_FEATURE_BLIT_SRC_BIT

  • VUID-vkCmdBlitImage-srcImage-06421
    srcImage 必须 不能使用需要采样器 Y′CBCR 转换的格式

  • VUID-vkCmdBlitImage-srcImage-00219
    srcImage 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-vkCmdBlitImage-srcImage-00220
    如果 srcImage 不是稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdBlitImage-srcImageLayout-00221
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-vkCmdBlitImage-srcImageLayout-01398
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdBlitImage-srcImage-09459
    如果 srcImagedstImage 相同,并且 pRegions 的一个元素包含具有匹配的 mipLevel 和重叠的数组层的 srcSubresourcedstSubresource,那么 srcImageLayoutdstImageLayout 必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_SHARED_PRESENT_KHR

  • VUID-vkCmdBlitImage-dstImage-02000
    dstImage格式特性必须包含 VK_FORMAT_FEATURE_BLIT_DST_BIT

  • VUID-vkCmdBlitImage-dstImage-06422
    dstImage 必须 不能使用需要采样器 Y′CBCR 转换的格式

  • VUID-vkCmdBlitImage-dstImage-00224
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

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

  • VUID-vkCmdBlitImage-dstImageLayout-00226
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-vkCmdBlitImage-dstImageLayout-01399
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdBlitImage-srcImage-00229
    如果 srcImagedstImage 中任何一个使用有符号整数 VkFormat 创建,则另一个必须也使用有符号整数 VkFormat 创建。

  • VUID-vkCmdBlitImage-srcImage-00230
    如果 srcImagedstImage 中任何一个使用无符号整数 VkFormat 创建,则另一个必须也使用无符号整数 VkFormat 创建。

  • VUID-vkCmdBlitImage-srcImage-00231
    如果 srcImagedstImage 中任何一个使用深度/模板格式创建,则另一个必须具有完全相同的格式。

  • VUID-vkCmdBlitImage-srcImage-00232
    如果 srcImage 使用深度/模板格式创建,则 filter 必须VK_FILTER_NEAREST

  • VUID-vkCmdBlitImage-srcImage-00233
    srcImage 必须 使用 samplesVK_SAMPLE_COUNT_1_BIT 创建。

  • VUID-vkCmdBlitImage-dstImage-00234
    dstImage 必须 使用 samplesVK_SAMPLE_COUNT_1_BIT 创建。

  • VUID-vkCmdBlitImage-filter-02001
    如果 filterVK_FILTER_LINEAR,则 srcImage格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdBlitImage-filter-02002
    如果 filterVK_FILTER_CUBIC_EXT,则 srcImage格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdBlitImage-filter-00237
    如果 filterVK_FILTER_CUBIC_EXT,则 srcImage 必须VK_IMAGE_TYPE_2D 类型。

  • VUID-vkCmdBlitImage-srcSubresource-01705
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdBlitImage-dstSubresource-01706
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdBlitImage-srcSubresource-01707
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdBlitImage-dstSubresource-01708
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须 小于或等于当创建 dstImage 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdBlitImage-dstImage-02545
    dstImagesrcImage 必须 不能使用包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXTflags 创建。

  • VUID-vkCmdBlitImage-maintenance8-10207
    如果启用了maintenance8 特性,并且 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayer 必须0,并且 srcSubresource.layerCount 必须1

  • VUID-vkCmdBlitImage-maintenance8-10208
    如果启用了maintenance8 特性,并且 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,并且 dstSubresource.layerCount 必须1

  • VUID-vkCmdBlitImage-srcImage-00240
    如果未启用maintenance8 特性,并且 srcImagedstImage 中任何一个的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayerdstSubresource.baseArrayLayer 必须 都为 0,并且 srcSubresource.layerCountdstSubresource.layerCount 必须 都为 1

  • VUID-vkCmdBlitImage-aspectMask-00241
    对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 指定 srcImage 中存在的 aspect。

  • VUID-vkCmdBlitImage-aspectMask-00242
    对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 指定 dstImage 中存在的 aspect。

  • VUID-vkCmdBlitImage-srcOffset-00243
    对于 pRegions 的每个元素,srcOffsets[0].x 和 srcOffsets[1].x 必须 都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-vkCmdBlitImage-srcOffset-00244
    对于 pRegions 的每个元素,srcOffsets[0].y 和 srcOffsets[1].y 必须 都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-vkCmdBlitImage-srcImage-00245
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffsets[0].y 必须0,并且 srcOffsets[1].y 必须1

  • VUID-vkCmdBlitImage-srcOffset-00246
    对于 pRegions 的每个元素,srcOffsets[0].z 和 srcOffsets[1].z 必须 都大于等于 0 且小于等于 srcImage 的指定 srcSubresource 的深度

  • VUID-vkCmdBlitImage-srcImage-00247
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffsets[0].z 必须0srcOffsets[1].z 必须1

  • VUID-vkCmdBlitImage-dstOffset-00248
    对于 pRegions 的每个元素,dstOffsets[0].x 和 dstOffsets[1].x 必须 都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的宽度

  • VUID-vkCmdBlitImage-dstOffset-00249
    对于 pRegions 的每个元素,dstOffsets[0].y 和 dstOffsets[1].y 必须 都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度

  • VUID-vkCmdBlitImage-dstImage-00250
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,dstOffsets[0].y 必须0dstOffsets[1].y 必须1

  • VUID-vkCmdBlitImage-dstOffset-00251
    对于 pRegions 的每个元素,dstOffsets[0].z 和 dstOffsets[1].z 必须 都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的深度

  • VUID-vkCmdBlitImage-dstImage-00252
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffsets[0].z 必须0dstOffsets[1].z 必须1

有效使用(隐式)
  • VUID-vkCmdBlitImage-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBlitImage-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdBlitImage-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdBlitImage-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdBlitImage-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdBlitImage-pRegions-parameter
    pRegions 必须 是指向 regionCount 个有效 VkImageBlit 结构体的有效指针数组

  • VUID-vkCmdBlitImage-filter-parameter
    filter 必须 是有效的 VkFilter

  • VUID-vkCmdBlitImage-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdBlitImage-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形操作

  • VUID-vkCmdBlitImage-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdBlitImage-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdBlitImage-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-vkCmdBlitImage-commonparent
    commandBufferdstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

图形

动作

VkImageBlit 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkImageBlit {
    VkImageSubresourceLayers    srcSubresource;
    VkOffset3D                  srcOffsets[2];
    VkImageSubresourceLayers    dstSubresource;
    VkOffset3D                  dstOffsets[2];
} VkImageBlit;
  • srcSubresource 是要从中进行位块传输的子资源。

  • srcOffsets 是指向两个 VkOffset3D 结构体的数组的指针,指定了 srcSubresource 内源区域的边界。

  • dstSubresource 是要将位块传输到的子资源。

  • dstOffsets 是指向两个 VkOffset3D 结构体的数组的指针,指定了 dstSubresource 内目标区域的边界。

对于 pRegions 数组的每个元素,都会为指定的源区域和目标区域执行位块传输操作。

有效用法
  • VUID-VkImageBlit-aspectMask-00238
    srcSubresourcedstSubresourceaspectMask 成员 必须 匹配

  • VUID-VkImageBlit-layerCount-08800
    如果 srcSubresourcedstSubresourcelayerCount 成员都不是 VK_REMAINING_ARRAY_LAYERS,则 srcSubresourcedstSubresourcelayerCount 成员 必须 匹配

  • VUID-VkImageBlit-layerCount-08801
    如果 srcSubresourcedstSubresourcelayerCount 成员之一是 VK_REMAINING_ARRAY_LAYERS,则另一个成员 必须 要么是 VK_REMAINING_ARRAY_LAYERS,要么等于用于创建图像的 VkImageCreateInfoarrayLayers 成员减去 baseArrayLayer

有效使用(隐式)

下面定义了位块传输图像命令的更可扩展的版本。

要将源图像的区域复制到目标图像,可能会执行格式转换、任意缩放和过滤,请调用

// Provided by VK_VERSION_1_3
void vkCmdBlitImage2(
    VkCommandBuffer                             commandBuffer,
    const VkBlitImageInfo2*                     pBlitImageInfo);

或等效的命令

// Provided by VK_KHR_copy_commands2
void vkCmdBlitImage2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkBlitImageInfo2*                     pBlitImageInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pBlitImageInfo 是指向 VkBlitImageInfo2 结构体的指针,该结构体描述了位块传输参数。

此命令在功能上与 vkCmdBlitImage 相同,但包含可扩展的子结构体,其中包括 sTypepNext 参数,从而可以更轻松地对其进行扩展。

有效用法
  • VUID-vkCmdBlitImage2-commandBuffer-01834
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdBlitImage2-commandBuffer-01835
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdBlitImage2-commandBuffer-01836
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

有效使用(隐式)
  • VUID-vkCmdBlitImage2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBlitImage2-pBlitImageInfo-parameter
    pBlitImageInfo 必须 是指向有效 VkBlitImageInfo2 结构体的有效指针

  • VUID-vkCmdBlitImage2-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdBlitImage2-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形操作

  • VUID-vkCmdBlitImage2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdBlitImage2-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

图形

动作

VkBlitImageInfo2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkBlitImageInfo2 {
    VkStructureType        sType;
    const void*            pNext;
    VkImage                srcImage;
    VkImageLayout          srcImageLayout;
    VkImage                dstImage;
    VkImageLayout          dstImageLayout;
    uint32_t               regionCount;
    const VkImageBlit2*    pRegions;
    VkFilter               filter;
} VkBlitImageInfo2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkBlitImageInfo2 VkBlitImageInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcImage 是源图像。

  • srcImageLayout 是用于 blit 的源图像子资源的布局。

  • dstImage 是目标图像。

  • dstImageLayout 是用于 blit 的目标图像子资源的布局。

  • regionCount 是要 blit 的区域数量。

  • pRegions 是一个指向 VkImageBlit2 结构数组的指针,用于指定要 blit 的区域。

  • filter 是一个 VkFilter,指定如果 blit 需要缩放时要应用的过滤器。

有效用法
  • VUID-VkBlitImageInfo2-pRegions-00215
    pRegions 的每个元素指定的源区域必须是包含在 srcImage 中的区域

  • VUID-VkBlitImageInfo2-pRegions-00216
    pRegions 的每个元素指定的目标区域必须是包含在 dstImage 中的区域

  • VUID-VkBlitImageInfo2-pRegions-00217
    pRegions 的元素指定的所有目标区域的并集,在内存中必须不与在 blit 操作期间可能被采样的任何纹素重叠

  • VUID-VkBlitImageInfo2-srcImage-01999
    srcImage格式功能必须包含 VK_FORMAT_FEATURE_BLIT_SRC_BIT

  • VUID-VkBlitImageInfo2-srcImage-06421
    srcImage 必须 不能使用需要采样器 Y′CBCR 转换的格式

  • VUID-VkBlitImageInfo2-srcImage-00219
    srcImage 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-VkBlitImageInfo2-srcImage-00220
    如果 srcImage 不是稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkBlitImageInfo2-srcImageLayout-00221
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-VkBlitImageInfo2-srcImageLayout-01398
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkBlitImageInfo2-srcImage-09459
    如果 srcImagedstImage 相同,并且 pRegions 的一个元素包含具有匹配的 mipLevel 和重叠的数组层的 srcSubresourcedstSubresource,那么 srcImageLayoutdstImageLayout 必须VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_SHARED_PRESENT_KHR

  • VUID-VkBlitImageInfo2-dstImage-02000
    dstImage格式特性必须包含 VK_FORMAT_FEATURE_BLIT_DST_BIT

  • VUID-VkBlitImageInfo2-dstImage-06422
    dstImage 必须 不能使用需要采样器 Y′CBCR 转换的格式

  • VUID-VkBlitImageInfo2-dstImage-00224
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

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

  • VUID-VkBlitImageInfo2-dstImageLayout-00226
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-VkBlitImageInfo2-dstImageLayout-01399
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkBlitImageInfo2-srcImage-00229
    如果 srcImagedstImage 中任何一个使用有符号整数 VkFormat 创建,则另一个必须也使用有符号整数 VkFormat 创建。

  • VUID-VkBlitImageInfo2-srcImage-00230
    如果 srcImagedstImage 中任何一个使用无符号整数 VkFormat 创建,则另一个必须也使用无符号整数 VkFormat 创建。

  • VUID-VkBlitImageInfo2-srcImage-00231
    如果 srcImagedstImage 中任何一个使用深度/模板格式创建,则另一个必须具有完全相同的格式。

  • VUID-VkBlitImageInfo2-srcImage-00232
    如果 srcImage 使用深度/模板格式创建,则 filter 必须VK_FILTER_NEAREST

  • VUID-VkBlitImageInfo2-srcImage-00233
    srcImage 必须 使用 samplesVK_SAMPLE_COUNT_1_BIT 创建。

  • VUID-VkBlitImageInfo2-dstImage-00234
    dstImage 必须 使用 samplesVK_SAMPLE_COUNT_1_BIT 创建。

  • VUID-VkBlitImageInfo2-filter-02001
    如果 filterVK_FILTER_LINEAR,则 srcImage格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-VkBlitImageInfo2-filter-02002
    如果 filterVK_FILTER_CUBIC_EXT,则 srcImage格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-VkBlitImageInfo2-filter-00237
    如果 filterVK_FILTER_CUBIC_EXT,则 srcImage 必须VK_IMAGE_TYPE_2D 类型。

  • VUID-VkBlitImageInfo2-srcSubresource-01705
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkBlitImageInfo2-dstSubresource-01706
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkBlitImageInfo2-srcSubresource-01707
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkBlitImageInfo2-dstSubresource-01708
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 的每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须 小于或等于当创建 dstImage 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkBlitImageInfo2-dstImage-02545
    dstImagesrcImage 必须 不能使用包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXTflags 创建。

  • VUID-VkBlitImageInfo2-maintenance8-10207
    如果启用了maintenance8 特性,并且 srcImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayer 必须0,并且 srcSubresource.layerCount 必须1

  • VUID-VkBlitImageInfo2-maintenance8-10208
    如果启用了maintenance8 特性,并且 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,并且 dstSubresource.layerCount 必须1

  • VUID-VkBlitImageInfo2-srcImage-00240
    如果未启用maintenance8 特性,并且 srcImagedstImage 中任何一个的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.baseArrayLayerdstSubresource.baseArrayLayer 必须 都为 0,并且 srcSubresource.layerCountdstSubresource.layerCount 必须 都为 1

  • VUID-VkBlitImageInfo2-aspectMask-00241
    对于 pRegions 的每个元素,srcSubresource.aspectMask 必须 指定 srcImage 中存在的 aspect。

  • VUID-VkBlitImageInfo2-aspectMask-00242
    对于 pRegions 的每个元素,dstSubresource.aspectMask 必须 指定 dstImage 中存在的 aspect。

  • VUID-VkBlitImageInfo2-srcOffset-00243
    对于 pRegions 的每个元素,srcOffsets[0].x 和 srcOffsets[1].x 必须 都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-VkBlitImageInfo2-srcOffset-00244
    对于 pRegions 的每个元素,srcOffsets[0].y 和 srcOffsets[1].y 必须 都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-VkBlitImageInfo2-srcImage-00245
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffsets[0].y 必须0,并且 srcOffsets[1].y 必须1

  • VUID-VkBlitImageInfo2-srcOffset-00246
    对于 pRegions 的每个元素,srcOffsets[0].z 和 srcOffsets[1].z 必须 都大于等于 0 且小于等于 srcImage 的指定 srcSubresource 的深度

  • VUID-VkBlitImageInfo2-srcImage-00247
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffsets[0].z 必须0srcOffsets[1].z 必须1

  • VUID-VkBlitImageInfo2-dstOffset-00248
    对于 pRegions 的每个元素,dstOffsets[0].x 和 dstOffsets[1].x 必须 都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的宽度

  • VUID-VkBlitImageInfo2-dstOffset-00249
    对于 pRegions 的每个元素,dstOffsets[0].y 和 dstOffsets[1].y 必须 都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度

  • VUID-VkBlitImageInfo2-dstImage-00250
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,dstOffsets[0].y 必须0dstOffsets[1].y 必须1

  • VUID-VkBlitImageInfo2-dstOffset-00251
    对于 pRegions 的每个元素,dstOffsets[0].z 和 dstOffsets[1].z 必须 都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的深度

  • VUID-VkBlitImageInfo2-dstImage-00252
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffsets[0].z 必须0dstOffsets[1].z 必须1

  • VUID-VkBlitImageInfo2-pRegions-04561
    如果 pRegions 的任何元素在其 pNext 链中包含 VkCopyCommandTransformInfoQCOM,则 srcImagedstImage **必须** 不是块压缩图像

  • VUID-VkBlitImageInfo2KHR-pRegions-06207
    如果 pRegions 的任何元素在其 pNext 链中包含 VkCopyCommandTransformInfoQCOM,则 srcImage 必须VK_IMAGE_TYPE_2D 类型。

  • VUID-VkBlitImageInfo2KHR-pRegions-06208
    如果 pRegions 的任何元素在其 pNext 链中包含 VkCopyCommandTransformInfoQCOM,则 srcImage 必须不能具有多平面格式

  • VUID-VkBlitImageInfo2-filter-09204
    如果 filterVK_FILTER_CUBIC_EXT 并且如果 selectableCubicWeights 功能未启用,则立方权重 **必须** 为 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

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

  • VUID-VkBlitImageInfo2-pNext-pNext
    pNext **必须** 为 NULL 或指向 VkBlitImageCubicWeightsInfoQCOM 的有效实例的指针

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

  • VUID-VkBlitImageInfo2-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-VkBlitImageInfo2-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkBlitImageInfo2-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-VkBlitImageInfo2-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkBlitImageInfo2-pRegions-parameter
    pRegions **必须** 是一个指向 regionCount 个有效 VkImageBlit2 结构的数组的有效指针

  • VUID-VkBlitImageInfo2-filter-parameter
    filter 必须 是有效的 VkFilter

  • VUID-VkBlitImageInfo2-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkBlitImageInfo2-commonparent
    dstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

如果 filterVK_FILTER_CUBIC_EXT 并且如果 VkBlitImageInfo2pNext 链包含 VkBlitImageCubicWeightsInfoQCOM 结构,则该结构指定在 blit 中使用的立方权重。如果该结构不存在,则立方权重被视为 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

VkBlitImageCubicWeightsInfoQCOM 结构定义如下:

// Provided by VK_QCOM_filter_cubic_weights
typedef struct VkBlitImageCubicWeightsInfoQCOM {
    VkStructureType             sType;
    const void*                 pNext;
    VkCubicFilterWeightsQCOM    cubicWeights;
} VkBlitImageCubicWeightsInfoQCOM;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • cubicWeights 是一个 VkCubicFilterWeightsQCOM 值,用于控制 blit 的三次滤波权重。

有效使用(隐式)
  • VUID-VkBlitImageCubicWeightsInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BLIT_IMAGE_CUBIC_WEIGHTS_INFO_QCOM

  • VUID-VkBlitImageCubicWeightsInfoQCOM-cubicWeights-parameter
    cubicWeights 必须是一个有效的 VkCubicFilterWeightsQCOM

VkImageBlit2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkImageBlit2 {
    VkStructureType             sType;
    const void*                 pNext;
    VkImageSubresourceLayers    srcSubresource;
    VkOffset3D                  srcOffsets[2];
    VkImageSubresourceLayers    dstSubresource;
    VkOffset3D                  dstOffsets[2];
} VkImageBlit2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkImageBlit2 VkImageBlit2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcSubresource 是要从中进行位块传输的子资源。

  • srcOffsets 是指向两个 VkOffset3D 结构体的数组的指针,指定了 srcSubresource 内源区域的边界。

  • dstSubresource 是要将位块传输到的子资源。

  • dstOffsets 是指向两个 VkOffset3D 结构体的数组的指针,指定了 dstSubresource 内目标区域的边界。

对于 pRegions 数组的每个元素,都会为指定的源区域和目标区域执行位块传输操作。

有效用法
  • VUID-VkImageBlit2-aspectMask-00238
    srcSubresourcedstSubresourceaspectMask 成员 必须 匹配

  • VUID-VkImageBlit2-layerCount-08800
    如果 srcSubresourcedstSubresourcelayerCount 成员都不是 VK_REMAINING_ARRAY_LAYERS,则 srcSubresourcedstSubresourcelayerCount 成员 必须 匹配

  • VUID-VkImageBlit2-layerCount-08801
    如果 srcSubresourcedstSubresourcelayerCount 成员之一是 VK_REMAINING_ARRAY_LAYERS,则另一个成员 必须 要么是 VK_REMAINING_ARRAY_LAYERS,要么等于用于创建图像的 VkImageCreateInfoarrayLayers 成员减去 baseArrayLayer

有效使用(隐式)
  • VUID-VkImageBlit2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_BLIT_2

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

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

  • VUID-VkImageBlit2-srcSubresource-parameter
    srcSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

  • VUID-VkImageBlit2-dstSubresource-parameter
    dstSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

对于 vkCmdBlitImage2,复制的每个区域都可以包含旋转。要指定旋转区域,请将 VkCopyCommandTransformInfoQCOM 添加到 VkImageBlit2pNext 链中。对于每个指定了旋转的区域,具有缩放和旋转的图像 Blit 指定了在从源图像采样之前如何旋转坐标。当指定旋转时,源图像和目标图像必须均为 2D 图像,具有 1x1x1 的纹素块范围,且仅有一个平面。

具有缩放和旋转的图像 Blit

VkCopyCommandTransformInfoQCOMVkImageBlit2pNext 链中时,指定的区域在 blit 期间会旋转。以下关于旋转寻址的描述将替换 vkCmdBlitImage 中的描述。

以下代码计算归一化坐标的旋转。

// rotation of normalized coordinates
VkOffset2D RotateNormUV(VkOffset2D in, VkSurfaceTransformFlagBitsKHR flags)
{
    VkOffset2D output;
    switch (flags)
    {
        case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
            out.x = in.x;
            out.y = in.y;
            break;
        case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
            out.x = in.y;
            out.y = 1.0 - in.x;
            break;
        case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
            out.x = 1.0 - in.x;
            out.y = 1.0 - in.y;
            break;
        case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
            out.x = 1.0 - in.y;
            out.y = in.x;
            break;
    }
    return out;
}
  • 对于每个目标纹素,该纹素的整数坐标会使用 非规范化到整数转换 中描述的公式的有效逆向转换为非规范化纹理坐标。

    ubase = i + ½

    vbase = j + ½

    wbase = k + ½

  • 这些基本坐标然后通过第一个目标偏移量进行偏移

    uoffset = ubase - xdst0

    voffset = vbase - ydst0

    woffset = wbase - zdst0

    aoffset = a - baseArrayCountdst

  • UV 目标坐标按目标区域缩放,旋转,然后按源区域缩放。

    udest_scaled = uoffset / (xdst1 - xdst0)

    vdest_scaled = voffset / (ydst1 - ydst0)

    (usrc_scaled, vsrc_scaled) = RotateNormUV(udest_scaled, vdest_scaled, transform)

    uscaled = usrc_scaled × (xSrc1 - xSrc0)

    vscaled = vsrc_scaled × (ySrc1 - ySrc0)

  • W 坐标不受旋转影响。比例尺由源区域和目标区域的比率确定,并应用于偏移坐标

    scalew = (zSrc1 - zSrc0) / (zdst1 - zdst0)

    wscaled = woffset × scalew

  • 最后,将源偏移量添加到缩放的源坐标,以确定用于从 srcImage 采样的最终非归一化坐标

    u = uscaled + xSrc0

    v = vscaled + ySrc0

    w = wscaled + zSrc0

    q = mipLevel

    a = aoffset + baseArrayCountsrc

这些坐标用于从源图像中采样,如 图像操作 中所述,其过滤模式等于 filter 的模式;mipmap 模式为 VK_SAMPLER_MIPMAP_MODE_NEAREST;地址模式为 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE。实现必须在源图像的边缘处进行钳制,并且可以另外在源区域的边缘处进行钳制。

解析多重采样图像

要将多重采样颜色图像解析为非多重采样颜色图像,请调用

// Provided by VK_VERSION_1_0
void vkCmdResolveImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkImageResolve*                       pRegions);
  • commandBuffer 是将记录命令的命令缓冲区。

  • srcImage 是源图像。

  • srcImageLayout 是用于解析的源图像子资源的布局。

  • dstImage 是目标图像。

  • dstImageLayout 是用于解析的目标图像子资源的布局。

  • regionCount 是要解析的区域的数量。

  • pRegions 是指向 VkImageResolve 结构的数组的指针,该结构指定要解析的区域。

在解析期间,源中每个像素位置对应的样本在写入目标之前被转换为单个样本。如果源格式为浮点或归一化类型,则每个像素的样本值以实现相关的方式解析。如果源格式为整数类型,则为每个像素选择单个样本的值。

srcOffsetdstOffset 选择源和目标图像数据的子区域中纹素的初始 xyz 偏移量。extent 是要解析的源图像的大小(以纹素为单位),单位为 widthheightdepthpRegions 的每个元素必须是包含在其对应图像内的区域。

解析是逐层进行的,从源的 srcSubresourcebaseArrayLayer 成员和目标的 dstSubresource 开始。layerCount 层被解析到目标图像。

有效用法
  • VUID-vkCmdResolveImage-commandBuffer-01837
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdResolveImage-commandBuffer-01838
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdResolveImage-commandBuffer-01839
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

  • VUID-vkCmdResolveImage-pRegions-00255
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-vkCmdResolveImage-srcImage-00256
    如果 srcImage 不是稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdResolveImage-srcImage-00257
    srcImage 必须具有等于任何有效样本计数值的样本计数,而不是 VK_SAMPLE_COUNT_1_BIT

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

  • VUID-vkCmdResolveImage-dstImage-00259
    dstImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-vkCmdResolveImage-srcImageLayout-00260
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-vkCmdResolveImage-srcImageLayout-01400
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdResolveImage-dstImageLayout-00262
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-vkCmdResolveImage-dstImageLayout-01401
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdResolveImage-dstImage-02003
    dstImage格式特性 必须包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-vkCmdResolveImage-linearColorAttachment-06519
    如果启用了linearColorAttachment 功能,并且使用 VK_IMAGE_TILING_LINEAR 创建了图像,则 dstImage格式特性 必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-vkCmdResolveImage-srcImage-01386
    srcImagedstImage 必须已使用相同的图像格式创建

  • VUID-vkCmdResolveImage-srcSubresource-01709
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdResolveImage-dstSubresource-01710
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-vkCmdResolveImage-srcSubresource-01711
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdResolveImage-dstSubresource-01712
    如果 dstSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须小于或等于创建 dstImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-vkCmdResolveImage-dstImage-02546
    dstImagesrcImage 必须 不能使用包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXTflags 创建。

  • VUID-vkCmdResolveImage-srcImage-04446
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.layerCount 必须1

  • VUID-vkCmdResolveImage-srcImage-04447
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,且 dstSubresource.layerCount 必须1

  • VUID-vkCmdResolveImage-srcOffset-00269
    对于 pRegions 的每个元素,srcOffset.x(extent.width + srcOffset.x) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-vkCmdResolveImage-srcOffset-00270
    对于 pRegions 的每个元素,srcOffset.y(extent.height + srcOffset.y) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-vkCmdResolveImage-srcImage-00271
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.y 必须0,且 extent.height 必须1

  • VUID-vkCmdResolveImage-srcOffset-00272
    对于 pRegions 的每个元素,srcOffset.z(extent.depth + srcOffset.z) **必须**都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的深度。

  • VUID-vkCmdResolveImage-srcImage-00273
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffset.z **必须**为 0,并且 extent.depth **必须**为 1

  • VUID-vkCmdResolveImage-dstOffset-00274
    对于 pRegions 的每个元素,dstOffset.x(extent.width + dstOffset.x) 必须 都大于或等于 0,且小于或等于 dstImage 的指定 dstSubresource 的宽度。

  • VUID-vkCmdResolveImage-dstOffset-00275
    对于 pRegions 中的每个元素,dstOffset.y(extent.height + dstOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度。

  • VUID-vkCmdResolveImage-dstImage-00276
    如果 dstImage 的类型是 VK_IMAGE_TYPE_1D,则对于 pRegions 中的每个元素,dstOffset.y 必须0,且 extent.height 必须1

  • VUID-vkCmdResolveImage-dstOffset-00277
    对于 pRegions 的每个元素,dstOffset.z(extent.depth + dstOffset.z)必须大于或等于 0 且小于或等于 dstImage 指定的 dstSubresource 的深度。

  • VUID-vkCmdResolveImage-dstImage-00278
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffset.z 必须0extent.depth 必须1

  • VUID-vkCmdResolveImage-srcImage-06762
    srcImage 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-vkCmdResolveImage-srcImage-06763
    srcImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

  • VUID-vkCmdResolveImage-dstImage-06764
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

  • VUID-vkCmdResolveImage-dstImage-06765
    dstImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

有效使用(隐式)
  • VUID-vkCmdResolveImage-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdResolveImage-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdResolveImage-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdResolveImage-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-vkCmdResolveImage-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdResolveImage-pRegions-parameter
    pRegions 必须是指向 regionCount 个有效 VkImageResolve 结构的数组的有效指针

  • VUID-vkCmdResolveImage-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdResolveImage-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形操作

  • VUID-vkCmdResolveImage-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdResolveImage-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdResolveImage-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-vkCmdResolveImage-commonparent
    commandBufferdstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

图形

动作

VkImageResolve 结构的定义如下

// Provided by VK_VERSION_1_0
typedef struct VkImageResolve {
    VkImageSubresourceLayers    srcSubresource;
    VkOffset3D                  srcOffset;
    VkImageSubresourceLayers    dstSubresource;
    VkOffset3D                  dstOffset;
    VkExtent3D                  extent;
} VkImageResolve;
  • srcSubresourcedstSubresourceVkImageSubresourceLayers 结构,分别指定用于源和目标图像数据的图像子资源。不支持深度/模板图像的解析。

  • srcOffsetdstOffset 选择源和目标图像数据子区域中纹素的初始 xyz 偏移量。

  • extent 是要解析的源图像在 widthheightdepth 中的纹素大小。

有效用法
  • VUID-VkImageResolve-aspectMask-00266
    srcSubresourcedstSubresourceaspectMask 成员必须仅包含 VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageResolve-layerCount-08803
    如果 srcSubresourcedstSubresourcelayerCount 成员都不是 VK_REMAINING_ARRAY_LAYERS,则 srcSubresourcedstSubresourcelayerCount 成员必须匹配

  • VUID-VkImageResolve-layerCount-08804
    如果 srcSubresourcedstSubresourcelayerCount 成员之一是 VK_REMAINING_ARRAY_LAYERS,则另一个成员 必须 要么是 VK_REMAINING_ARRAY_LAYERS,要么等于用于创建图像的 VkImageCreateInfoarrayLayers 成员减去 baseArrayLayer

有效使用(隐式)
  • VUID-VkImageResolve-srcSubresource-parameter
    srcSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

  • VUID-VkImageResolve-dstSubresource-parameter
    dstSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

下面定义了更可扩展版本的解析图像命令。

要将多采样图像解析为非多采样图像,请调用

// Provided by VK_VERSION_1_3
void vkCmdResolveImage2(
    VkCommandBuffer                             commandBuffer,
    const VkResolveImageInfo2*                  pResolveImageInfo);

或等效的命令

// Provided by VK_KHR_copy_commands2
void vkCmdResolveImage2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkResolveImageInfo2*                  pResolveImageInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pResolveImageInfo 是指向描述解析参数的 VkResolveImageInfo2 结构的指针。

此命令的功能与 vkCmdResolveImage 相同,但包含可扩展的子结构,其中包括 sTypepNext 参数,使它们更容易扩展。

有效用法
  • VUID-vkCmdResolveImage2-commandBuffer-01837
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 srcImage 必须不是受保护的图像

  • VUID-vkCmdResolveImage2-commandBuffer-01838
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是受保护的图像

  • VUID-vkCmdResolveImage2-commandBuffer-01839
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 dstImage 必须不是未受保护的图像

有效使用(隐式)
  • VUID-vkCmdResolveImage2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdResolveImage2-pResolveImageInfo-parameter
    pResolveImageInfo 必须是指向有效 VkResolveImageInfo2 结构的有效指针

  • VUID-vkCmdResolveImage2-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdResolveImage2-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形操作

  • VUID-vkCmdResolveImage2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdResolveImage2-videocoding
    此命令必须仅在视频编码范围之外调用。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

图形

动作

VkResolveImageInfo2 结构的定义如下

// Provided by VK_VERSION_1_3
typedef struct VkResolveImageInfo2 {
    VkStructureType           sType;
    const void*               pNext;
    VkImage                   srcImage;
    VkImageLayout             srcImageLayout;
    VkImage                   dstImage;
    VkImageLayout             dstImageLayout;
    uint32_t                  regionCount;
    const VkImageResolve2*    pRegions;
} VkResolveImageInfo2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkResolveImageInfo2 VkResolveImageInfo2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcImage 是源图像。

  • srcImageLayout 是用于解析的源图像子资源的布局。

  • dstImage 是目标图像。

  • dstImageLayout 是用于解析的目标图像子资源的布局。

  • regionCount 是要解析的区域的数量。

  • pRegions 是指向指定要解析的区域的 VkImageResolve2 结构数组的指针。

有效用法
  • VUID-VkResolveImageInfo2-pRegions-00255
    pRegions 的元素指定的每个源区域的并集,以及每个目标区域的并集,必须在内存中不重叠

  • VUID-VkResolveImageInfo2-srcImage-00256
    如果 srcImage 不是稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkResolveImageInfo2-srcImage-00257
    srcImage 必须具有等于任何有效样本计数值的样本计数,而不是 VK_SAMPLE_COUNT_1_BIT

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

  • VUID-VkResolveImageInfo2-dstImage-00259
    dstImage 必须具有等于 VK_SAMPLE_COUNT_1_BIT 的采样计数

  • VUID-VkResolveImageInfo2-srcImageLayout-00260
    srcImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 srcImage 的图像子资源的布局

  • VUID-VkResolveImageInfo2-srcImageLayout-01400
    srcImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkResolveImageInfo2-dstImageLayout-00262
    dstImageLayout 必须指定在 VkDevice 上执行此命令时,pRegions 中指定的 dstImage 的图像子资源的布局

  • VUID-VkResolveImageInfo2-dstImageLayout-01401
    dstImageLayout 必须VK_IMAGE_LAYOUT_SHARED_PRESENT_KHRVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMALVK_IMAGE_LAYOUT_GENERAL

  • VUID-VkResolveImageInfo2-dstImage-02003
    dstImage格式特性 必须包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT

  • VUID-VkResolveImageInfo2-linearColorAttachment-06519
    如果启用了linearColorAttachment 功能,并且使用 VK_IMAGE_TILING_LINEAR 创建了图像,则 dstImage格式特性 必须包含 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV

  • VUID-VkResolveImageInfo2-srcImage-01386
    srcImagedstImage 必须已使用相同的图像格式创建

  • VUID-VkResolveImageInfo2-srcSubresource-01709
    pRegions 中每个元素的 srcSubresource.mipLevel 成员必须小于创建 srcImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkResolveImageInfo2-dstSubresource-01710
    pRegions 中每个元素的 dstSubresource.mipLevel 成员必须小于创建 dstImage 时在VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkResolveImageInfo2-srcSubresource-01711
    如果 srcSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 srcSubresource.baseArrayLayer + srcSubresource.layerCount 必须小于或等于创建 srcImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkResolveImageInfo2-dstSubresource-01712
    如果 dstSubresource.layerCount 不是 VK_REMAINING_ARRAY_LAYERS,则 pRegions 中每个元素的 dstSubresource.baseArrayLayer + dstSubresource.layerCount 必须小于或等于创建 dstImage 时在VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkResolveImageInfo2-dstImage-02546
    dstImagesrcImage 必须 不能使用包含 VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXTflags 创建。

  • VUID-VkResolveImageInfo2-srcImage-04446
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,srcSubresource.layerCount 必须1

  • VUID-VkResolveImageInfo2-srcImage-04447
    如果 dstImage 的类型为 VK_IMAGE_TYPE_3D,则对于 pRegions 的每个元素,dstSubresource.baseArrayLayer 必须0,且 dstSubresource.layerCount 必须1

  • VUID-VkResolveImageInfo2-srcOffset-00269
    对于 pRegions 的每个元素,srcOffset.x(extent.width + srcOffset.x) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的宽度。

  • VUID-VkResolveImageInfo2-srcOffset-00270
    对于 pRegions 的每个元素,srcOffset.y(extent.height + srcOffset.y) 必须 都大于或等于 0,且小于或等于 srcImage 的指定 srcSubresource 的高度。

  • VUID-VkResolveImageInfo2-srcImage-00271
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1D,则对于 pRegions 的每个元素,srcOffset.y 必须0,且 extent.height 必须1

  • VUID-VkResolveImageInfo2-srcOffset-00272
    对于 pRegions 的每个元素,srcOffset.z(extent.depth + srcOffset.z) **必须**都大于或等于 0,并且小于或等于 srcImage 的指定 srcSubresource 的深度。

  • VUID-VkResolveImageInfo2-srcImage-00273
    如果 srcImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,srcOffset.z **必须**为 0,并且 extent.depth **必须**为 1

  • VUID-VkResolveImageInfo2-dstOffset-00274
    对于 pRegions 的每个元素,dstOffset.x(extent.width + dstOffset.x) 必须 都大于或等于 0,且小于或等于 dstImage 的指定 dstSubresource 的宽度。

  • VUID-VkResolveImageInfo2-dstOffset-00275
    对于 pRegions 中的每个元素,dstOffset.y(extent.height + dstOffset.y) 必须都大于等于 0 且小于等于 dstImage 的指定 dstSubresource 的高度。

  • VUID-VkResolveImageInfo2-dstImage-00276
    如果 dstImage 的类型是 VK_IMAGE_TYPE_1D,则对于 pRegions 中的每个元素,dstOffset.y 必须0,且 extent.height 必须1

  • VUID-VkResolveImageInfo2-dstOffset-00277
    对于 pRegions 的每个元素,dstOffset.z(extent.depth + dstOffset.z)必须大于或等于 0 且小于或等于 dstImage 指定的 dstSubresource 的深度。

  • VUID-VkResolveImageInfo2-dstImage-00278
    如果 dstImage 的类型为 VK_IMAGE_TYPE_1DVK_IMAGE_TYPE_2D,则对于 pRegions 的每个元素,dstOffset.z 必须0extent.depth 必须1

  • VUID-VkResolveImageInfo2-srcImage-06762
    srcImage 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 使用标志创建

  • VUID-VkResolveImageInfo2-srcImage-06763
    srcImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

  • VUID-VkResolveImageInfo2-dstImage-06764
    创建 dstImage必须使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法标志

  • VUID-VkResolveImageInfo2-dstImage-06765
    dstImage格式功能 必须包含 VK_FORMAT_FEATURE_TRANSFER_DST_BIT

有效使用(隐式)
  • VUID-VkResolveImageInfo2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2

  • VUID-VkResolveImageInfo2-pNext-pNext
    pNext 必须NULL

  • VUID-VkResolveImageInfo2-srcImage-parameter
    srcImage 必须是有效的 VkImage 句柄。

  • VUID-VkResolveImageInfo2-srcImageLayout-parameter
    srcImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkResolveImageInfo2-dstImage-parameter
    dstImage 必须是有效的 VkImage 句柄。

  • VUID-VkResolveImageInfo2-dstImageLayout-parameter
    dstImageLayout 必须是有效的 VkImageLayout 值。

  • VUID-VkResolveImageInfo2-pRegions-parameter
    pRegions 必须 是指向 regionCount 个有效 VkImageResolve2 结构体的数组的有效指针

  • VUID-VkResolveImageInfo2-regionCount-arraylength
    regionCount 必须大于 0

  • VUID-VkResolveImageInfo2-commonparent
    dstImagesrcImage必须是从同一个 VkDevice 创建、分配或检索的。

VkImageResolve2 结构体定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkImageResolve2 {
    VkStructureType             sType;
    const void*                 pNext;
    VkImageSubresourceLayers    srcSubresource;
    VkOffset3D                  srcOffset;
    VkImageSubresourceLayers    dstSubresource;
    VkOffset3D                  dstOffset;
    VkExtent3D                  extent;
} VkImageResolve2;

或等效的

// Provided by VK_KHR_copy_commands2
typedef VkImageResolve2 VkImageResolve2KHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • srcSubresourcedstSubresourceVkImageSubresourceLayers 结构,分别指定用于源和目标图像数据的图像子资源。不支持深度/模板图像的解析。

  • srcOffsetdstOffset 选择源和目标图像数据子区域中纹素的初始 xyz 偏移量。

  • extent 是要解析的源图像在 widthheightdepth 中的纹素大小。

有效用法
  • VUID-VkImageResolve2-aspectMask-00266
    srcSubresourcedstSubresourceaspectMask 成员必须仅包含 VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageResolve2-layerCount-08803
    如果 srcSubresourcedstSubresourcelayerCount 成员都不是 VK_REMAINING_ARRAY_LAYERS,则 srcSubresourcedstSubresourcelayerCount 成员必须匹配

  • VUID-VkImageResolve2-layerCount-08804
    如果 srcSubresourcedstSubresourcelayerCount 成员之一是 VK_REMAINING_ARRAY_LAYERS,则另一个成员 必须 要么是 VK_REMAINING_ARRAY_LAYERS,要么等于用于创建图像的 VkImageCreateInfoarrayLayers 成员减去 baseArrayLayer

有效使用(隐式)
  • VUID-VkImageResolve2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2

  • VUID-VkImageResolve2-pNext-pNext
    pNext 必须NULL

  • VUID-VkImageResolve2-srcSubresource-parameter
    srcSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

  • VUID-VkImageResolve2-dstSubresource-parameter
    dstSubresource 必须 是一个有效的 VkImageSubresourceLayers 结构体

缓冲区标记

要将 32 位标记值作为流水线操作写入缓冲区,请调用

// Provided by VK_AMD_buffer_marker with VK_VERSION_1_3 or VK_KHR_synchronization2
void vkCmdWriteBufferMarker2AMD(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlags2                       stage,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    uint32_t                                    marker);
  • commandBuffer 是将记录命令的命令缓冲区。

  • stage 指定触发标记写入的管线阶段的完成。

  • dstBuffer 是将写入标记的缓冲区。

  • dstOffset 是将写入标记的缓冲区中的字节偏移量。

  • marker 是标记的 32 位值。

只有在所有前面的命令至少在指定的管线阶段完成执行后,该命令才会将 32 位标记值写入缓冲区。这包括其他先前的 vkCmdWriteBufferMarker2AMD 命令的完成,只要它们指定的管线阶段与此命令指定的 stage 同时或更早发生。

虽然具有相同 stage 参数的连续缓冲区标记写入会按照提交顺序隐式完成,但缓冲区标记写入和其他操作之间的内存和执行依赖关系必须仍然使用同步命令显式排序。缓冲区标记写入的访问范围属于 VK_ACCESS_TRANSFER_WRITE_BIT,并且用于标识同步范围的管线阶段必须同时包括 stageVK_PIPELINE_STAGE_TRANSFER_BIT

类似于 vkCmdWriteTimestamp2,如果实现无法在任何特定的管线阶段写入标记,它可能会在任何逻辑上较晚的阶段执行此操作。

实现可能仅支持在给定时间内进行有限数量的正在进行中的流水线标记写入操作。因此,过多的标记写入操作可能会降低命令执行性能。

有效用法
  • VUID-vkCmdWriteBufferMarker2AMD-stage-03929
    如果未启用 geometryShader 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03930
    如果未启用 tessellationShader 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03931
    如果未启用 conditionalRendering 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03932
    如果未启用 fragmentDensityMap 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03933
    如果未启用 transformFeedback 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03934
    如果未启用 meshShader 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03935
    如果未启用 taskShader 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-vkCmdWriteBufferMarker2AMD-stage-07316
    如果 shadingRateImageattachmentFragmentShadingRate 功能均未启用,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdWriteBufferMarker2AMD-stage-04957
    如果未启用 subpassShading 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-vkCmdWriteBufferMarker2AMD-stage-04995
    如果未启用 invocationMask 功能,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-vkCmdWriteBufferMarker2AMD-stage-07946
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能均未启用,则 stage 必须 不包含 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWriteBufferMarker2AMD-synchronization2-03893
    必须 启用 synchronization2 功能。

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03894
    stage 必须 仅包含单个管线阶段。

  • VUID-vkCmdWriteBufferMarker2AMD-stage-03895
    stage 必须 仅包含对用于创建分配 commandBuffer 的命令池的队列族有效的阶段。

  • VUID-vkCmdWriteBufferMarker2AMD-dstOffset-03896
    dstOffset 必须 小于或等于 dstBuffer 的大小减去 4

  • VUID-vkCmdWriteBufferMarker2AMD-dstBuffer-03897
    dstBuffer 必须 使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 用法标志创建。

  • VUID-vkCmdWriteBufferMarker2AMD-dstBuffer-03898
    如果 dstBuffer 不是稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdWriteBufferMarker2AMD-dstOffset-03899
    dstOffset 必须4 的倍数。

有效使用(隐式)
  • VUID-vkCmdWriteBufferMarker2AMD-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdWriteBufferMarker2AMD-stage-parameter
    stage 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-vkCmdWriteBufferMarker2AMD-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkCmdWriteBufferMarker2AMD-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdWriteBufferMarker2AMD-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdWriteBufferMarker2AMD-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdWriteBufferMarker2AMD-commonparent
    commandBufferdstBuffer 必须 已从同一个 VkDevice 创建、分配或检索。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

两者

外部

传输
图形
计算

动作

要将 32 位标记值作为流水线操作写入缓冲区,请调用

// Provided by VK_AMD_buffer_marker
void vkCmdWriteBufferMarkerAMD(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlagBits                     pipelineStage,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    uint32_t                                    marker);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pipelineStage 是一个 VkPipelineStageFlagBits 值,指定完成时触发标记写入的管线阶段。

  • dstBuffer 是将写入标记的缓冲区。

  • dstOffset 是将写入标记的缓冲区中的字节偏移量。

  • marker 是标记的 32 位值。

只有在所有前面的命令至少执行到指定的管线阶段之后,该命令才会将 32 位标记值写入缓冲区。 这包括完成其他先前 vkCmdWriteBufferMarkerAMD 命令,只要它们指定的管线阶段与此命令指定的 pipelineStage 同时或更早发生。

虽然具有相同 pipelineStage 参数的连续缓冲区标记写入在提交顺序中隐式完成,但缓冲区标记写入和其他操作之间的内存和执行依赖关系必须仍使用同步命令显式排序。 缓冲区标记写入的访问范围属于 VK_ACCESS_TRANSFER_WRITE_BIT,用于标识同步范围的管线阶段必须包括 pipelineStageVK_PIPELINE_STAGE_TRANSFER_BIT

vkCmdWriteTimestamp 类似,如果实现无法在任何特定管线阶段写入标记,则可以改为在逻辑上较晚的阶段执行此操作。

实现可能仅支持在给定时间内有限数量的流水线标记写入操作,因此过多的标记写入操作可能会降低命令执行性能。

有效用法
  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04074
    pipelineStage 必须 是用于创建分配 commandBuffer 的命令池的队列族的有效阶段

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04075
    如果未启用 geometryShader 功能,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04076
    如果未启用 tessellationShader 功能,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04077
    如果未启用 conditionalRendering 功能,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04078
    如果未启用 fragmentDensityMap 特性,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04079
    如果未启用 transformFeedback 特性,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04080
    如果未启用 meshShader 特性,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-07077
    如果未启用 taskShader 特性,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdWriteBufferMarkerAMD-shadingRateImage-07314
    如果 shadingRateImage attachmentFragmentShadingRate 特性均未启用,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdWriteBufferMarkerAMD-synchronization2-06489
    如果未启用 synchronization2 特性,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_NONE

  • VUID-vkCmdWriteBufferMarkerAMD-rayTracingPipeline-07943
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 特性均未启用,则 pipelineStage 必须 不能为 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798
    dstOffset 必须 小于或等于 dstBuffer 的大小减去 4

  • VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799
    dstBuffer 必须已使用 VK_BUFFER_USAGE_TRANSFER_DST_BIT 使用标志创建

  • VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800
    如果 dstBuffer 不是稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801
    dstOffset 必须4 的倍数。

有效使用(隐式)
  • VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter
    如果 pipelineStage 不为 0,则 pipelineStage 必须 是一个有效的 VkPipelineStageFlagBits

  • VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter
    dstBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording
    commandBuffer 必须处于记录状态

  • VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持传输、图形或计算操作。

  • VUID-vkCmdWriteBufferMarkerAMD-videocoding
    此命令必须仅在视频编码范围之外调用。

  • VUID-vkCmdWriteBufferMarkerAMD-commonparent
    commandBufferdstBuffer 必须 已从同一个 VkDevice 创建、分配或检索。

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

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

两者

外部

传输
图形
计算

动作