1// Copyright 2015-2023 The Khronos Group Inc. 2// 3// SPDX-License-Identifier: CC-BY-4.0 4 5[[sparsememory]] 6= Sparse Resources 7 8As documented in <<resources-association,Resource Memory Association>>, 9sname:VkBuffer and sname:VkImage resources in Vulkan must: be bound 10completely and contiguously to a single sname:VkDeviceMemory object. 11This binding must: be done before the resource is used, and the binding is 12immutable for the lifetime of the resource. 13 14_Sparse resources_ relax these restrictions and provide these additional 15features: 16 17 * Sparse resources can: be bound non-contiguously to one or more 18 sname:VkDeviceMemory allocations. 19 * Sparse resources can: be re-bound to different memory allocations over 20 the lifetime of the resource. 21 * Sparse resources can: have descriptors generated and used orthogonally 22 with memory binding commands. 23 24ifdef::VKSC_VERSION_1_0[] 25Sparse resources are not supported in Vulkan SC, due to complexity and the 26necessity of being able to update page table mappings at runtime <<SCID-8>>. 27However, the sparse resource features, properties, resource creation flags, 28and definitions have been retained for completeness and compatibility. 29 30All sparse resource <<sparsememory-physicalfeatures,physical device 31features>> must: not be advertised as supported, and the related 32<<sparsememory-physicalprops,physical device sparse properties>> and 33<<limits,physical device limits>> must: be reported accordingly. 34 35ifdef::hidden[] 36// tag::scremoved[] 37 * elink:VkStructureType 38 ** ename:VK_STRUCTURE_TYPE_BIND_SPARSE_INFO <<SCID-8>> 39 ** ename:VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO <<SCID-8>> 40 ** ename:VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 41 <<SCID-8>> 42 ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 43 <<SCID-8>> 44 ** ename:VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 <<SCID-8>> 45 ** ename:VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 <<SCID-8>> 46 * sname:VkSparseImageFormatProperties <<SCID-8>> 47 * ename:VkSparseImageFormatFlagBits <<SCID-8>> 48 * tname:VkSparseImageFormatFlags <<SCID-8>> 49 * fname:vkGetPhysicalDeviceSparseImageFormatProperties <<SCID-8>> 50 * fname:vkGetPhysicalDeviceSparseImageFormatProperties2 <<SCID-8>> 51 * sname:VkPhysicalDeviceSparseImageFormatInfo2 <<SCID-8>> 52 * sname:VkSparseImageFormatProperties2 <<SCID-8>> 53 * sname:VkSparseImageMemoryRequirements <<SCID-8>> 54 * fname:vkGetImageSparseMemoryRequirements <<SCID-8>> 55 * fname:vkGetImageSparseMemoryRequirements2 <<SCID-8>> 56 * sname:VkImageSparseMemoryRequirementsInfo2 <<SCID-8>> 57 * sname:VkSparseImageMemoryRequirements2 <<SCID-8>> 58 * sname:VkSparseMemoryBind <<SCID-8>> 59 * ename:VkSparseMemoryBindFlagBits <<SCID-8>> 60 * tname:VkSparseMemoryBindFlags <<SCID-8>> 61 * sname:VkSparseBufferMemoryBindInfo <<SCID-8>> 62 * sname:VkSparseImageOpaqueMemoryBindInfo <<SCID-8>> 63 * sname:VkSparseImageMemoryBindInfo <<SCID-8>> 64 * sname:VkSparseImageMemoryBind <<SCID-8>> 65 * fname:vkQueueBindSparse <<SCID-8>> 66 * sname:VkBindSparseInfo <<SCID-8>> 67 * sname:VkDeviceGroupBindSparseInfo <<SCID-8>> 68// end::scremoved[] 69endif::hidden[] 70endif::VKSC_VERSION_1_0[] 71 72[[sparsememory-sparseresourcefeatures]] 73== Sparse Resource Features 74 75Sparse resources have several features that must: be enabled explicitly at 76resource creation time. 77The features are enabled by including bits in the pname:flags parameter of 78slink:VkImageCreateInfo or slink:VkBufferCreateInfo. 79Each feature also has one or more corresponding feature enables specified in 80slink:VkPhysicalDeviceFeatures. 81 82 * The <<features-sparseBinding, pname:sparseBinding>> feature is the base, 83 and provides the following capabilities: 84 85 ** Resources can: be bound at some defined (sparse block) granularity. 86 ** The entire resource must: be bound to memory before use regardless of 87 regions actually accessed. 88 ** No specific mapping of image region to memory offset is defined, i.e. 89 the location that each texel corresponds to in memory is 90 implementation-dependent. 91 ** Sparse buffers have a well-defined mapping of buffer range to memory 92 range, where an offset into a range of the buffer that is bound to a 93 single contiguous range of memory corresponds to an identical offset 94 within that range of memory. 95 ** Requested via the ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT and 96 ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT bits. 97 ** A sparse image created using ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT 98 (but not ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) supports all 99 formats that non-sparse usage supports, and supports both 100 ename:VK_IMAGE_TILING_OPTIMAL and ename:VK_IMAGE_TILING_LINEAR tiling. 101 102 * _Sparse Residency_ builds on (and requires) the pname:sparseBinding 103 feature. 104 It includes the following capabilities: 105 106 ** Resources do not have to be completely bound to memory before use on 107 the device. 108 ** Images have a prescribed sparse image block layout, allowing specific 109 rectangular regions of the image to be bound to specific offsets in 110 memory allocations. 111 ** Consistency of access to unbound regions of the resource is defined by 112 the absence or presence of 113 sname:VkPhysicalDeviceSparseProperties::pname:residencyNonResidentStrict. 114 If this property is present, accesses to unbound regions of the 115 resource are well defined and behave as if the data bound is populated 116 with all zeros; writes are discarded. 117 When this property is absent, accesses are considered safe, but reads 118 will return undefined: values. 119 ** Requested via the ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT and 120 ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT bits. 121 ** [[features-sparseResidency]] Sparse residency support is advertised on 122 a finer grain via the following features: 123+ 124 *** The <<features-sparseResidencyBuffer, pname:sparseResidencyBuffer>> 125 feature provides support for creating sname:VkBuffer objects with the 126 ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT. 127 *** The <<features-sparseResidencyImage2D, pname:sparseResidencyImage2D>> 128 feature provides support for creating 2D single-sampled sname:VkImage 129 objects with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 130 *** The <<features-sparseResidencyImage3D, pname:sparseResidencyImage3D>> 131 feature provides support for creating 3D sname:VkImage objects with 132 ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 133 *** The <<features-sparseResidency2Samples, 134 pname:sparseResidency2Samples>> feature provides support for creating 135 2D sname:VkImage objects with 2 samples and 136 ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 137 *** The <<features-sparseResidency4Samples, 138 pname:sparseResidency4Samples>> feature provides support for creating 139 2D sname:VkImage objects with 4 samples and 140 ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 141 *** The <<features-sparseResidency8Samples, 142 pname:sparseResidency8Samples>> feature provides support for creating 143 2D sname:VkImage objects with 8 samples and 144 ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 145 *** The <<features-sparseResidency16Samples, 146 pname:sparseResidency16Samples>> feature provides support for creating 147 2D sname:VkImage objects with 16 samples and 148 ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 149+ 150Implementations supporting pname:sparseResidencyImage2D are only required: 151to support sparse 2D, single-sampled images. 152Support for sparse 3D and MSAA images is optional: and can: be enabled via 153pname:sparseResidencyImage3D, pname:sparseResidency2Samples, 154pname:sparseResidency4Samples, pname:sparseResidency8Samples, and 155pname:sparseResidency16Samples. 156 157 ** A sparse image created using ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 158 supports all non-compressed color formats with power-of-two element 159 size that non-sparse usage supports. 160 Additional formats may: also be supported and can: be queried via 161 flink:vkGetPhysicalDeviceSparseImageFormatProperties. 162 ename:VK_IMAGE_TILING_LINEAR tiling is not supported. 163 164 * The <<features-sparseResidencyAliased, pname:sparseResidencyAliased>> 165 feature provides the following capability that can: be enabled per 166 resource: 167+ 168Allows physical memory ranges to be shared between multiple locations in the 169same sparse resource or between multiple sparse resources, with each binding 170of a memory location observing a consistent interpretation of the memory 171contents. 172+ 173-- 174ifndef::VKSC_VERSION_1_0[] 175See <<sparsememory-sparse-memory-aliasing,Sparse Memory Aliasing>> for more 176information. 177endif::VKSC_VERSION_1_0[] 178-- 179 180 181ifndef::VKSC_VERSION_1_0[] 182[[sparsememory-fully-resident]] 183== Sparse Buffers and Fully-Resident Images 184 185Both sname:VkBuffer and sname:VkImage objects created with the 186ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT or 187ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT bits can: be thought of as a 188linear region of address space. 189In the sname:VkImage case if ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT is 190not used, this linear region is entirely opaque, meaning that there is no 191application-visible mapping between texel location and memory offset. 192 193Unless ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or 194ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT are also used, the entire 195resource must: be bound to one or more sname:VkDeviceMemory objects before 196use. 197 198 199=== Sparse Buffer and Fully-Resident Image Block Size 200 201The sparse block size in bytes for sparse buffers and fully-resident images 202is reported as sname:VkMemoryRequirements::pname:alignment. 203pname:alignment represents both the memory alignment requirement and the 204binding granularity (in bytes) for sparse resources. 205 206 207[[sparsememory-partially-resident-buffers]] 208== Sparse Partially-Resident Buffers 209 210sname:VkBuffer objects created with the 211ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT bit allow the buffer to be made 212only partially resident. 213Partially resident sname:VkBuffer objects are allocated and bound 214identically to sname:VkBuffer objects using only the 215ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT feature. 216The only difference is the ability for some regions of the buffer to be 217unbound during device use. 218 219 220[[sparsememory-partially-resident-images]] 221== Sparse Partially-Resident Images 222 223sname:VkImage objects created with the 224ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT bit allow specific rectangular 225regions of the image called sparse image blocks to be bound to specific 226ranges of memory. 227This allows the application to manage residency at either image subresource 228or sparse image block granularity. 229Each image subresource (outside of the <<sparsememory-miptail,mip tail>>) 230starts on a sparse block boundary and has dimensions that are integer 231multiples of the corresponding dimensions of the sparse image block. 232 233[NOTE] 234.Note 235==== 236Applications can: use these types of images to control LOD based on total 237memory consumption. 238If memory pressure becomes an issue the application can: unbind and disable 239specific mipmap levels of images without having to recreate resources or 240modify texel data of unaffected levels. 241 242The application can: also use this functionality to access subregions of the 243image in a "`megatexture`" fashion. 244The application can: create a large image and only populate the region of 245the image that is currently being used in the scene. 246==== 247 248 249[[sparsememory-accessing-unbound]] 250=== Accessing Unbound Regions 251 252The following member of sname:VkPhysicalDeviceSparseProperties affects how 253data in unbound regions of sparse resources are handled by the 254implementation: 255 256 * pname:residencyNonResidentStrict 257 258If this property is not present, reads of unbound regions of the image will 259return undefined: values. 260Both reads and writes are still considered _safe_ and will not affect other 261resources or populated regions of the image. 262 263If this property is present, all reads of unbound regions of the image will 264behave as if the region was bound to memory populated with all zeros; writes 265will be discarded. 266 267<<textures,Image operations>> performed on unbound memory may: still alter 268some component values in the natural way for those accesses, e.g. 269substituting a value of one for alpha in formats that do not have an alpha 270component. 271 272==== 273Example: Reading the alpha component of an unbacked ename:VK_FORMAT_R8_UNORM 274image will return a value of [eq]#1.0f#. 275==== 276 277See <<devsandqueues-physical-device-enumeration,Physical Device 278Enumeration>> for instructions for retrieving physical device properties. 279 280ifdef::implementation-guide[] 281.Implementor's Note 282**** 283For implementations that cannot: natively handle access to unbound regions 284of a resource, the implementation may: allocate and bind memory to the 285unbound regions. 286Reads and writes to unbound regions will access the implementation-managed 287memory instead. 288 289Given that the values resulting from reads of unbound regions are undefined: 290in this scenario, implementations may: use the same physical memory for all 291unbound regions of multiple resources within the same process. 292**** 293endif::implementation-guide[] 294 295 296[[sparsememory-miptail]] 297=== Mip Tail Regions 298 299Sparse images created using ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT 300(without also using ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) have no 301specific mapping of image region or image subresource to memory offset 302defined, so the entire image can: be thought of as a linear opaque address 303region. 304However, images created with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT do 305have a prescribed sparse image block layout, and hence each image 306subresource must: start on a sparse block boundary. 307Within each array layer, the set of mip levels that have a smaller size than 308the sparse block size in bytes are grouped together into a _mip tail 309region_. 310 311If the ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT flag is present in 312the pname:flags member of sname:VkSparseImageFormatProperties, for the 313image's pname:format, then any mip level which has dimensions that are not 314integer multiples of the corresponding dimensions of the sparse image block, 315and all subsequent mip levels, are also included in the mip tail region. 316 317The following member of sname:VkPhysicalDeviceSparseProperties may: affect 318how the implementation places mip levels in the mip tail region: 319 320 * pname:residencyAlignedMipSize 321 322Each mip tail region is bound to memory as an opaque region (i.e. must: be 323bound using a slink:VkSparseImageOpaqueMemoryBindInfo structure) and may: be 324of a size greater than or equal to the sparse block size in bytes. 325This size is guaranteed to be an integer multiple of the sparse block size 326in bytes. 327 328An implementation may: choose to allow each array-layer's mip tail region to 329be bound to memory independently or require that all array-layer's mip tail 330regions be treated as one. 331This is dictated by ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT in 332sname:VkSparseImageMemoryRequirements::pname:flags. 333 334The following diagrams depict how 335ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT and 336ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT alter memory usage and 337requirements. 338 339image::{images}/sparseimage.svg[align="center",title="Sparse Image",opts="{imageopts}"] 340 341In the absence of ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT and 342ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT, each array layer contains a 343mip tail region containing texel data for all mip levels smaller than the 344sparse image block in any dimension. 345 346Mip levels that are as large or larger than a sparse image block in all 347dimensions can: be bound individually. 348Right-edges and bottom-edges of each level are allowed to have partially 349used sparse blocks. 350Any bound partially-used-sparse-blocks must: still have their full sparse 351block size in bytes allocated in memory. 352 353image::{images}/sparseimage_singlemiptail.svg[align="center",title="Sparse Image with Single Mip Tail",opts="{imageopts}"] 354 355When ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT is present all array 356layers will share a single mip tail region. 357 358image::{images}/sparseimage_alignedmipsize.svg[align="center",title="Sparse Image with Aligned Mip Size",opts="{imageopts}"] 359 360[NOTE] 361.Note 362==== 363The mip tail regions are presented here in 2D arrays simply for figure size 364reasons. 365Each mip tail is logically a single array of sparse blocks with an 366implementation-dependent mapping of texels or compressed texel blocks to 367sparse blocks. 368==== 369 370When ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT is present the first 371mip level that would contain partially used sparse blocks begins the mip 372tail region. 373This level and all subsequent levels are placed in the mip tail. 374Only the first [eq]#N# mip levels whose dimensions are an exact multiple of 375the sparse image block dimensions can: be bound and unbound on a sparse 376block basis. 377 378image::{images}/sparseimage_alignedmipsize_singlemiptail.svg[align="center",title="Sparse Image with Aligned Mip Size and Single Mip Tail",opts="{imageopts}"] 379 380[NOTE] 381.Note 382==== 383The mip tail region is presented here in a 2D array simply for figure size 384reasons. 385It is logically a single array of sparse blocks with an 386implementation-dependent mapping of texels or compressed texel blocks to 387sparse blocks. 388==== 389 390When both ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT and 391ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT are present the constraints 392from each of these flags are in effect. 393 394 395[[sparsememory-standard-shapes]] 396=== Standard Sparse Image Block Shapes 397 398Standard sparse image block shapes define a standard set of dimensions for 399sparse image blocks that depend on the format of the image. 400Layout of texels or compressed texel blocks within a sparse image block is 401implementation-dependent. 402All currently defined standard sparse image block shapes are 64 KB in size. 403 404For block-compressed formats (e.g. ename:VK_FORMAT_BC5_UNORM_BLOCK), the 405texel size is the size of the compressed texel block (e.g. 128-bit for 406etext:BC5) thus the dimensions of the standard sparse image block shapes 407apply in terms of compressed texel blocks. 408 409[NOTE] 410.Note 411==== 412For block-compressed formats, the dimensions of a sparse image block in 413terms of texels can: be calculated by multiplying the sparse image block 414dimensions by the compressed texel block dimensions. 415==== 416 417<<< 418 419[[sparsememory-sparseblockshapessingle]] 420.Standard Sparse Image Block Shapes (Single Sample) 421[options="header"] 422|==== 423| TEXEL SIZE (bits) | Block Shape (2D) | Block Shape (3D) 424| *8-Bit* | 256 {times} 256 {times} 1 | 64 {times} 32 {times} 32 425| *16-Bit* | 256 {times} 128 {times} 1 | 32 {times} 32 {times} 32 426| *32-Bit* | 128 {times} 128 {times} 1 | 32 {times} 32 {times} 16 427| *64-Bit* | 128 {times} 64 {times} 1 | 32 {times} 16 {times} 16 428| *128-Bit* | 64 {times} 64 {times} 1 | 16 {times} 16 {times} 16 429|==== 430 431[[sparsememory-sparseblockshapesmsaa]] 432.Standard Sparse Image Block Shapes (MSAA) 433[options="header"] 434|==== 435| TEXEL SIZE (bits)| Block Shape (2X) | Block Shape (4X) | Block Shape (8X) | Block Shape (16X) 436| *8-Bit* | 128 {times} 256 {times} 1 | 128 {times} 128 {times} 1 | 64 {times} 128 {times} 1 | 64 {times} 64 {times} 1 437| *16-Bit* | 128 {times} 128 {times} 1 | 128 {times} 64 {times} 1 | 64 {times} 64 {times} 1 | 64 {times} 32 {times} 1 438| *32-Bit* | 64 {times} 128 {times} 1 | 64 {times} 64 {times} 1 | 32 {times} 64 {times} 1 | 32 {times} 32 {times} 1 439| *64-Bit* | 64 {times} 64 {times} 1 | 64 {times} 32 {times} 1 | 32 {times} 32 {times} 1 | 32 {times} 16 {times} 1 440| *128-Bit* | 32 {times} 64 {times} 1 | 32 {times} 32 {times} 1 | 16 {times} 32 {times} 1 | 16 {times} 16 {times} 1 441|==== 442 443 444Implementations that support the standard sparse image block shape for all 445formats listed in the <<sparsememory-sparseblockshapessingle>> and 446<<sparsememory-sparseblockshapesmsaa>> tables may: advertise the following 447sname:VkPhysicalDeviceSparseProperties: 448 449 * pname:residencyStandard2DBlockShape 450 * pname:residencyStandard2DMultisampleBlockShape 451 * pname:residencyStandard3DBlockShape 452 453Reporting each of these features does _not_ imply that all possible image 454types are supported as sparse. 455Instead, this indicates that no supported sparse image of the corresponding 456type will use custom sparse image block dimensions for any formats that have 457a corresponding standard sparse image block shape. 458 459 460[[sparsememory-custom-shapes]] 461=== Custom Sparse Image Block Shapes 462 463An implementation that does not support a standard image block shape for a 464particular sparse partially-resident image may: choose to support a custom 465sparse image block shape for it instead. 466The dimensions of such a custom sparse image block shape are reported in 467sname:VkSparseImageFormatProperties::pname:imageGranularity. 468As with standard sparse image block shapes, the size in bytes of the custom 469sparse image block shape will be reported in 470sname:VkMemoryRequirements::pname:alignment. 471 472Custom sparse image block dimensions are reported through 473fname:vkGetPhysicalDeviceSparseImageFormatProperties and 474fname:vkGetImageSparseMemoryRequirements. 475 476An implementation must: not support both the standard sparse image block 477shape and a custom sparse image block shape for the same image. 478The standard sparse image block shape must: be used if it is supported. 479 480 481[[sparsememory-multiaspect]] 482=== Multiple Aspects 483 484Partially resident images are allowed to report separate sparse properties 485for different aspects of the image. 486One example is for depth/stencil images where the implementation separates 487the depth and stencil data into separate planes. 488Another reason for multiple aspects is to allow the application to manage 489memory allocation for implementation-private _metadata_ associated with the 490image. 491See the figure below: 492 493image::{images}/sparseimage_multiaspect.svg[align="center",title="Multiple Aspect Sparse Image",opts="{imageopts}"] 494 495[NOTE] 496.Note 497==== 498The mip tail regions are presented here in 2D arrays simply for figure size 499reasons. 500Each mip tail is logically a single array of sparse blocks with an 501implementation-dependent mapping of texels or compressed texel blocks to 502sparse blocks. 503==== 504 505In the figure above the depth, stencil, and metadata aspects all have unique 506sparse properties. 507The per-texel stencil data is [eq]#{onequarter}# the size of the depth data, 508hence the stencil sparse blocks include [eq]#4 {times}# the number of 509texels. 510The sparse block size in bytes for all of the aspects is identical and 511defined by sname:VkMemoryRequirements::pname:alignment. 512 513 514==== Metadata 515 516The metadata aspect of an image has the following constraints: 517 518 * All metadata is reported in the mip tail region of the metadata aspect. 519 * All metadata must: be bound prior to device use of the sparse image. 520 521 522[[sparsememory-sparse-memory-aliasing]] 523== Sparse Memory Aliasing 524 525By default sparse resources have the same aliasing rules as non-sparse 526resources. 527See <<resources-memory-aliasing,Memory Aliasing>> for more information. 528 529sname:VkDevice objects that have the <<features-sparseResidencyAliased, 530pname:sparseResidencyAliased>> feature enabled are able to use the 531ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT and 532ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flags for resource creation. 533These flags allow resources to access physical memory bound into multiple 534locations within one or more sparse resources in a _data consistent_ 535fashion. 536This means that reading physical memory from multiple aliased locations will 537return the same value. 538 539Care must: be taken when performing a write operation to aliased physical 540memory. 541Memory dependencies must: be used to separate writes to one alias from reads 542or writes to another alias. 543Writes to aliased memory that are not properly guarded against accesses to 544different aliases will have undefined: results for all accesses to the 545aliased memory. 546 547Applications that wish to make use of data consistent sparse memory aliasing 548must: abide by the following guidelines: 549 550 * All sparse resources that are bound to aliased physical memory must: be 551 created with the ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT / 552 ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flag. 553 * All resources that access aliased physical memory must: interpret the 554 memory in the same way. 555 This implies the following: 556 ** Buffers and images cannot: alias the same physical memory in a data 557 consistent fashion. 558 The physical memory ranges must: be used exclusively by buffers or used 559 exclusively by images for data consistency to be guaranteed. 560 ** Memory in sparse image mip tail regions cannot: access aliased memory 561 in a data consistent fashion. 562 ** Sparse images that alias the same physical memory must: have compatible 563 formats and be using the same sparse image block shape in order to 564 access aliased memory in a data consistent fashion. 565 566Failure to follow any of the above guidelines will require the application 567to abide by the normal, non-sparse resource <<resources-memory-aliasing, 568aliasing rules>>. 569In this case memory cannot: be accessed in a data consistent fashion. 570 571[NOTE] 572.Note 573==== 574Enabling sparse resource memory aliasing can: be a way to lower physical 575memory use, but it may: reduce performance on some implementations. 576An application developer can: test on their target HW and balance the memory 577/ performance trade-offs measured. 578==== 579 580 581ifdef::implementation-guide[] 582== Sparse Resource Implementation Guidelines (Informative) 583 584**** 585This section is Informative. 586It is included to aid in implementors`' understanding of sparse resources. 587 588.Device Virtual Address 589 590The basic pname:sparseBinding feature allows the resource to reserve its own 591device virtual address range at resource creation time rather than relying 592on a bind operation to set this. 593Without any other creation flags, no other constraints are relaxed compared 594to normal resources. 595All pages must: be bound to physical memory before the device accesses the 596resource. 597 598The <<features-sparseResidency, pname:sparseResidency>> features allow 599sparse resources to be used even when not all pages are bound to memory. 600Implementations that support access to unbound pages without causing a fault 601may: support pname:residencyNonResidentStrict. 602 603Not faulting on access to unbound pages is not enough to support 604pname:residencyNonResidentStrict. 605An implementation must: also guarantee that reads after writes to unbound 606regions of the resource always return data for the read as if the memory 607contains zeros. 608Depending on any caching hierarchy of the implementation this may: not 609always be possible. 610 611Any implementation that does not fault, but does not guarantee correct read 612values must: not support pname:residencyNonResidentStrict. 613 614Any implementation that cannot: access unbound pages without causing a fault 615will require the implementation to bind the entire device virtual address 616range to physical memory. 617Any pages that the application does not bind to memory may: be bound to one 618(or more) "`placeholder" physical page(s) allocated by the implementation. 619Given the following properties: 620 621 * A process must: not access memory from another process 622 * Reads return undefined: values 623 624It is sufficient for each host process to allocate these placeholder pages 625and use them for all resources in that process. 626Implementations may: allocate more often (per instance, per device, or per 627resource). 628 629 630.Binding Memory 631 632The byte size reported in sname:VkMemoryRequirements::pname:size must: be 633greater than or equal to the amount of physical memory required: to fully 634populate the resource. 635Some implementations require "`holes`" in the device virtual address range 636that are never accessed. 637These holes may: be included in the pname:size reported for the resource. 638 639Including or not including the device virtual address holes in the resource 640size will alter how the implementation provides support for 641sname:VkSparseImageOpaqueMemoryBindInfo. 642This operation must: be supported for all sparse images, even ones created 643with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 644 645ifdef::editing-notes[] 646[NOTE] 647.editing-note 648==== 649@ntrevett suggested expanding the NOTE tag below to encompass everything 650from "`The cost is...`" in the first bullet point through the current note. 651TBD. 652==== 653endif::editing-notes[] 654 655 * If the holes are included in the size, this bind function becomes very 656 easy. 657 In most cases the pname:resourceOffset is simply a device virtual 658 address offset and the implementation can easily determine what device 659 virtual address to bind. 660 The cost is that the application may: allocate more physical memory for 661 the resource than it needs. 662 * If the holes are not included in the size, the application can: allocate 663 less physical memory than otherwise for the resource. 664 However, in this case the implementation must: account for the holes 665 when mapping pname:resourceOffset to the actual device virtual address 666 intended to be mapped. 667 668[NOTE] 669.Note 670==== 671If the application always uses sname:VkSparseImageMemoryBindInfo to bind 672memory for the non-tail mip levels, any holes that are present in the 673resource size may: never be bound. 674 675Since sname:VkSparseImageMemoryBindInfo uses texel locations to determine 676which device virtual addresses to bind, it is impossible to bind device 677virtual address holes with this operation. 678==== 679 680.Binding Metadata Memory 681 682All metadata for sparse images have their own sparse properties and are 683embedded in the mip tail region for said properties. 684See the <<sparsememory-multiaspect,Multiaspect>> section for details. 685 686Given that metadata is in a mip tail region, and the mip tail region must: 687be reported as contiguous (either globally or per-array-layer), some 688implementations will have to resort to complicated offset -> device virtual 689address mapping for handling sname:VkSparseImageOpaqueMemoryBindInfo. 690 691To make this easier on the implementation, the 692ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT explicitly specifies when metadata 693is bound with sname:VkSparseImageOpaqueMemoryBindInfo. 694When this flag is not present, the pname:resourceOffset may: be treated as a 695strict device virtual address offset. 696 697When ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT is present, the 698pname:resourceOffset must: have been derived explicitly from the 699pname:imageMipTailOffset in the sparse resource properties returned for the 700metadata aspect. 701By manipulating the value returned for pname:imageMipTailOffset, the 702pname:resourceOffset does not have to correlate directly to a device virtual 703address offset, and may: instead be whatever value makes it easiest for the 704implementation to derive the correct device virtual address. 705 706**** 707endif::implementation-guide[] 708endif::VKSC_VERSION_1_0[] 709 710[[sparsememory-resourceapi]] 711== Sparse Resource API 712 713The APIs related to sparse resources are grouped into the following 714categories: 715 716 * <<sparsememory-physicalfeatures,Physical Device Features>> 717 * <<sparsememory-physicalprops,Physical Device Sparse Properties>> 718ifndef::VKSC_VERSION_1_0[] 719 * <<sparsememory-format-props,Sparse Image Format Properties>> 720 * <<sparsememory-resource-creation,Sparse Resource Creation>> 721 * <<sparsememory-memory-requirements,Sparse Resource Memory Requirements>> 722 * <<sparsememory-resource-binding,Binding Resource Memory>> 723endif::VKSC_VERSION_1_0[] 724 725 726[[sparsememory-physicalfeatures]] 727=== Physical Device Features 728 729Some sparse-resource related features are reported and enabled in 730sname:VkPhysicalDeviceFeatures. 731These features must: be supported and enabled on the sname:VkDevice object 732before applications can: use them. 733See <<features, Physical Device Features>> for information on how to get and 734set enabled device features, and for more detailed explanations of these 735features. 736 737 738==== Sparse Physical Device Features 739 740 * pname:sparseBinding: Support for creating slink:VkBuffer and 741 sname:VkImage objects with the ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT 742 and ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT flags, respectively. 743 * pname:sparseResidencyBuffer: Support for creating slink:VkBuffer objects 744 with the ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT flag. 745 * pname:sparseResidencyImage2D: Support for creating 2D single-sampled 746 sname:VkImage objects with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 747 * pname:sparseResidencyImage3D: Support for creating 3D slink:VkImage 748 objects with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 749 * pname:sparseResidency2Samples: Support for creating 2D slink:VkImage 750 objects with 2 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 751 * pname:sparseResidency4Samples: Support for creating 2D slink:VkImage 752 objects with 4 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 753 * pname:sparseResidency8Samples: Support for creating 2D slink:VkImage 754 objects with 8 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 755 * pname:sparseResidency16Samples: Support for creating 2D slink:VkImage 756 objects with 16 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT. 757 * pname:sparseResidencyAliased: Support for creating slink:VkBuffer and 758 sname:VkImage objects with the ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT 759 and ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flags, respectively. 760 761 762[[sparsememory-physicalprops]] 763=== Physical Device Sparse Properties 764 765Some features of the implementation are not possible to disable, and are 766reported to allow applications to alter their sparse resource usage 767accordingly. 768These read-only capabilities are reported in the 769slink:VkPhysicalDeviceProperties::pname:sparseProperties member, which is a 770sname:VkPhysicalDeviceSparseProperties structure. 771 772[open,refpage='VkPhysicalDeviceSparseProperties',desc='Structure specifying physical device sparse memory properties',type='structs'] 773-- 774The sname:VkPhysicalDeviceSparseProperties structure is defined as: 775 776include::{generated}/api/structs/VkPhysicalDeviceSparseProperties.adoc[] 777 778 * pname:residencyStandard2DBlockShape 779ifndef::VKSC_VERSION_1_0[] 780 is ename:VK_TRUE if the physical device will access all single-sample 2D 781 sparse resources using the standard sparse image block shapes (based on 782 image format), as described in the 783 <<sparsememory-sparseblockshapessingle, Standard Sparse Image Block 784 Shapes (Single Sample)>> table. 785 If this property is not supported the value returned in the 786 pname:imageGranularity member of the sname:VkSparseImageFormatProperties 787 structure for single-sample 2D images is not required: to match the 788 standard sparse image block dimensions listed in the table. 789endif::VKSC_VERSION_1_0[] 790ifdef::VKSC_VERSION_1_0[must: be ename:VK_FALSE in Vulkan SC <<SCID-8>>.] 791 * pname:residencyStandard2DMultisampleBlockShape 792ifndef::VKSC_VERSION_1_0[] 793 is ename:VK_TRUE if the physical device will access all multisample 2D 794 sparse resources using the standard sparse image block shapes (based on 795 image format), as described in the 796 <<sparsememory-sparseblockshapesmsaa,Standard Sparse Image Block Shapes 797 (MSAA)>> table. 798 If this property is not supported, the value returned in the 799 pname:imageGranularity member of the sname:VkSparseImageFormatProperties 800 structure for multisample 2D images is not required: to match the 801 standard sparse image block dimensions listed in the table. 802endif::VKSC_VERSION_1_0[] 803ifdef::VKSC_VERSION_1_0[must: be ename:VK_FALSE in Vulkan SC <<SCID-8>>.] 804 * pname:residencyStandard3DBlockShape 805ifndef::VKSC_VERSION_1_0[] 806 is ename:VK_TRUE if the physical device will access all 3D sparse 807 resources using the standard sparse image block shapes (based on image 808 format), as described in the 809 <<sparsememory-sparseblockshapessingle,Standard Sparse Image Block 810 Shapes (Single Sample)>> table. 811 If this property is not supported, the value returned in the 812 pname:imageGranularity member of the sname:VkSparseImageFormatProperties 813 structure for 3D images is not required: to match the standard sparse 814 image block dimensions listed in the table. 815endif::VKSC_VERSION_1_0[] 816ifdef::VKSC_VERSION_1_0[must: be ename:VK_FALSE in Vulkan SC <<SCID-8>>.] 817 * pname:residencyAlignedMipSize 818ifndef::VKSC_VERSION_1_0[] 819 is ename:VK_TRUE if images with mip level dimensions that are not 820 integer multiples of the corresponding dimensions of the sparse image 821 block may: be placed in the mip tail. 822 If this property is not reported, only mip levels with dimensions 823 smaller than the pname:imageGranularity member of the 824 sname:VkSparseImageFormatProperties structure will be placed in the mip 825 tail. 826 If this property is reported the implementation is allowed to return 827 ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT in the pname:flags 828 member of sname:VkSparseImageFormatProperties, indicating that mip level 829 dimensions that are not integer multiples of the corresponding 830 dimensions of the sparse image block will be placed in the mip tail. 831endif::VKSC_VERSION_1_0[] 832ifdef::VKSC_VERSION_1_0[must: be ename:VK_FALSE in Vulkan SC <<SCID-8>>.] 833 * pname:residencyNonResidentStrict 834ifndef::VKSC_VERSION_1_0[] 835 specifies whether the physical device can: consistently access 836 non-resident regions of a resource. 837 If this property is ename:VK_TRUE, access to non-resident regions of 838 resources will be guaranteed to return values as if the resource was 839 populated with 0; writes to non-resident regions will be discarded. 840endif::VKSC_VERSION_1_0[] 841ifdef::VKSC_VERSION_1_0[] 842 must: be ename:VK_FALSE in Vulkan SC <<SCID-8>>. 843ifdef::hidden[] 844// tag::scdeviation[] 845 * slink:VkPhysicalDeviceSparseProperties::pname:residencyStandard2DBlockShape 846 must: be reported as ename:VK_FALSE <<SCID-8>>. 847 * slink:VkPhysicalDeviceSparseProperties::pname:residencyStandard2DMultisampleBlockShape 848 must: be reported as ename:VK_FALSE <<SCID-8>>. 849 * slink:VkPhysicalDeviceSparseProperties::pname:residencyStandard3DBlockShape 850 must: be reported as ename:VK_FALSE <<SCID-8>>. 851 * slink:VkPhysicalDeviceSparseProperties::pname:residencyAlignedMipSize 852 must: be reported as ename:VK_FALSE <<SCID-8>>. 853 * slink:VkPhysicalDeviceSparseProperties::pname:residencyNonResidentStrict 854 must: be reported as ename:VK_FALSE <<SCID-8>>. 855// end::scdeviation[] 856endif::hidden[] 857endif::VKSC_VERSION_1_0[] 858 859 860include::{generated}/validity/structs/VkPhysicalDeviceSparseProperties.adoc[] 861-- 862 863ifndef::VKSC_VERSION_1_0[] 864 865[[sparsememory-format-props]] 866=== Sparse Image Format Properties 867 868Given that certain aspects of sparse image support, including the sparse 869image block dimensions, may: be implementation-dependent, 870flink:vkGetPhysicalDeviceSparseImageFormatProperties can: be used to query 871for sparse image format properties prior to resource creation. 872This command is used to check whether a given set of sparse image parameters 873is supported and what the sparse image block shape will be. 874 875 876==== Sparse Image Format Properties API 877 878[open,refpage='VkSparseImageFormatProperties',desc='Structure specifying sparse image format properties',type='structs'] 879-- 880The sname:VkSparseImageFormatProperties structure is defined as: 881 882include::{generated}/api/structs/VkSparseImageFormatProperties.adoc[] 883 884 * pname:aspectMask is a bitmask elink:VkImageAspectFlagBits specifying 885 which aspects of the image the properties apply to. 886 * pname:imageGranularity is the width, height, and depth of the sparse 887 image block in texels or compressed texel blocks. 888 * pname:flags is a bitmask of elink:VkSparseImageFormatFlagBits specifying 889 additional information about the sparse resource. 890 891include::{generated}/validity/structs/VkSparseImageFormatProperties.adoc[] 892-- 893 894[open,refpage='VkSparseImageFormatFlagBits',desc='Bitmask specifying additional information about a sparse image resource',type='enums'] 895-- 896Bits which may: be set in slink:VkSparseImageFormatProperties::pname:flags, 897specifying additional information about the sparse resource, are: 898 899include::{generated}/api/enums/VkSparseImageFormatFlagBits.adoc[] 900 901 * ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT specifies that the image 902 uses a single mip tail region for all array layers. 903 * ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT specifies that the 904 first mip level whose dimensions are not integer multiples of the 905 corresponding dimensions of the sparse image block begins the mip tail 906 region. 907 * ename:VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT specifies that 908 the image uses non-standard sparse image block dimensions, and the 909 pname:imageGranularity values do not match the standard sparse image 910 block dimensions for the given format. 911-- 912 913[open,refpage='VkSparseImageFormatFlags',desc='Bitmask of VkSparseImageFormatFlagBits',type='flags'] 914-- 915include::{generated}/api/flags/VkSparseImageFormatFlags.adoc[] 916 917tname:VkSparseImageFormatFlags is a bitmask type for setting a mask of zero 918or more elink:VkSparseImageFormatFlagBits. 919-- 920 921[open,refpage='vkGetPhysicalDeviceSparseImageFormatProperties',desc='Retrieve properties of an image format applied to sparse images',type='protos'] 922-- 923fname:vkGetPhysicalDeviceSparseImageFormatProperties returns an array of 924slink:VkSparseImageFormatProperties. 925Each element will describe properties for one set of image aspects that are 926bound simultaneously in the image. 927This is usually one element for each aspect in the image, but for 928interleaved depth/stencil images there is only one element describing the 929combined aspects. 930 931include::{generated}/api/protos/vkGetPhysicalDeviceSparseImageFormatProperties.adoc[] 932 933 * pname:physicalDevice is the physical device from which to query the 934 sparse image format properties. 935 * pname:format is the image format. 936 * pname:type is the dimensionality of image. 937 * pname:samples is a elink:VkSampleCountFlagBits value specifying the 938 number of samples per texel. 939 * pname:usage is a bitmask describing the intended usage of the image. 940 * pname:tiling is the tiling arrangement of the texel blocks in memory. 941 * pname:pPropertyCount is a pointer to an integer related to the number of 942 sparse format properties available or queried, as described below. 943 * pname:pProperties is either `NULL` or a pointer to an array of 944 slink:VkSparseImageFormatProperties structures. 945 946If pname:pProperties is `NULL`, then the number of sparse format properties 947available is returned in pname:pPropertyCount. 948Otherwise, pname:pPropertyCount must: point to a variable set by the user to 949the number of elements in the pname:pProperties array, and on return the 950variable is overwritten with the number of structures actually written to 951pname:pProperties. 952If pname:pPropertyCount is less than the number of sparse format properties 953available, at most pname:pPropertyCount structures will be written. 954 955If ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT is not supported for the given 956arguments, pname:pPropertyCount will be set to zero upon return, and no data 957will be written to pname:pProperties. 958 959Multiple aspects are returned for depth/stencil images that are implemented 960as separate planes by the implementation. 961The depth and stencil data planes each have unique 962sname:VkSparseImageFormatProperties data. 963 964Depth/stencil images with depth and stencil data interleaved into a single 965plane will return a single sname:VkSparseImageFormatProperties structure 966with the pname:aspectMask set to ename:VK_IMAGE_ASPECT_DEPTH_BIT | 967ename:VK_IMAGE_ASPECT_STENCIL_BIT. 968 969.Valid Usage 970**** 971 * [[VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094]] 972 pname:samples must: be a bit value that is set in 973 sname:VkImageFormatProperties::pname:sampleCounts returned by 974 fname:vkGetPhysicalDeviceImageFormatProperties with pname:format, 975 pname:type, pname:tiling, and pname:usage equal to those in this command 976 and pname:flags equal to the value that is set in 977 slink:VkImageCreateInfo::pname:flags when the image is created 978**** 979 980include::{generated}/validity/protos/vkGetPhysicalDeviceSparseImageFormatProperties.adoc[] 981-- 982 983ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[] 984[open,refpage='vkGetPhysicalDeviceSparseImageFormatProperties2',desc='Retrieve properties of an image format applied to sparse images',type='protos'] 985-- 986fname:vkGetPhysicalDeviceSparseImageFormatProperties2 returns an array of 987slink:VkSparseImageFormatProperties2. 988Each element will describe properties for one set of image aspects that are 989bound simultaneously in the image. 990This is usually one element for each aspect in the image, but for 991interleaved depth/stencil images there is only one element describing the 992combined aspects. 993 994ifdef::VK_VERSION_1_1[] 995include::{generated}/api/protos/vkGetPhysicalDeviceSparseImageFormatProperties2.adoc[] 996endif::VK_VERSION_1_1[] 997 998ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command] 999 1000ifdef::VK_KHR_get_physical_device_properties2[] 1001include::{generated}/api/protos/vkGetPhysicalDeviceSparseImageFormatProperties2KHR.adoc[] 1002endif::VK_KHR_get_physical_device_properties2[] 1003 1004 * pname:physicalDevice is the physical device from which to query the 1005 sparse image format properties. 1006 * pname:pFormatInfo is a pointer to a 1007 slink:VkPhysicalDeviceSparseImageFormatInfo2 structure containing input 1008 parameters to the command. 1009 * pname:pPropertyCount is a pointer to an integer related to the number of 1010 sparse format properties available or queried, as described below. 1011 * pname:pProperties is either `NULL` or a pointer to an array of 1012 slink:VkSparseImageFormatProperties2 structures. 1013 1014fname:vkGetPhysicalDeviceSparseImageFormatProperties2 behaves identically to 1015flink:vkGetPhysicalDeviceSparseImageFormatProperties, with the ability to 1016return extended information by adding extending structures to the 1017pname:pNext chain of its pname:pProperties parameter. 1018 1019include::{generated}/validity/protos/vkGetPhysicalDeviceSparseImageFormatProperties2.adoc[] 1020-- 1021 1022[open,refpage='VkPhysicalDeviceSparseImageFormatInfo2',desc='Structure specifying sparse image format inputs',type='structs'] 1023-- 1024The sname:VkPhysicalDeviceSparseImageFormatInfo2 structure is defined as: 1025 1026include::{generated}/api/structs/VkPhysicalDeviceSparseImageFormatInfo2.adoc[] 1027 1028ifdef::VK_KHR_get_physical_device_properties2[] 1029or the equivalent 1030 1031include::{generated}/api/structs/VkPhysicalDeviceSparseImageFormatInfo2KHR.adoc[] 1032endif::VK_KHR_get_physical_device_properties2[] 1033 1034 * pname:sType is a elink:VkStructureType value identifying this structure. 1035 * pname:pNext is `NULL` or a pointer to a structure extending this 1036 structure. 1037 * pname:format is the image format. 1038 * pname:type is the dimensionality of image. 1039 * pname:samples is a elink:VkSampleCountFlagBits value specifying the 1040 number of samples per texel. 1041 * pname:usage is a bitmask describing the intended usage of the image. 1042 * pname:tiling is the tiling arrangement of the texel blocks in memory. 1043 1044.Valid Usage 1045**** 1046 * [[VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095]] 1047 pname:samples must: be a bit value that is set in 1048 sname:VkImageFormatProperties::pname:sampleCounts returned by 1049 fname:vkGetPhysicalDeviceImageFormatProperties with pname:format, 1050 pname:type, pname:tiling, and pname:usage equal to those in this command 1051 and pname:flags equal to the value that is set in 1052 slink:VkImageCreateInfo::pname:flags when the image is created 1053**** 1054 1055include::{generated}/validity/structs/VkPhysicalDeviceSparseImageFormatInfo2.adoc[] 1056-- 1057 1058[open,refpage='VkSparseImageFormatProperties2',desc='Structure specifying sparse image format properties',type='structs'] 1059-- 1060The sname:VkSparseImageFormatProperties2 structure is defined as: 1061 1062include::{generated}/api/structs/VkSparseImageFormatProperties2.adoc[] 1063 1064ifdef::VK_KHR_get_physical_device_properties2[] 1065or the equivalent 1066 1067include::{generated}/api/structs/VkSparseImageFormatProperties2KHR.adoc[] 1068endif::VK_KHR_get_physical_device_properties2[] 1069 1070 * pname:sType is a elink:VkStructureType value identifying this structure. 1071 * pname:pNext is `NULL` or a pointer to a structure extending this 1072 structure. 1073 * pname:properties is a slink:VkSparseImageFormatProperties structure 1074 which is populated with the same values as in 1075 flink:vkGetPhysicalDeviceSparseImageFormatProperties. 1076 1077include::{generated}/validity/structs/VkSparseImageFormatProperties2.adoc[] 1078-- 1079endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[] 1080 1081 1082[[sparsememory-resource-creation]] 1083=== Sparse Resource Creation 1084 1085Sparse resources require that one or more sparse feature flags be specified 1086(as part of the sname:VkPhysicalDeviceFeatures structure described 1087previously in the <<sparsememory-physicalfeatures,Physical Device Features>> 1088section) when calling flink:vkCreateDevice. 1089When the appropriate device features are enabled, the 1090etext:VK_BUFFER_CREATE_SPARSE_* and etext:VK_IMAGE_CREATE_SPARSE_* flags 1091can: be used. 1092See flink:vkCreateBuffer and flink:vkCreateImage for details of the resource 1093creation APIs. 1094 1095[NOTE] 1096.Note 1097==== 1098Specifying ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or 1099ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT requires specifying 1100ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT or 1101ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT, respectively, as well. 1102This means that resources must: be created with the appropriate 1103etext:*_SPARSE_BINDING_BIT to be used with the sparse binding command 1104(fname:vkQueueBindSparse). 1105==== 1106 1107 1108[[sparsememory-memory-requirements]] 1109=== Sparse Resource Memory Requirements 1110 1111Sparse resources have specific memory requirements related to binding sparse 1112memory. 1113These memory requirements are reported differently for sname:VkBuffer 1114objects and sname:VkImage objects. 1115 1116 1117[[sparsememory-memory-buffer-fully-resident]] 1118==== Buffer and Fully-Resident Images 1119 1120Buffers (both fully and partially resident) and fully-resident images can: 1121be bound to memory using only the data from sname:VkMemoryRequirements. 1122For all sparse resources the sname:VkMemoryRequirements::pname:alignment 1123member specifies both the bindable sparse block size in bytes and required: 1124alignment of sname:VkDeviceMemory. 1125 1126 1127[[sparsememory-memory-partially-resident]] 1128==== Partially Resident Images 1129 1130Partially resident images have a different method for binding memory. 1131As with buffers and fully resident images, the 1132sname:VkMemoryRequirements::pname:alignment field specifies the bindable 1133sparse block size in bytes for the image. 1134 1135Requesting sparse memory requirements for sname:VkImage objects using 1136fname:vkGetImageSparseMemoryRequirements will return an array of one or more 1137sname:VkSparseImageMemoryRequirements structures. 1138Each structure describes the sparse memory requirements for a group of 1139aspects of the image. 1140 1141The sparse image must: have been created using the 1142ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag to retrieve valid sparse 1143image memory requirements. 1144 1145 1146==== Sparse Image Memory Requirements 1147 1148[open,refpage='VkSparseImageMemoryRequirements',desc='Structure specifying sparse image memory requirements',type='structs'] 1149-- 1150The sname:VkSparseImageMemoryRequirements structure is defined as: 1151 1152include::{generated}/api/structs/VkSparseImageMemoryRequirements.adoc[] 1153 1154 * pname:formatProperties is a slink:VkSparseImageFormatProperties 1155 structure specifying properties of the image format. 1156 * pname:imageMipTailFirstLod is the first mip level at which image 1157 subresources are included in the mip tail region. 1158 * pname:imageMipTailSize is the memory size (in bytes) of the mip tail 1159 region. 1160 If pname:formatProperties.flags contains 1161 ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT, this is the size of the 1162 whole mip tail, otherwise this is the size of the mip tail of a single 1163 array layer. 1164 This value is guaranteed to be a multiple of the sparse block size in 1165 bytes. 1166 * pname:imageMipTailOffset is the opaque memory offset used with 1167 slink:VkSparseImageOpaqueMemoryBindInfo to bind the mip tail region(s). 1168 * pname:imageMipTailStride is the offset stride between each array-layer's 1169 mip tail, if pname:formatProperties.flags does not contain 1170 ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT (otherwise the value is 1171 undefined:). 1172 1173include::{generated}/validity/structs/VkSparseImageMemoryRequirements.adoc[] 1174-- 1175 1176[open,refpage='vkGetImageSparseMemoryRequirements',desc='Query the memory requirements for a sparse image',type='protos'] 1177-- 1178To query sparse memory requirements for an image, call: 1179 1180include::{generated}/api/protos/vkGetImageSparseMemoryRequirements.adoc[] 1181 1182 * pname:device is the logical device that owns the image. 1183 * pname:image is the slink:VkImage object to get the memory requirements 1184 for. 1185 * pname:pSparseMemoryRequirementCount is a pointer to an integer related 1186 to the number of sparse memory requirements available or queried, as 1187 described below. 1188 * pname:pSparseMemoryRequirements is either `NULL` or a pointer to an 1189 array of sname:VkSparseImageMemoryRequirements structures. 1190 1191If pname:pSparseMemoryRequirements is `NULL`, then the number of sparse 1192memory requirements available is returned in 1193pname:pSparseMemoryRequirementCount. 1194Otherwise, pname:pSparseMemoryRequirementCount must: point to a variable set 1195by the user to the number of elements in the pname:pSparseMemoryRequirements 1196array, and on return the variable is overwritten with the number of 1197structures actually written to pname:pSparseMemoryRequirements. 1198If pname:pSparseMemoryRequirementCount is less than the number of sparse 1199memory requirements available, at most pname:pSparseMemoryRequirementCount 1200structures will be written. 1201 1202If the image was not created with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 1203then pname:pSparseMemoryRequirementCount will be set to zero and 1204pname:pSparseMemoryRequirements will not be written to. 1205 1206[NOTE] 1207.Note 1208==== 1209It is legal for an implementation to report a larger value in 1210sname:VkMemoryRequirements::pname:size than would be obtained by adding 1211together memory sizes for all sname:VkSparseImageMemoryRequirements returned 1212by fname:vkGetImageSparseMemoryRequirements. 1213This may: occur when the implementation requires unused padding in the 1214address range describing the resource. 1215==== 1216 1217include::{generated}/validity/protos/vkGetImageSparseMemoryRequirements.adoc[] 1218-- 1219 1220ifdef::VK_VERSION_1_1,VK_KHR_get_memory_requirements2[] 1221[open,refpage='vkGetImageSparseMemoryRequirements2',desc='Query the memory requirements for a sparse image',type='protos'] 1222-- 1223To query sparse memory requirements for an image, call: 1224 1225ifdef::VK_VERSION_1_1[] 1226include::{generated}/api/protos/vkGetImageSparseMemoryRequirements2.adoc[] 1227endif::VK_VERSION_1_1[] 1228 1229ifdef::VK_VERSION_1_1+VK_KHR_get_memory_requirements2[or the equivalent command] 1230 1231ifdef::VK_KHR_get_memory_requirements2[] 1232include::{generated}/api/protos/vkGetImageSparseMemoryRequirements2KHR.adoc[] 1233endif::VK_KHR_get_memory_requirements2[] 1234 1235 * pname:device is the logical device that owns the image. 1236 * pname:pInfo is a pointer to a sname:VkImageSparseMemoryRequirementsInfo2 1237 structure containing parameters required for the memory requirements 1238 query. 1239 * pname:pSparseMemoryRequirementCount is a pointer to an integer related 1240 to the number of sparse memory requirements available or queried, as 1241 described below. 1242 * pname:pSparseMemoryRequirements is either `NULL` or a pointer to an 1243 array of sname:VkSparseImageMemoryRequirements2 structures. 1244 1245include::{generated}/validity/protos/vkGetImageSparseMemoryRequirements2.adoc[] 1246-- 1247 1248ifdef::VK_VERSION_1_3,VK_KHR_maintenance4[] 1249[open,refpage='vkGetDeviceImageSparseMemoryRequirements',desc='Query the memory requirements for a sparse image',type='protos',alias='vkGetDeviceImageSparseMemoryRequirementsKHR'] 1250-- 1251To determine the sparse memory requirements for an image resource without 1252creating an object, call: 1253 1254ifdef::VK_VERSION_1_3[] 1255include::{generated}/api/protos/vkGetDeviceImageSparseMemoryRequirements.adoc[] 1256endif::VK_VERSION_1_3[] 1257 1258ifdef::VK_VERSION_1_3+VK_KHR_maintenance4[or the equivalent command] 1259 1260ifdef::VK_KHR_maintenance4[] 1261include::{generated}/api/protos/vkGetDeviceImageSparseMemoryRequirementsKHR.adoc[] 1262endif::VK_KHR_maintenance4[] 1263 1264 * pname:device is the logical device intended to own the image. 1265 * pname:pInfo is a pointer to a slink:VkDeviceImageMemoryRequirements 1266 structure containing parameters required for the memory requirements 1267 query. 1268 * pname:pSparseMemoryRequirementCount is a pointer to an integer related 1269 to the number of sparse memory requirements available or queried, as 1270 described below. 1271 * pname:pSparseMemoryRequirements is either `NULL` or a pointer to an 1272 array of sname:VkSparseImageMemoryRequirements2 structures. 1273 1274include::{generated}/validity/protos/vkGetDeviceImageSparseMemoryRequirements.adoc[] 1275-- 1276endif::VK_VERSION_1_3,VK_KHR_maintenance4[] 1277 1278[open,refpage='VkImageSparseMemoryRequirementsInfo2',desc='(None)',type='structs'] 1279-- 1280The sname:VkImageSparseMemoryRequirementsInfo2 structure is defined as: 1281 1282include::{generated}/api/structs/VkImageSparseMemoryRequirementsInfo2.adoc[] 1283 1284ifdef::VK_KHR_get_memory_requirements2[] 1285or the equivalent 1286 1287include::{generated}/api/structs/VkImageSparseMemoryRequirementsInfo2KHR.adoc[] 1288endif::VK_KHR_get_memory_requirements2[] 1289 1290 * pname:sType is a elink:VkStructureType value identifying this structure. 1291 * pname:pNext is `NULL` or a pointer to a structure extending this 1292 structure. 1293 * pname:image is the image to query. 1294 1295include::{generated}/validity/structs/VkImageSparseMemoryRequirementsInfo2.adoc[] 1296-- 1297 1298[open,refpage='VkSparseImageMemoryRequirements2',desc='(None)',type='structs'] 1299-- 1300The sname:VkSparseImageMemoryRequirements2 structure is defined as: 1301 1302include::{generated}/api/structs/VkSparseImageMemoryRequirements2.adoc[] 1303 1304ifdef::VK_KHR_get_memory_requirements2[] 1305or the equivalent 1306 1307include::{generated}/api/structs/VkSparseImageMemoryRequirements2KHR.adoc[] 1308endif::VK_KHR_get_memory_requirements2[] 1309 1310 * pname:sType is a elink:VkStructureType value identifying this structure. 1311 * pname:pNext is `NULL` or a pointer to a structure extending this 1312 structure. 1313 * pname:memoryRequirements is a slink:VkSparseImageMemoryRequirements 1314 structure describing the memory requirements of the sparse image. 1315 1316include::{generated}/validity/structs/VkSparseImageMemoryRequirements2.adoc[] 1317-- 1318endif::VK_VERSION_1_1,VK_KHR_get_memory_requirements2[] 1319 1320 1321[[sparsememory-resource-binding]] 1322=== Binding Resource Memory 1323 1324Non-sparse resources are backed by a single physical allocation prior to 1325device use (via fname:vkBindImageMemory or fname:vkBindBufferMemory), and 1326their backing must: not be changed. 1327On the other hand, sparse resources can: be bound to memory non-contiguously 1328and these bindings can: be altered during the lifetime of the resource. 1329 1330ifndef::VKSC_VERSION_1_0[] 1331 1332[NOTE] 1333.Note 1334==== 1335It is important to note that freeing a sname:VkDeviceMemory object with 1336fname:vkFreeMemory will not cause resources (or resource regions) bound to 1337the memory object to become unbound. 1338Applications must: not access resources bound to memory that has been freed. 1339==== 1340 1341endif::VKSC_VERSION_1_0[] 1342 1343Sparse memory bindings execute on a queue that includes the 1344ename:VK_QUEUE_SPARSE_BINDING_BIT bit. 1345Applications must: use <<synchronization,synchronization primitives>> to 1346guarantee that other queues do not access ranges of memory concurrently with 1347a binding change. 1348Applications can: access other ranges of the same resource while a bind 1349operation is executing. 1350 1351[NOTE] 1352.Note 1353==== 1354Implementations must: provide a guarantee that simultaneously binding sparse 1355blocks while another queue accesses those same sparse blocks via a sparse 1356resource must: not access memory owned by another process or otherwise 1357corrupt the system. 1358==== 1359 1360While some implementations may: include ename:VK_QUEUE_SPARSE_BINDING_BIT 1361support in queue families that also include graphics and compute support, 1362other implementations may: only expose a 1363ename:VK_QUEUE_SPARSE_BINDING_BIT-only queue family. 1364In either case, applications must: use <<synchronization,synchronization 1365primitives>> to explicitly request any ordering dependencies between sparse 1366memory binding operations and other graphics/compute/transfer operations, as 1367sparse binding operations are not automatically ordered against command 1368buffer execution, even within a single queue. 1369 1370When binding memory explicitly for the ename:VK_IMAGE_ASPECT_METADATA_BIT 1371the application must: use the ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT in 1372the sname:VkSparseMemoryBind::pname:flags field when binding memory. 1373Binding memory for metadata is done the same way as binding memory for the 1374mip tail, with the addition of the ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT 1375flag. 1376 1377Binding the mip tail for any aspect must: only be performed using 1378slink:VkSparseImageOpaqueMemoryBindInfo. 1379If pname:formatProperties.flags contains 1380ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT, then it can: be bound with 1381a single slink:VkSparseMemoryBind structure, with pname:resourceOffset = 1382pname:imageMipTailOffset and pname:size = pname:imageMipTailSize. 1383 1384If pname:formatProperties.flags does not contain 1385ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT then the offset for the mip 1386tail in each array layer is given as: 1387 1388[source,c++] 1389---- 1390arrayMipTailOffset = imageMipTailOffset + arrayLayer * imageMipTailStride; 1391---- 1392 1393and the mip tail can: be bound with code:layerCount slink:VkSparseMemoryBind 1394structures, each using pname:size = pname:imageMipTailSize and 1395pname:resourceOffset = ptext:arrayMipTailOffset as defined above. 1396 1397Sparse memory binding is handled by the following APIs and related data 1398structures. 1399 1400 1401[[sparsemem-memory-binding]] 1402==== Sparse Memory Binding Functions 1403 1404[open,refpage='VkSparseMemoryBind',desc='Structure specifying a sparse memory bind operation',type='structs'] 1405-- 1406The sname:VkSparseMemoryBind structure is defined as: 1407 1408include::{generated}/api/structs/VkSparseMemoryBind.adoc[] 1409 1410 * pname:resourceOffset is the offset into the resource. 1411 * pname:size is the size of the memory region to be bound. 1412 * pname:memory is the slink:VkDeviceMemory object that the range of the 1413 resource is bound to. 1414 If pname:memory is dlink:VK_NULL_HANDLE, the range is unbound. 1415 * pname:memoryOffset is the offset into the slink:VkDeviceMemory object to 1416 bind the resource range to. 1417 If pname:memory is dlink:VK_NULL_HANDLE, this value is ignored. 1418 * pname:flags is a bitmask of elink:VkSparseMemoryBindFlagBits specifying 1419 usage of the binding operation. 1420 1421The _binding range_ [eq]#[pname:resourceOffset, pname:resourceOffset {plus} 1422pname:size)# has different constraints based on pname:flags. 1423If pname:flags contains ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the 1424binding range must: be within the mip tail region of the metadata aspect. 1425This metadata region is defined by: 1426 1427 {empty}:: [eq]#metadataRegion = [base, base {plus} 1428 pname:imageMipTailSize)# 1429 {empty}:: [eq]#base = pname:imageMipTailOffset {plus} 1430 pname:imageMipTailStride {times} n# 1431 1432and pname:imageMipTailOffset, pname:imageMipTailSize, and 1433pname:imageMipTailStride values are from the 1434slink:VkSparseImageMemoryRequirements corresponding to the metadata aspect 1435of the image, and [eq]#n# is a valid array layer index for the image, 1436 1437pname:imageMipTailStride is considered to be zero for aspects where 1438sname:VkSparseImageMemoryRequirements::pname:formatProperties.flags contains 1439ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT. 1440 1441If pname:flags does not contain ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, 1442the binding range must: be within the range 1443[eq]#[0,slink:VkMemoryRequirements::pname:size)#. 1444 1445.Valid Usage 1446**** 1447 * [[VUID-VkSparseMemoryBind-memory-01096]] 1448 If pname:memory is not dlink:VK_NULL_HANDLE, pname:memory and 1449 pname:memoryOffset must: match the memory requirements of the resource, 1450 as described in section <<resources-association>> 1451 * [[VUID-VkSparseMemoryBind-memory-01097]] 1452 If pname:memory is not dlink:VK_NULL_HANDLE, pname:memory must: not have 1453 been created with a memory type that reports 1454 ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set 1455 * [[VUID-VkSparseMemoryBind-size-01098]] 1456 pname:size must: be greater than `0` 1457 * [[VUID-VkSparseMemoryBind-resourceOffset-01099]] 1458 pname:resourceOffset must: be less than the size of the resource 1459 * [[VUID-VkSparseMemoryBind-size-01100]] 1460 pname:size must: be less than or equal to the size of the resource minus 1461 pname:resourceOffset 1462 * [[VUID-VkSparseMemoryBind-memoryOffset-01101]] 1463 pname:memoryOffset must: be less than the size of pname:memory 1464 * [[VUID-VkSparseMemoryBind-size-01102]] 1465 pname:size must: be less than or equal to the size of pname:memory minus 1466 pname:memoryOffset 1467ifdef::VK_VERSION_1_1,VK_KHR_external_memory[] 1468 * [[VUID-VkSparseMemoryBind-memory-02730]] 1469 If pname:memory was created with 1470 slink:VkExportMemoryAllocateInfo::pname:handleTypes not equal to `0`, at 1471 least one handle type it contained must: also have been set in 1472 slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes or 1473 slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when the 1474 resource was created 1475 * [[VUID-VkSparseMemoryBind-memory-02731]] 1476 If pname:memory was created by a memory import operation, the external 1477 handle type of the imported memory must: also have been set in 1478 slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes or 1479 slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when the 1480 resource was created 1481endif::VK_VERSION_1_1,VK_KHR_external_memory[] 1482**** 1483 1484include::{generated}/validity/structs/VkSparseMemoryBind.adoc[] 1485-- 1486 1487[open,refpage='VkSparseMemoryBindFlagBits',desc='Bitmask specifying usage of a sparse memory binding operation',type='enums'] 1488-- 1489Bits which can: be set in slink:VkSparseMemoryBind::pname:flags, specifying 1490usage of a sparse memory binding operation, are: 1491 1492include::{generated}/api/enums/VkSparseMemoryBindFlagBits.adoc[] 1493 1494 * ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT specifies that the memory being 1495 bound is only for the metadata aspect. 1496-- 1497 1498[open,refpage='VkSparseMemoryBindFlags',desc='Bitmask of VkSparseMemoryBindFlagBits',type='flags'] 1499-- 1500include::{generated}/api/flags/VkSparseMemoryBindFlags.adoc[] 1501 1502tname:VkSparseMemoryBindFlags is a bitmask type for setting a mask of zero 1503or more elink:VkSparseMemoryBindFlagBits. 1504-- 1505 1506[open,refpage='VkSparseBufferMemoryBindInfo',desc='Structure specifying a sparse buffer memory bind operation',type='structs'] 1507-- 1508Memory is bound to sname:VkBuffer objects created with the 1509ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT flag using the following 1510structure: 1511 1512include::{generated}/api/structs/VkSparseBufferMemoryBindInfo.adoc[] 1513 1514 * pname:buffer is the slink:VkBuffer object to be bound. 1515 * pname:bindCount is the number of slink:VkSparseMemoryBind structures in 1516 the pname:pBinds array. 1517 * pname:pBinds is a pointer to an array of slink:VkSparseMemoryBind 1518 structures. 1519 1520include::{generated}/validity/structs/VkSparseBufferMemoryBindInfo.adoc[] 1521-- 1522 1523[open,refpage='VkSparseImageOpaqueMemoryBindInfo',desc='Structure specifying sparse image opaque memory bind information',type='structs'] 1524-- 1525Memory is bound to opaque regions of sname:VkImage objects created with the 1526ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT flag using the following structure: 1527 1528include::{generated}/api/structs/VkSparseImageOpaqueMemoryBindInfo.adoc[] 1529 1530 * pname:image is the slink:VkImage object to be bound. 1531 * pname:bindCount is the number of slink:VkSparseMemoryBind structures in 1532 the pname:pBinds array. 1533 * pname:pBinds is a pointer to an array of slink:VkSparseMemoryBind 1534 structures. 1535 1536.Valid Usage 1537**** 1538 * [[VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103]] 1539 If the pname:flags member of any element of pname:pBinds contains 1540 ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range defined 1541 must: be within the mip tail region of the metadata aspect of 1542 pname:image 1543**** 1544 1545include::{generated}/validity/structs/VkSparseImageOpaqueMemoryBindInfo.adoc[] 1546-- 1547 1548[NOTE] 1549.Note 1550==== 1551This operation is normally used to bind memory to fully-resident sparse 1552images or for mip tail regions of partially resident images. 1553However, it can: also be used to bind memory for the entire binding range of 1554partially resident images. 1555 1556In case pname:flags does not contain 1557ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the pname:resourceOffset is in the 1558range [eq]#[0, slink:VkMemoryRequirements::pname:size)#, This range includes 1559data from all aspects of the image, including metadata. 1560For most implementations this will probably mean that the 1561pname:resourceOffset is a simple device address offset within the resource. 1562It is possible for an application to bind a range of memory that includes 1563both resource data and metadata. 1564However, the application would not know what part of the image the memory is 1565used for, or if any range is being used for metadata. 1566 1567When pname:flags contains ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the 1568binding range specified must: be within the mip tail region of the metadata 1569aspect. 1570In this case the pname:resourceOffset is not required: to be a simple device 1571address offset within the resource. 1572However, it _is_ defined to be within [eq]#[pname:imageMipTailOffset, 1573pname:imageMipTailOffset {plus} pname:imageMipTailSize)# for the metadata 1574aspect. 1575See slink:VkSparseMemoryBind for the full constraints on binding region with 1576this flag present. 1577==== 1578 1579ifdef::editing-notes[] 1580[NOTE] 1581.editing-note 1582==== 1583(Jon) The preceding NOTE refers to pname:flags, which is presumably a 1584reference to slink:VkSparseMemoryBind above, even though that is not 1585contextually clear. 1586==== 1587endif::editing-notes[] 1588 1589[open,refpage='VkSparseImageMemoryBindInfo',desc='Structure specifying sparse image memory bind information',type='structs'] 1590-- 1591Memory can: be bound to sparse image blocks of sname:VkImage objects created 1592with the ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag using the following 1593structure: 1594 1595include::{generated}/api/structs/VkSparseImageMemoryBindInfo.adoc[] 1596 1597 * pname:image is the slink:VkImage object to be bound 1598 * pname:bindCount is the number of slink:VkSparseImageMemoryBind 1599 structures in pname:pBinds array 1600 * pname:pBinds is a pointer to an array of slink:VkSparseImageMemoryBind 1601 structures 1602 1603.Valid Usage 1604**** 1605 * [[VUID-VkSparseImageMemoryBindInfo-subresource-01722]] 1606 The pname:subresource.mipLevel member of each element of pname:pBinds 1607 must: be less than the pname:mipLevels specified in 1608 slink:VkImageCreateInfo when pname:image was created 1609 * [[VUID-VkSparseImageMemoryBindInfo-subresource-01723]] 1610 The pname:subresource.arrayLayer member of each element of pname:pBinds 1611 must: be less than the pname:arrayLayers specified in 1612 slink:VkImageCreateInfo when pname:image was created 1613 * [[VUID-VkSparseImageMemoryBindInfo-image-02901]] 1614 pname:image must: have been created with 1615 ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set 1616**** 1617 1618include::{generated}/validity/structs/VkSparseImageMemoryBindInfo.adoc[] 1619-- 1620 1621[open,refpage='VkSparseImageMemoryBind',desc='Structure specifying sparse image memory bind',type='structs'] 1622-- 1623The sname:VkSparseImageMemoryBind structure is defined as: 1624 1625include::{generated}/api/structs/VkSparseImageMemoryBind.adoc[] 1626 1627 * pname:subresource is the image _aspect_ and region of interest in the 1628 image. 1629 * pname:offset are the coordinates of the first texel within the image 1630 subresource to bind. 1631 * pname:extent is the size in texels of the region within the image 1632 subresource to bind. 1633 The extent must: be a multiple of the sparse image block dimensions, 1634 except when binding sparse image blocks along the edge of an image 1635 subresource it can: instead be such that any coordinate of 1636 [eq]#pname:offset {plus} pname:extent# equals the corresponding 1637 dimensions of the image subresource. 1638 * pname:memory is the slink:VkDeviceMemory object that the sparse image 1639 blocks of the image are bound to. 1640 If pname:memory is dlink:VK_NULL_HANDLE, the sparse image blocks are 1641 unbound. 1642 * pname:memoryOffset is an offset into slink:VkDeviceMemory object. 1643 If pname:memory is dlink:VK_NULL_HANDLE, this value is ignored. 1644 * pname:flags are sparse memory binding flags. 1645 1646.Valid Usage 1647**** 1648 * [[VUID-VkSparseImageMemoryBind-memory-01104]] 1649 If the <<features-sparseResidencyAliased, pname:sparseResidencyAliased>> 1650 feature is not enabled, and if any other resources are bound to ranges 1651 of pname:memory, the range of pname:memory being bound must: not overlap 1652 with those bound ranges 1653 * [[VUID-VkSparseImageMemoryBind-memory-01105]] 1654 pname:memory and pname:memoryOffset must: match the memory requirements 1655 of the calling command's pname:image, as described in section 1656 <<resources-association>> 1657 * [[VUID-VkSparseImageMemoryBind-subresource-01106]] 1658 pname:subresource must: be a valid image subresource for pname:image 1659 (see <<resources-image-views>>) 1660 * [[VUID-VkSparseImageMemoryBind-offset-01107]] 1661 pname:offset.x must: be a multiple of the sparse image block width 1662 (sname:VkSparseImageFormatProperties::pname:imageGranularity.width) of 1663 the image 1664 * [[VUID-VkSparseImageMemoryBind-extent-09388]] 1665 pname:extent.width must: be greater than `0` 1666 * [[VUID-VkSparseImageMemoryBind-extent-01108]] 1667 pname:extent.width must: either be a multiple of the sparse image block 1668 width of the image, or else [eq]#(pname:extent.width {plus} 1669 pname:offset.x)# must: equal the width of the image subresource 1670 * [[VUID-VkSparseImageMemoryBind-offset-01109]] 1671 pname:offset.y must: be a multiple of the sparse image block height 1672 (sname:VkSparseImageFormatProperties::pname:imageGranularity.height) of 1673 the image 1674 * [[VUID-VkSparseImageMemoryBind-extent-09389]] 1675 pname:extent.height must: be greater than `0` 1676 * [[VUID-VkSparseImageMemoryBind-extent-01110]] 1677 pname:extent.height must: either be a multiple of the sparse image block 1678 height of the image, or else [eq]#(pname:extent.height {plus} 1679 pname:offset.y)# must: equal the height of the image subresource 1680 * [[VUID-VkSparseImageMemoryBind-offset-01111]] 1681 pname:offset.z must: be a multiple of the sparse image block depth 1682 (sname:VkSparseImageFormatProperties::pname:imageGranularity.depth) of 1683 the image 1684 * [[VUID-VkSparseImageMemoryBind-extent-09390]] 1685 pname:extent.depth must: be greater than `0` 1686 * [[VUID-VkSparseImageMemoryBind-extent-01112]] 1687 pname:extent.depth must: either be a multiple of the sparse image block 1688 depth of the image, or else [eq]#(pname:extent.depth {plus} 1689 pname:offset.z)# must: equal the depth of the image subresource 1690ifdef::VK_VERSION_1_1,VK_KHR_external_memory[] 1691 * [[VUID-VkSparseImageMemoryBind-memory-02732]] 1692 If pname:memory was created with 1693 slink:VkExportMemoryAllocateInfo::pname:handleTypes not equal to `0`, at 1694 least one handle type it contained must: also have been set in 1695 slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when the image 1696 was created 1697 * [[VUID-VkSparseImageMemoryBind-memory-02733]] 1698 If pname:memory was created by a memory import operation, the external 1699 handle type of the imported memory must: also have been set in 1700 slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when 1701 pname:image was created 1702endif::VK_VERSION_1_1,VK_KHR_external_memory[] 1703**** 1704 1705include::{generated}/validity/structs/VkSparseImageMemoryBind.adoc[] 1706-- 1707 1708[open,refpage='vkQueueBindSparse',desc='Bind device memory to a sparse resource object',type='protos'] 1709-- 1710To submit sparse binding operations to a queue, call: 1711 1712include::{generated}/api/protos/vkQueueBindSparse.adoc[] 1713 1714 * pname:queue is the queue that the sparse binding operations will be 1715 submitted to. 1716 * pname:bindInfoCount is the number of elements in the pname:pBindInfo 1717 array. 1718 * pname:pBindInfo is a pointer to an array of slink:VkBindSparseInfo 1719 structures, each specifying a sparse binding submission batch. 1720 * pname:fence is an optional: handle to a fence to be signaled. 1721 If pname:fence is not dlink:VK_NULL_HANDLE, it defines a 1722 <<synchronization-fences-signaling, fence signal operation>>. 1723 1724fname:vkQueueBindSparse is a <<devsandqueues-submission,queue submission 1725command>>, with each batch defined by an element of pname:pBindInfo as a 1726slink:VkBindSparseInfo structure. 1727Batches begin execution in the order they appear in pname:pBindInfo, but 1728may: complete out of order. 1729 1730Within a batch, a given range of a resource must: not be bound more than 1731once. 1732Across batches, if a range is to be bound to one allocation and offset and 1733then to another allocation and offset, then the application must: guarantee 1734(usually using semaphores) that the binding operations are executed in the 1735correct order, as well as to order binding operations against the execution 1736of command buffer submissions. 1737 1738As no operation to flink:vkQueueBindSparse causes any pipeline stage to 1739access memory, synchronization primitives used in this command effectively 1740only define execution dependencies. 1741 1742Additional information about fence and semaphore operation is described in 1743<<synchronization, the synchronization chapter>>. 1744 1745.Valid Usage 1746**** 1747 * [[VUID-vkQueueBindSparse-fence-01113]] 1748 If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: be 1749 unsignaled 1750 * [[VUID-vkQueueBindSparse-fence-01114]] 1751 If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: not be 1752 associated with any other queue command that has not yet completed 1753 execution on that queue 1754 * [[VUID-vkQueueBindSparse-pSignalSemaphores-01115]] 1755 Each element of the pname:pSignalSemaphores member of each element of 1756 pname:pBindInfo must: be unsignaled when the semaphore signal operation 1757 it defines is executed on the device 1758 * [[VUID-vkQueueBindSparse-pWaitSemaphores-01116]] 1759 When a semaphore wait operation referring to a binary semaphore defined 1760 by any element of the pname:pWaitSemaphores member of any element of 1761 pname:pBindInfo executes on pname:queue, there must: be no other queues 1762 waiting on the same semaphore 1763ifndef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1764 * [[VUID-vkQueueBindSparse-pWaitSemaphores-01117]] 1765 All elements of the pname:pWaitSemaphores member of all elements of the 1766 pname:pBindInfo parameter referring to a binary semaphore must: be 1767 semaphores that are signaled, or have 1768 <<synchronization-semaphores-signaling, semaphore signal operations>> 1769 previously submitted for execution 1770endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1771ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1772 * [[VUID-vkQueueBindSparse-pWaitSemaphores-03245]] 1773 All elements of the pname:pWaitSemaphores member of all elements of 1774 pname:pBindInfo created with a elink:VkSemaphoreType of 1775 ename:VK_SEMAPHORE_TYPE_BINARY must: reference a semaphore signal 1776 operation that has been submitted for execution and any 1777 <<synchronization-semaphores-signaling, semaphore signal operations>> on 1778 which it depends (if any) must: have also been submitted for execution 1779endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1780**** 1781 1782include::{generated}/validity/protos/vkQueueBindSparse.adoc[] 1783-- 1784 1785[open,refpage='VkBindSparseInfo',desc='Structure specifying a sparse binding operation',type='structs'] 1786-- 1787The sname:VkBindSparseInfo structure is defined as: 1788 1789include::{generated}/api/structs/VkBindSparseInfo.adoc[] 1790 1791 * pname:sType is a elink:VkStructureType value identifying this structure. 1792 * pname:pNext is `NULL` or a pointer to a structure extending this 1793 structure. 1794 * pname:waitSemaphoreCount is the number of semaphores upon which to wait 1795 before executing the sparse binding operations for the batch. 1796 * pname:pWaitSemaphores is a pointer to an array of semaphores upon which 1797 to wait on before the sparse binding operations for this batch begin 1798 execution. 1799 If semaphores to wait on are provided, they define a 1800 <<synchronization-semaphores-waiting, semaphore wait operation>>. 1801 * pname:bufferBindCount is the number of sparse buffer bindings to perform 1802 in the batch. 1803 * pname:pBufferBinds is a pointer to an array of 1804 slink:VkSparseBufferMemoryBindInfo structures. 1805 * pname:imageOpaqueBindCount is the number of opaque sparse image bindings 1806 to perform. 1807 * pname:pImageOpaqueBinds is a pointer to an array of 1808 slink:VkSparseImageOpaqueMemoryBindInfo structures, indicating opaque 1809 sparse image bindings to perform. 1810 * pname:imageBindCount is the number of sparse image bindings to perform. 1811 * pname:pImageBinds is a pointer to an array of 1812 slink:VkSparseImageMemoryBindInfo structures, indicating sparse image 1813 bindings to perform. 1814 * pname:signalSemaphoreCount is the number of semaphores to be signaled 1815 once the sparse binding operations specified by the structure have 1816 completed execution. 1817 * pname:pSignalSemaphores is a pointer to an array of semaphores which 1818 will be signaled when the sparse binding operations for this batch have 1819 completed execution. 1820 If semaphores to be signaled are provided, they define a 1821 <<synchronization-semaphores-signaling, semaphore signal operation>>. 1822 1823ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1824.Valid Usage 1825**** 1826 * [[VUID-VkBindSparseInfo-pWaitSemaphores-03246]] 1827 If any element of pname:pWaitSemaphores or pname:pSignalSemaphores was 1828 created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE 1829 then the pname:pNext chain must: include a 1830 slink:VkTimelineSemaphoreSubmitInfo structure 1831 * [[VUID-VkBindSparseInfo-pNext-03247]] 1832 If the pname:pNext chain of this structure includes a 1833 slink:VkTimelineSemaphoreSubmitInfo structure and any element of 1834 pname:pWaitSemaphores was created with a elink:VkSemaphoreType of 1835 ename:VK_SEMAPHORE_TYPE_TIMELINE then its pname:waitSemaphoreValueCount 1836 member must: equal pname:waitSemaphoreCount 1837 * [[VUID-VkBindSparseInfo-pNext-03248]] 1838 If the pname:pNext chain of this structure includes a 1839 slink:VkTimelineSemaphoreSubmitInfo structure and any element of 1840 pname:pSignalSemaphores was created with a elink:VkSemaphoreType of 1841 ename:VK_SEMAPHORE_TYPE_TIMELINE then its 1842 pname:signalSemaphoreValueCount member must: equal 1843 pname:signalSemaphoreCount 1844 * [[VUID-VkBindSparseInfo-pSignalSemaphores-03249]] 1845 For each element of pname:pSignalSemaphores created with a 1846 elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the 1847 corresponding element of 1848 slink:VkTimelineSemaphoreSubmitInfo::pname:pSignalSemaphoreValues must: 1849 have a value greater than the current value of the semaphore when the 1850 <<synchronization-semaphores-signaling,semaphore signal operation>> is 1851 executed 1852 * [[VUID-VkBindSparseInfo-pWaitSemaphores-03250]] 1853 For each element of pname:pWaitSemaphores created with a 1854 elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the 1855 corresponding element of 1856 slink:VkTimelineSemaphoreSubmitInfo::pname:pWaitSemaphoreValues must: 1857 have a value which does not differ from the current value of the 1858 semaphore or from the value of any outstanding semaphore wait or signal 1859 operation on that semaphore by more than 1860 <<limits-maxTimelineSemaphoreValueDifference, 1861 pname:maxTimelineSemaphoreValueDifference>> 1862 * [[VUID-VkBindSparseInfo-pSignalSemaphores-03251]] 1863 For each element of pname:pSignalSemaphores created with a 1864 elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the 1865 corresponding element of 1866 slink:VkTimelineSemaphoreSubmitInfo::pname:pSignalSemaphoreValues must: 1867 have a value which does not differ from the current value of the 1868 semaphore or from the value of any outstanding semaphore wait or signal 1869 operation on that semaphore by more than 1870 <<limits-maxTimelineSemaphoreValueDifference, 1871 pname:maxTimelineSemaphoreValueDifference>> 1872**** 1873endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1874 1875include::{generated}/validity/structs/VkBindSparseInfo.adoc[] 1876-- 1877 1878ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1879To specify the values to use when waiting for and signaling semaphores 1880created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE, 1881add a slink:VkTimelineSemaphoreSubmitInfo structure to the pname:pNext chain 1882of the slink:VkBindSparseInfo structure. 1883endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[] 1884 1885ifdef::VK_VERSION_1_1,VK_KHR_device_group[] 1886[open,refpage='VkDeviceGroupBindSparseInfo',desc='Structure indicating which instances are bound',type='structs'] 1887-- 1888If the pname:pNext chain of slink:VkBindSparseInfo includes a 1889sname:VkDeviceGroupBindSparseInfo structure, then that structure includes 1890device indices specifying which instance of the resources and memory are 1891bound. 1892 1893The sname:VkDeviceGroupBindSparseInfo structure is defined as: 1894 1895include::{generated}/api/structs/VkDeviceGroupBindSparseInfo.adoc[] 1896 1897ifdef::VK_KHR_device_group[] 1898or the equivalent 1899 1900include::{generated}/api/structs/VkDeviceGroupBindSparseInfoKHR.adoc[] 1901endif::VK_KHR_device_group[] 1902 1903 * pname:sType is a elink:VkStructureType value identifying this structure. 1904 * pname:pNext is `NULL` or a pointer to a structure extending this 1905 structure. 1906 * pname:resourceDeviceIndex is a device index indicating which instance of 1907 the resource is bound. 1908 * pname:memoryDeviceIndex is a device index indicating which instance of 1909 the memory the resource instance is bound to. 1910 1911These device indices apply to all buffer and image memory binds included in 1912the batch pointing to this structure. 1913The semaphore waits and signals for the batch are executed only by the 1914physical device specified by the pname:resourceDeviceIndex. 1915 1916If this structure is not present, pname:resourceDeviceIndex and 1917pname:memoryDeviceIndex are assumed to be zero. 1918 1919.Valid Usage 1920**** 1921 * [[VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118]] 1922 pname:resourceDeviceIndex and pname:memoryDeviceIndex must: both be 1923 valid device indices 1924 * [[VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119]] 1925 Each memory allocation bound in this batch must: have allocated an 1926 instance for pname:memoryDeviceIndex 1927**** 1928 1929include::{generated}/validity/structs/VkDeviceGroupBindSparseInfo.adoc[] 1930-- 1931endif::VK_VERSION_1_1,VK_KHR_device_group[] 1932endif::VKSC_VERSION_1_0[] 1933