## C Specification

The VkSparseMemoryBind structure is defined as:

typedef struct VkSparseMemoryBind {
VkDeviceSize               resourceOffset;
VkDeviceSize               size;
VkDeviceMemory             memory;
VkDeviceSize               memoryOffset;
VkSparseMemoryBindFlags    flags;
} VkSparseMemoryBind;

## Members

• resourceOffset is the offset into the resource.

• size is the size of the memory region to be bound.

• memory is the VkDeviceMemory object that the range of the resource is bound to. If memory is VK_NULL_HANDLE, the range is unbound.

• memoryOffset is the offset into the VkDeviceMemory object to bind the resource range to. If memory is VK_NULL_HANDLE, this value is ignored.

• flags is a bitmask of VkSparseMemoryBindFlagBits specifying usage of the binding operation.

## Description

The binding range [resourceOffset, resourceOffset + size) has different constraints based on flags. If flags contains VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range must be within the mip tail region of the metadata aspect. This metadata region is defined by:

metadataRegion = [base, base + imageMipTailSize)

base = imageMipTailOffset + imageMipTailStride × n

and imageMipTailOffset, imageMipTailSize, and imageMipTailStride values are from the VkSparseImageMemoryRequirements corresponding to the metadata aspect of the image, and n is a valid array layer index for the image,

imageMipTailStride is considered to be zero for aspects where VkSparseImageMemoryRequirements::formatProperties.flags contains VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT.

If flags does not contain VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range must be within the range [0,VkMemoryRequirements::size).

Valid Usage
• If memory is not VK_NULL_HANDLE, memory and memoryOffset must match the memory requirements of the resource, as described in section ../../html/vkspec.html#resources-association

• If memory is not VK_NULL_HANDLE, memory must not have been created with a memory type that reports VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set

• size must be greater than 0

• resourceOffset must be less than the size of the resource

• size must be less than or equal to the size of the resource minus resourceOffset

• memoryOffset must be less than the size of memory

• size must be less than or equal to the size of memory minus memoryOffset

Valid Usage (Implicit)
• If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle

• flags must be a valid combination of VkSparseMemoryBindFlagBits values