## C Specification

The VkCopyImageToBufferInfo2KHR structure is defined as:

// Provided by VK_KHR_copy_commands2
typedef struct VkCopyImageToBufferInfo2KHR {
VkStructureType                 sType;
const void*                     pNext;
VkImage                         srcImage;
VkImageLayout                   srcImageLayout;
VkBuffer                        dstBuffer;
uint32_t                        regionCount;
const VkBufferImageCopy2KHR*    pRegions;
} VkCopyImageToBufferInfo2KHR;

## Members

• sType is the type of this structure.

• pNext is NULL or a pointer to a structure extending this structure.

• srcImage is the source image.

• srcImageLayout is the layout of the source image subresources for the copy.

• dstBuffer is the destination buffer.

• regionCount is the number of regions to copy.

• pRegions is a pointer to an array of VkBufferImageCopy2KHR structures specifying the regions to copy.

## Description

Valid Usage
• VUID-VkCopyImageToBufferInfo2KHR-pRegions-00183
dstBuffer must be large enough to contain all buffer locations that are accessed according to Buffer and Image Addressing, for each element of pRegions

• VUID-VkCopyImageToBufferInfo2KHR-pRegions-00184
The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-00186
srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-01998
The format features of srcImage must contain VK_FORMAT_FEATURE_TRANSFER_SRC_BIT

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-00187
If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object

• VUID-VkCopyImageToBufferInfo2KHR-dstBuffer-00191
dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag

• VUID-VkCopyImageToBufferInfo2KHR-dstBuffer-00192
If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-00188
srcImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT

• VUID-VkCopyImageToBufferInfo2KHR-srcImageLayout-00189
srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice

• VUID-VkCopyImageToBufferInfo2KHR-srcImageLayout-01397
srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR

• VUID-VkCopyImageToBufferInfo2KHR-imageSubresource-01703
The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created

• VUID-VkCopyImageToBufferInfo2KHR-imageSubresource-01704
The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created

• VUID-VkCopyImageToBufferInfo2KHR-imageOffset-01794
The imageOffset and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer’s command pool’s queue family, as described in VkQueueFamilyProperties

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-02544
srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

• VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00197
For each element of pRegions not containing VkCopyCommandTransformInfoQCOM in its pNext chain, imageOffset.x and (imageExtent.width + imageOffset.x) must both be greater than or equal to 0 and less than or equal to the width of the specified imageSubresource of srcImage

• VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00198
For each element of pRegions not containing VkCopyCommandTransformInfoQCOM in its pNext chain, imageOffset.y and (imageExtent.height + imageOffset.y) must both be greater than or equal to 0 and less than or equal to the height of the specified imageSubresource of srcImage

• VUID-VkCopyImageToBufferInfo2KHR-bufferOffset-01558
If {imageparam} does not have either a depth/stencil or a multi-planar format, then for each element of pRegions, bufferOffset must be a multiple of the format’s texel block size

• VUID-VkCopyImageToBufferInfo2KHR-bufferOffset-01559
If {imageparam} has a multi-planar format, then for each element of pRegions, bufferOffset must be a multiple of the element size of the compatible format for the format and the aspectMask of the imageSubresource as defined in [formats-compatible-planes]

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-00199
If {imageparam} is of type VK_IMAGE_TYPE_1D, then for each element of pRegions, imageOffset.y must be 0 and imageExtent.height must be 1

• VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00200
For each element of pRegions, imageOffset.z and (imageExtent.depth + imageOffset.z) must both be greater than or equal to 0 and less than or equal to the depth of the specified imageSubresource of {imageparam}

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-00201
If {imageparam} is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then for each element of pRegions, imageOffset.z must be 0 and imageExtent.depth must be 1

• VUID-VkCopyImageToBufferInfo2KHR-bufferRowLength-00203
If {imageparam} is a blocked image, for each element of pRegions, bufferRowLength must be a multiple of the compressed texel block width

• VUID-VkCopyImageToBufferInfo2KHR-bufferImageHeight-00204
If {imageparam} is a blocked image, for each element of pRegions, bufferImageHeight must be a multiple of the compressed texel block height

• VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00205
If {imageparam} is a blocked image, for each element of pRegions, all members of imageOffset must be a multiple of the corresponding dimensions of the compressed texel block

• VUID-VkCopyImageToBufferInfo2KHR-bufferOffset-00206
If {imageparam} is a blocked image, for each element of pRegions, bufferOffset must be a multiple of the compressed texel block size in bytes

• VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00207
If {imageparam} is a blocked image, for each element of pRegions, imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the width of the specified imageSubresource of {imageparam}

• VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00208
If {imageparam} is a blocked image, for each element of pRegions, imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the height of the specified imageSubresource of {imageparam}

• VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00209
If {imageparam} is a blocked image, for each element of pRegions, imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the depth of the specified imageSubresource of {imageparam}

For each element of pRegions, imageSubresource.aspectMask must specify aspects present in {imageparam}

If {imageparam} has a multi-planar format, then for each element of pRegions, imageSubresource.aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT (with VK_IMAGE_ASPECT_PLANE_2_BIT valid only for image formats with three planes)

• VUID-VkCopyImageToBufferInfo2KHR-baseArrayLayer-00213
If {imageparam} is of type VK_IMAGE_TYPE_3D, for each element of pRegions, imageSubresource.baseArrayLayer must be 0 and imageSubresource.layerCount must be 1

• VUID-VkCopyImageToBufferInfo2KHR-pRegions-04725
If {imageparam} is not a blocked image, for each element of pRegions, bufferRowLength multiplied by the texel block size of {imageparam} must be less than or equal to 231-1

• VUID-VkCopyImageToBufferInfo2KHR-pRegions-04726
If {imageparam} is a blocked image, for each element of pRegions, bufferRowLength divided by the compressed texel block width and then multiplied by the texel block size of {imageparam} must be less than or equal to 231-1

• VUID-VkCopyImageToBufferInfo2KHR-commandBuffer-04052
If the queue family used to create the VkCommandPool which commandBuffer was allocated from does not support VK_QUEUE_GRAPHICS_BIT or VK_QUEUE_COMPUTE_BIT, the bufferOffset member of any element of pRegions must be a multiple of 4

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-04053
If {imageparam} has a depth/stencil format, the bufferOffset member of any element of pRegions must be a multiple of 4

Valid Usage (Implicit)
• VUID-VkCopyImageToBufferInfo2KHR-sType-sType
sType must be VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR

• VUID-VkCopyImageToBufferInfo2KHR-pNext-pNext
pNext must be NULL

• VUID-VkCopyImageToBufferInfo2KHR-srcImage-parameter
srcImage must be a valid VkImage handle

• VUID-VkCopyImageToBufferInfo2KHR-srcImageLayout-parameter
srcImageLayout must be a valid VkImageLayout value

• VUID-VkCopyImageToBufferInfo2KHR-dstBuffer-parameter
dstBuffer must be a valid VkBuffer handle

• VUID-VkCopyImageToBufferInfo2KHR-pRegions-parameter
pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy2KHR structures

• VUID-VkCopyImageToBufferInfo2KHR-regionCount-arraylength
regionCount must be greater than 0

• VUID-VkCopyImageToBufferInfo2KHR-commonparent
Both of dstBuffer, and srcImage must have been created, allocated, or retrieved from the same VkDevice