Function Prototype

vkCmdCopyMemoryToImageIndirectNV

Copy data from a memory region into an image
primary / secondary
outside
transfer / graphics / compute
action

To copy data from a memory region to an image object by specifying copy parameters in a buffer, call:

void vkCmdCopyMemoryToImageIndirectNV(
    VkCommandBuffer commandBuffer,
    VkDeviceAddress copyBufferAddress,
    uint32_t copyCount,
    uint32_t stride,
    VkImage dstImage,
    VkImageLayout dstImageLayout,
    const VkImageSubresourceLayers* pImageSubresources);
  • commandBuffer is the command buffer into which the command will be recorded.
  • copyBufferAddress is the buffer address specifying the copy parameters. This buffer is laid out in memory as an array of VkCopyMemoryToImageIndirectCommandNV structures.
  • copyCount is the number of copies to execute, and can be zero.
  • stride is the byte stride between successive sets of copy parameters.
  • dstImage is the destination image.
  • dstImageLayout is the layout of the destination image subresources for the copy.
  • pImageSubresources is a pointer to an array of size copyCount of VkImageSubresourceLayers used to specify the specific image subresource of the destination image data for that copy.

Each region in copyBufferAddress is copied from the source memory region to an image region in the destination image. If the destination image is of type VK_IMAGE_TYPE_3D, the starting slice and number of slices to copy are specified in pImageSubresources→baseArrayLayer and pImageSubresources→layerCount respectively. The copy must be performed on a queue that supports indirect copy operations, see VkPhysicalDeviceCopyMemoryIndirectPropertiesNV.

Valid Usage

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07661

dstImage must not be a protected image

VUID-vkCmdCopyMemoryToImageIndirectNV-aspectMask-07662

The aspectMask member for every subresource in pImageSubresources must only have a single bit set

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07663

The image region specified by each element in copyBufferAddressmust be a region that is contained within dstImage

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07664

dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07665

If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07973

dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImageLayout-07667

dstImageLayout must specify the layout of the image subresources of dstImage at the time this command is executed on a VkDevice

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImageLayout-07669

dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, or VK_IMAGE_LAYOUT_GENERAL

VUID-vkCmdCopyMemoryToImageIndirectNV-mipLevel-07670

The specified mipLevel of each region must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created

VUID-vkCmdCopyMemoryToImageIndirectNV-layerCount-08764

If layerCount is not VK_REMAINING_ARRAY_LAYERS, the specified baseArrayLayer + layerCount of each region must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created

VUID-vkCmdCopyMemoryToImageIndirectNV-imageOffset-07672

The imageOffset and imageExtent members of each region must respect the image transfer granularity requirements of commandBuffer’s command pool’s queue family, as described in VkQueueFamilyProperties

VUID-vkCmdCopyMemoryToImageIndirectNV-dstImage-07673

dstImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT

VUID-vkCmdCopyMemoryToImageIndirectNV-commandBuffer-07674

If the queue family used to create the VkCommandPool which commandBuffer was allocated from does not support VK_QUEUE_GRAPHICS_BIT, for each region, the aspectMask member of pImageSubresources must not be VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT

VUID-vkCmdCopyMemoryToImageIndirectNV-imageOffset-07675

For each region in copyBufferAddress, 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 subresource

VUID-vkCmdCopyMemoryToImageIndirectNV-stride-07677

stride must be a multiple of 4 and must be greater than or equal to sizeof(VkCopyMemoryToImageIndirectCommandNV)

Valid Usage (Implicit)

VUID-vkCmdCopyMemoryToImageIndirectNV-pImageSubresources-parameter

pImageSubresources must be a valid pointer to an array of copyCount valid VkImageSubresourceLayers structures

VUID-vkCmdCopyMemoryToImageIndirectNV-commandBuffer-cmdpool

The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations

VUID-vkCmdCopyMemoryToImageIndirectNV-renderpass

This command must only be called outside of a render pass instance

VUID-vkCmdCopyMemoryToImageIndirectNV-videocoding

This command must only be called outside of a video coding scope

VUID-vkCmdCopyMemoryToImageIndirectNV-commonparent

Both of commandBuffer, and dstImage must have been created, allocated, or retrieved from the same VkDevice

Host Synchronization

  • Host access to commandBuffer must be externally synchronized
  • Host access to the VkCommandPool that commandBuffer was allocated from must be externally synchronized ::