| // Copyright 2015-2021 The Khronos Group, Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| [[descriptorsets]] |
| = Resource Descriptors |
| |
| A _descriptor_ is an opaque data structure representing a shader resource |
| such as a buffer, buffer view, image view, sampler, or combined image |
| sampler. |
| Descriptors are organised into _descriptor sets_, which are bound during |
| command recording for use in subsequent drawing commands. |
| The arrangement of content in each descriptor set is determined by a |
| _descriptor set layout_, which determines what descriptors can be stored |
| within it. |
| The sequence of descriptor set layouts that can: be used by a pipeline is |
| specified in a _pipeline layout_. |
| Each pipeline object can: use up to pname:maxBoundDescriptorSets (see |
| <<limits, Limits>>) descriptor sets. |
| |
| Shaders access resources via variables decorated with a descriptor set and |
| binding number that link them to a descriptor in a descriptor set. |
| The shader interface mapping to bound descriptor sets is described in the |
| <<interfaces-resources, Shader Resource Interface>> section. |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[] |
| Shaders can: also access buffers without going through descriptors by using |
| <<descriptorsets-physical-storage-buffer,Physical Storage Buffer Access>> to |
| access them through 64-bit addresses. |
| endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[] |
| |
| |
| [[descriptorsets-types]] |
| == Descriptor Types |
| |
| There are a number of different types of descriptor supported by Vulkan, |
| corresponding to different resources or usage. |
| The following sections describe the API definitions of each descriptor type. |
| The mapping of each type to SPIR-V is listed in the |
| <<interfaces-resources-correspondence, Shader Resource and Descriptor Type |
| Correspondence>> and <<interfaces-resources-storage-class-correspondence, |
| Shader Resource and Storage Class Correspondence>> tables in the |
| <<interfaces, Shader Interfaces>> chapter. |
| |
| |
| [[descriptorsets-storageimage]] |
| === Storage Image |
| |
| A _storage image_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) is a descriptor |
| type associated with an <<resources-images, image resource>> via an |
| <<resources-image-views, image view>> that load, store, and atomic |
| operations can: be performed on. |
| |
| Storage image loads are supported in all shader stages for image views whose |
| <<resources-image-view-format-features,format features>> contain |
| <<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT>>. |
| |
| Stores to storage images are supported in compute shaders for image views |
| whose <<resources-image-view-format-features,format features>> contain |
| <<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT>>. |
| |
| Atomic operations on storage images are supported in compute shaders for |
| image views whose <<resources-image-view-format-features,format features>> |
| contain |
| <<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT>>. |
| |
| When the <<features-fragmentStoresAndAtomics, |
| pname:fragmentStoresAndAtomics>> feature is enabled, stores and atomic |
| operations are also supported for storage images in fragment shaders with |
| the same set of image formats as supported in compute shaders. |
| When the <<features-vertexPipelineStoresAndAtomics, |
| pname:vertexPipelineStoresAndAtomics>> feature is enabled, stores and atomic |
| operations are also supported in vertex, tessellation, and geometry shaders |
| with the same set of image formats as supported in compute shaders. |
| |
| The image subresources for a storage image must: be in the |
| ifdef::VK_KHR_shared_presentable_image[] |
| ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or |
| endif::VK_KHR_shared_presentable_image[] |
| ename:VK_IMAGE_LAYOUT_GENERAL layout in order to access its data in a |
| shader. |
| |
| |
| [[descriptorsets-sampler]] |
| === Sampler |
| |
| A _sampler descriptor_ (ename:VK_DESCRIPTOR_TYPE_SAMPLER) is a descriptor |
| type associated with a <<samplers,sampler>> object, used to control the |
| behavior of <<textures,sampling operations>> performed on a |
| <<descriptorsets-sampledimage, sampled image>>. |
| |
| |
| [[descriptorsets-sampledimage]] |
| === Sampled Image |
| |
| A _sampled image_ (ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) is a descriptor |
| type associated with an <<resources-images, image resource>> via an |
| <<resources-image-views, image view>> that <<textures,sampling operations>> |
| can: be performed on. |
| |
| Shaders combine a sampled image variable and a sampler variable to perform |
| sampling operations. |
| |
| Sampled images are supported in all shader stages for image views whose |
| <<resources-image-view-format-features,format features>> contain |
| <<formats-properties,ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT>>. |
| |
| The image subresources for a sampled image must: be in the |
| ifdef::VK_KHR_shared_presentable_image[] |
| ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, |
| endif::VK_KHR_shared_presentable_image[] |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, |
| ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, |
| endif::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[] |
| ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, |
| ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, |
| endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[] |
| ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, |
| ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, or |
| ename:VK_IMAGE_LAYOUT_GENERAL layout in order to access its data in a |
| shader. |
| |
| |
| [[descriptorsets-combinedimagesampler]] |
| === Combined Image Sampler |
| |
| A _combined image sampler_ (ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) |
| is a single descriptor type associated with both a <<samplers,sampler>> and |
| an <<resources-images,image resource>>, combining both a |
| <<descriptorsets-sampler,sampler>> and <<descriptorsets-sampledimage, |
| sampled image>> descriptor into a single descriptor. |
| |
| ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| If the descriptor refers to a sampler that performs |
| ifndef::VK_EXT_fragment_density_map[] |
| <<samplers-YCbCr-conversion,{YCbCr} conversion>>, |
| endif::VK_EXT_fragment_density_map[] |
| ifdef::VK_EXT_fragment_density_map[] |
| <<samplers-YCbCr-conversion,{YCbCr} conversion>> or samples a |
| <<samplers-subsamplesampler,subsampled image>>, |
| endif::VK_EXT_fragment_density_map[] |
| the sampler must: only be used to sample the image in the same descriptor. |
| Otherwise, the |
| endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| ifndef::VK_EXT_fragment_density_map[] |
| The |
| endif::VK_EXT_fragment_density_map[] |
| ifdef::VK_EXT_fragment_density_map[] |
| If the descriptor refers to a sampler that samples a |
| <<samplers-subsamplesampler,subsampled image>>, the sampler must: only be |
| used to sample the image in the same descriptor. |
| Otherwise, the |
| endif::VK_EXT_fragment_density_map[] |
| endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| sampler and image in this type of descriptor can: be used freely with any |
| other samplers and images. |
| |
| The image subresources for a combined image sampler must: be in the |
| ifdef::VK_KHR_shared_presentable_image[] |
| ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, |
| endif::VK_KHR_shared_presentable_image[] |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, |
| ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, |
| endif::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[] |
| ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, |
| ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, |
| endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[] |
| ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, |
| ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, or |
| ename:VK_IMAGE_LAYOUT_GENERAL layout in order to access its data in a |
| shader. |
| |
| [NOTE] |
| .Note |
| ==== |
| On some implementations, it may: be more efficient to sample from an image |
| using a combination of sampler and sampled image that are stored together in |
| the descriptor set in a combined descriptor. |
| ==== |
| |
| |
| [[descriptorsets-uniformtexelbuffer]] |
| === Uniform Texel Buffer |
| |
| A _uniform texel buffer_ (ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) is |
| a descriptor type associated with a <<resources-buffers,buffer resource>> |
| via a <<resources-buffer-views, buffer view>> that <<textures,formatted load |
| operations>> can: be performed on. |
| |
| Uniform texel buffers define a tightly-packed 1-dimensional linear array of |
| texels, with texels going through format conversion when read in a shader in |
| the same way as they are for an image. |
| |
| Load operations from uniform texel buffers are supported in all shader |
| stages for image formats which report support for the |
| <<formats-properties,ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT>> |
| feature bit via flink:vkGetPhysicalDeviceFormatProperties in |
| slink:VkFormatProperties::pname:bufferFeatures. |
| |
| |
| [[descriptorsets-storagetexelbuffer]] |
| === Storage Texel Buffer |
| |
| A _storage texel buffer_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) is |
| a descriptor type associated with a <<resources-buffers,buffer resource>> |
| via a <<resources-buffer-views, buffer view>> that <<textures,formatted |
| load, store, and atomic operations>> can: be performed on. |
| |
| Storage texel buffers define a tightly-packed 1-dimensional linear array of |
| texels, with texels going through format conversion when read in a shader in |
| the same way as they are for an image. |
| Unlike <<descriptorsets-uniformtexelbuffer,uniform texel buffers>>, these |
| buffers can also be written to in the same way as for |
| <<descriptorsets-storageimage, storage images>>. |
| |
| Storage texel buffer loads are supported in all shader stages for texel |
| buffer formats which report support for the |
| <<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT>> |
| feature bit via flink:vkGetPhysicalDeviceFormatProperties in |
| slink:VkFormatProperties::pname:bufferFeatures. |
| |
| Stores to storage texel buffers are supported in compute shaders for texel |
| buffer formats which report support for the |
| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT feature via |
| flink:vkGetPhysicalDeviceFormatProperties in |
| slink:VkFormatProperties::pname:bufferFeatures. |
| |
| Atomic operations on storage texel buffers are supported in compute shaders |
| for texel buffer formats which report support for the |
| <<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT>> |
| feature via flink:vkGetPhysicalDeviceFormatProperties in |
| slink:VkFormatProperties::pname:bufferFeatures. |
| |
| When the <<features-fragmentStoresAndAtomics, |
| pname:fragmentStoresAndAtomics>> feature is enabled, stores and atomic |
| operations are also supported for storage texel buffers in fragment shaders |
| with the same set of texel buffer formats as supported in compute shaders. |
| When the <<features-vertexPipelineStoresAndAtomics, |
| pname:vertexPipelineStoresAndAtomics>> feature is enabled, stores and atomic |
| operations are also supported in vertex, tessellation, and geometry shaders |
| with the same set of texel buffer formats as supported in compute shaders. |
| |
| |
| [[descriptorsets-storagebuffer]] |
| === Storage Buffer |
| |
| A _storage buffer_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) is a descriptor |
| type associated with a <<resources-buffers,buffer resource>> directly, |
| described in a shader as a structure with various members that load, store, |
| and atomic operations can: be performed on. |
| |
| [NOTE] |
| .Note |
| ==== |
| Atomic operations can: only be performed on members of certain types as |
| defined in the <<spirvenv, SPIR-V environment appendix>>. |
| ==== |
| |
| |
| [[descriptorsets-uniformbuffer]] |
| === Uniform Buffer |
| |
| A _uniform buffer_ (ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) is a descriptor |
| type associated with a <<resources-buffers,buffer resource>> directly, |
| described in a shader as a structure with various members that load |
| operations can: be performed on. |
| |
| |
| [[descriptorsets-uniformbufferdynamic]] |
| === Dynamic Uniform Buffer |
| |
| A _dynamic uniform buffer_ (ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) |
| is almost identical to a <<descriptorsets-uniformbuffer, uniform buffer>>, |
| and differs only in how the offset into the buffer is specified. |
| The base offset calculated by the slink:VkDescriptorBufferInfo when |
| initially <<descriptorsets-updates, updating the descriptor set>> is added |
| to a <<descriptorsets-binding-dynamicoffsets, dynamic offset>> when binding |
| the descriptor set. |
| |
| |
| [[descriptorsets-storagebufferdynamic]] |
| === Dynamic Storage Buffer |
| |
| A _dynamic storage buffer_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) |
| is almost identical to a <<descriptorsets-storagebuffer, storage buffer>>, |
| and differs only in how the offset into the buffer is specified. |
| The base offset calculated by the slink:VkDescriptorBufferInfo when |
| initially <<descriptorsets-updates, updating the descriptor set>> is added |
| to a <<descriptorsets-binding-dynamicoffsets, dynamic offset>> when binding |
| the descriptor set. |
| |
| |
| ifdef::VK_EXT_inline_uniform_block[] |
| |
| [[descriptorsets-inlineuniformblock]] |
| === Inline Uniform Block |
| |
| An _inline uniform block_ |
| (ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) is almost identical to a |
| <<descriptorsets-uniformbuffer, uniform buffer>>, and differs only in taking |
| its storage directly from the encompassing descriptor set instead of being |
| backed by buffer memory. |
| It is typically used to access a small set of constant data that does not |
| require the additional flexibility provided by the indirection enabled when |
| using a uniform buffer where the descriptor and the referenced buffer memory |
| are decoupled. |
| Compared to push constants, they allow reusing the same set of constant data |
| across multiple disjoint sets of drawing and dispatching commands. |
| |
| Inline uniform block descriptors cannot: be aggregated into arrays. |
| Instead, the array size specified for an inline uniform block descriptor |
| binding specifies the binding's capacity in bytes. |
| |
| endif::VK_EXT_inline_uniform_block[] |
| |
| |
| [[descriptorsets-inputattachment]] |
| === Input Attachment |
| |
| An _input attachment_ (ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) is a |
| descriptor type associated with an <<resources-images, image resource>> via |
| an <<resources-image-views, image view>> that can: be used for |
| <<synchronization-framebuffer-regions,framebuffer local>> load operations in |
| fragment shaders. |
| |
| All image formats that are supported for color attachments |
| (ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) or depth/stencil attachments |
| (ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) for a given image |
| tiling mode are also supported for input attachments. |
| |
| The image subresources for an input attachment must: be in a |
| <<attachment-type-imagelayout, valid image layout>> in order to access its |
| data in a shader. |
| |
| ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[] |
| [[descriptorsets-accelerationstructure]] |
| === Acceleration Structure |
| |
| An _acceleration structure_ ( |
| ifdef::VK_KHR_acceleration_structure[ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR] |
| ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or] |
| ifdef::VK_NV_ray_tracing[ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV] |
| ) is a descriptor type that is used to retrieve scene geometry from within |
| shaders that are used for ray traversal. |
| Shaders have read-only access to the memory. |
| endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[] |
| |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| [[descriptorsets-mutable]] |
| === Mutable |
| |
| A descriptor of _mutable_ (ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE) type |
| indicates that this descriptor can: mutate to any of the descriptor types |
| given in the |
| slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pDescriptorTypes list of |
| descriptor types in the pname:pNext chain of |
| slink:VkDescriptorSetLayoutCreateInfo for this binding. |
| At any point, each individual descriptor of mutable type has an active |
| descriptor type. |
| The active descriptor type can: be any one of the declared types in |
| pname:pDescriptorTypes. |
| Additionally, a mutable descriptor's active descriptor type can: be of the |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE type, which is the initial active |
| descriptor type. |
| The active descriptor type can: change when the descriptor is updated. |
| When a descriptor is consumed by binding a descriptor set, the active |
| descriptor type is considered, not ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE. |
| |
| An active descriptor type of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE is |
| considered an undefined: descriptor. |
| If a descriptor is consumed where the active descriptor type does not match |
| what the shader expects, the descriptor is considered an undefined: |
| descriptor. |
| |
| [NOTE] |
| .Note |
| ==== |
| To find which descriptor types are supported as |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the application can: use |
| flink:vkGetDescriptorSetLayoutSupport with an |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE binding, with the list of descriptor |
| types to query in the |
| slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pDescriptorTypes array |
| for that binding. |
| ==== |
| |
| [NOTE] |
| .Note |
| ==== |
| The intention of a mutable descriptor type is that implementations allocate |
| N bytes per descriptor, where N is determined by the maximum descriptor size |
| for a given descriptor binding. |
| Implementations are not expected to keep track of the active descriptor |
| type, and it should be considered a C-like union type. |
| |
| A mutable descriptor type is not considered as efficient in terms of |
| run-time performance as using a non-mutable descriptor type, and |
| applications are not encouraged to use them outside API layering efforts. |
| Mutable descriptor types can be more efficient if the alternative is using |
| many different descriptors to emulate mutable descriptor types. |
| ==== |
| |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| [[descriptorsets-sets]] |
| == Descriptor Sets |
| |
| Descriptors are grouped together into descriptor set objects. |
| A descriptor set object is an opaque object containing storage for a set of |
| descriptors, where the types and number of descriptors is defined by a |
| descriptor set layout. |
| The layout object may: be used to define the association of each descriptor |
| binding with memory or other implementation resources. |
| The layout is used both for determining the resources that need to be |
| associated with the descriptor set, and determining the interface between |
| shader stages and shader resources. |
| |
| |
| [[descriptorsets-setlayout]] |
| === Descriptor Set Layout |
| |
| [open,refpage='VkDescriptorSetLayout',desc='Opaque handle to a descriptor set layout object',type='handles'] |
| -- |
| A descriptor set layout object is defined by an array of zero or more |
| descriptor bindings. |
| Each individual descriptor binding is specified by a descriptor type, a |
| count (array size) of the number of descriptors in the binding, a set of |
| shader stages that can: access the binding, and (if using immutable |
| samplers) an array of sampler descriptors. |
| |
| Descriptor set layout objects are represented by sname:VkDescriptorSetLayout |
| handles: |
| |
| include::{generated}/api/handles/VkDescriptorSetLayout.txt[] |
| -- |
| |
| [open,refpage='vkCreateDescriptorSetLayout',desc='Create a new descriptor set layout',type='protos'] |
| -- |
| To create descriptor set layout objects, call: |
| |
| include::{generated}/api/protos/vkCreateDescriptorSetLayout.txt[] |
| |
| * pname:device is the logical device that creates the descriptor set |
| layout. |
| * pname:pCreateInfo is a pointer to a |
| slink:VkDescriptorSetLayoutCreateInfo structure specifying the state of |
| the descriptor set layout object. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| * pname:pSetLayout is a pointer to a slink:VkDescriptorSetLayout handle in |
| which the resulting descriptor set layout object is returned. |
| |
| include::{generated}/validity/protos/vkCreateDescriptorSetLayout.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorSetLayoutCreateInfo',desc='Structure specifying parameters of a newly created descriptor set layout',type='structs'] |
| -- |
| Information about the descriptor set layout is passed in a |
| sname:VkDescriptorSetLayoutCreateInfo structure: |
| |
| include::{generated}/api/structs/VkDescriptorSetLayoutCreateInfo.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:flags is a bitmask |
| ifdef::VK_KHR_push_descriptor[] |
| of elink:VkDescriptorSetLayoutCreateFlagBits |
| endif::VK_KHR_push_descriptor[] |
| specifying options for descriptor set layout creation. |
| * pname:bindingCount is the number of elements in pname:pBindings. |
| * pname:pBindings is a pointer to an array of |
| slink:VkDescriptorSetLayoutBinding structures. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-binding-00279]] |
| The slink:VkDescriptorSetLayoutBinding::pname:binding members of the |
| elements of the pname:pBindings array must: each have different values |
| ifdef::VK_KHR_push_descriptor[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-00280]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all |
| elements of pname:pBindings must: not have a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-02208]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all |
| elements of pname:pBindings must: not have a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-00281]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then the |
| total number of elements of all bindings must: be less than or equal to |
| slink:VkPhysicalDevicePushDescriptorPropertiesKHR::pname:maxPushDescriptors |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04590]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, |
| pname:flags must: not contain |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04591]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, |
| pname:pBindings must: not have a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| endif::VK_VALVE_mutable_descriptor_type[] |
| endif::VK_KHR_push_descriptor[] |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-03000]] |
| If any binding has the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| bit set, pname:flags must: include |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001]] |
| If any binding has the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| bit set, then all bindings must: not have pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04592]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, |
| pname:flags must: not contain |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE |
| endif::VK_VALVE_mutable_descriptor_type[] |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04593]] |
| If any binding has a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, then a |
| slink:VkMutableDescriptorTypeCreateInfoVALVE must: be present in the |
| pname:pNext chain |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04594]] |
| If a binding has a pname:descriptorType value of |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, then sname:pImmutableSamplers |
| must: be `NULL` |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-mutableDescriptorType-04595]] |
| If |
| slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType |
| is not enabled, pname:pBindings must: not contain a pname:descriptorType |
| of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04596]] |
| If pname:flags contains |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE, |
| slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType |
| must: be enabled |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorSetLayoutCreateInfo.txt[] |
| -- |
| |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| |
| [open,refpage='VkMutableDescriptorTypeCreateInfoVALVE',desc='Structure describing the list of possible active descriptor types for mutable type descriptors',type='structs'] |
| -- |
| Information about the possible descriptor types for mutable descriptor types |
| is passed in a sname:VkMutableDescriptorTypeCreateInfoVALVE structure as a |
| pname:pNext to a slink:VkDescriptorSetLayoutCreateInfo structure or a |
| slink:VkDescriptorPoolCreateInfo structure. |
| |
| The sname:VkMutableDescriptorTypeCreateInfoVALVE structure is defined as: |
| |
| include::{generated}/api/structs/VkMutableDescriptorTypeCreateInfoVALVE.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:mutableDescriptorTypeListCount is the number of elements in |
| pname:pMutableDescriptorTypeLists. |
| * pname:pMutableDescriptorTypeLists is a pointer to an array of |
| sname:VkMutableDescriptorTypeListVALVE structures. |
| |
| If pname:mutableDescriptorTypeListCount is zero or if this structure is not |
| included in the pname:pNext chain, the |
| slink:VkMutableDescriptorTypeListVALVE for each element is considered to be |
| zero or `NULL` for each member. |
| Otherwise, the descriptor set layout binding at |
| slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings[i] uses the |
| descriptor type lists in |
| slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pMutableDescriptorTypeLists[i]. |
| |
| include::{generated}/validity/structs/VkMutableDescriptorTypeCreateInfoVALVE.txt[] |
| -- |
| |
| [open,refpage='VkMutableDescriptorTypeListVALVE',desc='Structure describing descriptor types that a given descriptor may mutate to',type='structs'] |
| -- |
| The list of potential descriptor types a given mutable descriptor can: |
| mutate to is passed in a sname:VkMutableDescriptorTypeListVALVE structure. |
| |
| The sname:VkMutableDescriptorTypeListVALVE structure is defined as: |
| |
| include::{generated}/api/structs/VkMutableDescriptorTypeListVALVE.txt[] |
| |
| * pname:descriptorTypeCount is the number of elements in |
| pname:pDescriptorTypes. |
| * pname:pDescriptorTypes is `NULL` or a pointer to an array of |
| pname:descriptorTypeCount elink:VkDescriptorType values which define |
| which descriptor types a given binding may mutate to. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkMutableDescriptorTypeListVALVE-descriptorTypeCount-04597]] |
| pname:descriptorTypeCount must: not be `0` if the corresponding binding |
| is of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04598]] |
| pname:pDescriptorTypes must: be a valid pointer to an array of |
| pname:descriptorTypeCount valid, unique elink:VkDescriptorType values if |
| the given binding is of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE type |
| * [[VUID-VkMutableDescriptorTypeListVALVE-descriptorTypeCount-04599]] |
| pname:descriptorTypeCount must: be `0` if the corresponding binding is |
| not of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04600]] |
| pname:pDescriptorTypes must: not contain |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04601]] |
| pname:pDescriptorTypes must: not contain |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC |
| * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04602]] |
| pname:pDescriptorTypes must: not contain |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04603]] |
| pname:pDescriptorTypes must: not contain |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT |
| endif::VK_EXT_inline_uniform_block[] |
| **** |
| |
| include::{generated}/validity/structs/VkMutableDescriptorTypeListVALVE.txt[] |
| -- |
| |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| [open,refpage='VkDescriptorSetLayoutCreateFlagBits',desc='Bitmask specifying descriptor set layout properties',type='enums'] |
| -- |
| Bits which can: be set in slink:VkDescriptorSetLayoutCreateInfo::pname:flags |
| to specify options for descriptor set layout are: |
| |
| include::{generated}/api/enums/VkDescriptorSetLayoutCreateFlagBits.txt[] |
| |
| ifdef::VK_KHR_push_descriptor[] |
| * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR specifies |
| that descriptor sets must: not be allocated using this layout, and |
| descriptors are instead pushed by flink:vkCmdPushDescriptorSetKHR. |
| endif::VK_KHR_push_descriptor[] |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| // Jon - "UpdateAfterBind" is a vague reference, should be more precise / |
| // link to the right specification area |
| * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT |
| specifies that descriptor sets using this layout must: be allocated from |
| a descriptor pool created with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT bit set. |
| Descriptor set layouts created with this bit set have alternate limits |
| for the maximum number of descriptors per-stage and per-pipeline layout. |
| The non-UpdateAfterBind limits only count descriptors in sets created |
| without this flag. |
| The UpdateAfterBind limits count all descriptors, but the limits may: be |
| higher than the non-UpdateAfterBind limits. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE specifies |
| that descriptor sets using this layout must: be allocated from a |
| descriptor pool created with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE bit set. |
| Descriptor set layouts created with this bit have no expressable limit |
| for maximum number of descriptors per-stage. |
| Host descriptor sets are limited only by available host memory, but may: |
| be limited for implementation specific reasons. |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| Implementations may: limit the number of supported descriptors to |
| UpdateAfterBind limits or non-UpdateAfterBind limits, whichever is |
| larger. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| Implementations may: limit the number of supported descriptors to |
| non-UpdateAfterBind limits. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| ifndef::VK_KHR_push_descriptor[] |
| [NOTE] |
| .Note |
| ==== |
| All bits for this type are defined by extensions, and none of those |
| extensions are enabled in this build of the specification. |
| ==== |
| endif::VK_KHR_push_descriptor[] |
| -- |
| |
| [open,refpage='VkDescriptorSetLayoutCreateFlags',desc='Bitmask of VkDescriptorSetLayoutCreateFlagBits',type='flags'] |
| -- |
| include::{generated}/api/flags/VkDescriptorSetLayoutCreateFlags.txt[] |
| |
| tname:VkDescriptorSetLayoutCreateFlags is a bitmask type for setting a mask |
| of zero or more elink:VkDescriptorSetLayoutCreateFlagBits. |
| -- |
| |
| [open,refpage='VkDescriptorSetLayoutBinding',desc='Structure specifying a descriptor set layout binding',type='structs'] |
| -- |
| The sname:VkDescriptorSetLayoutBinding structure is defined as: |
| |
| include::{generated}/api/structs/VkDescriptorSetLayoutBinding.txt[] |
| |
| * pname:binding is the binding number of this entry and corresponds to a |
| resource of the same binding number in the shader stages. |
| * pname:descriptorType is a elink:VkDescriptorType specifying which type |
| of resource descriptors are used for this binding. |
| * pname:descriptorCount is the number of descriptors contained in the |
| binding, accessed in a shader as an |
| ifndef::VK_EXT_inline_uniform_block[array.] |
| ifdef::VK_EXT_inline_uniform_block[] |
| array, except if pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT in which case |
| pname:descriptorCount is the size in bytes of the inline uniform block. |
| endif::VK_EXT_inline_uniform_block[] |
| If pname:descriptorCount is zero this binding entry is reserved and the |
| resource must: not be accessed from any stage via this binding within |
| any pipeline using the set layout. |
| * pname:stageFlags member is a bitmask of elink:VkShaderStageFlagBits |
| specifying which pipeline shader stages can: access a resource for this |
| binding. |
| ename:VK_SHADER_STAGE_ALL is a shorthand specifying that all defined |
| shader stages, including any additional stages defined by extensions, |
| can: access the resource. |
| + |
| If a shader stage is not included in pname:stageFlags, then a resource must: |
| not be accessed from that stage via this binding within any pipeline using |
| the set layout. |
| Other than input attachments which are limited to the fragment shader, there |
| are no limitations on what combinations of stages can: use a descriptor |
| binding, and in particular a binding can: be used by both graphics stages |
| and the compute stage. |
| |
| * pname:pImmutableSamplers affects initialization of samplers. |
| If pname:descriptorType specifies a ename:VK_DESCRIPTOR_TYPE_SAMPLER or |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER type descriptor, then |
| pname:pImmutableSamplers can: be used to initialize a set of _immutable |
| samplers_. |
| Immutable samplers are permanently bound into the set layout and must: |
| not be changed; updating a ename:VK_DESCRIPTOR_TYPE_SAMPLER descriptor |
| with immutable samplers is not allowed and updates to a |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER descriptor with |
| immutable samplers does not modify the samplers (the image views are |
| updated, but the sampler updates are ignored). |
| If pname:pImmutableSamplers is not `NULL`, then it is a pointer to an |
| array of sampler handles that will be copied into the set layout and |
| used for the corresponding binding. |
| Only the sampler handles are copied; the sampler objects must: not be |
| destroyed before the final use of the set layout and any descriptor |
| pools and sets created using it. |
| If pname:pImmutableSamplers is `NULL`, then the sampler slots are |
| dynamic and sampler handles must: be bound into descriptor sets using |
| this layout. |
| If pname:descriptorType is not one of these descriptor types, then |
| pname:pImmutableSamplers is ignored. |
| |
| The above layout definition allows the descriptor bindings to be specified |
| sparsely such that not all binding numbers between 0 and the maximum binding |
| number need to be specified in the pname:pBindings array. |
| Bindings that are not specified have a pname:descriptorCount and |
| pname:stageFlags of zero, and the value of pname:descriptorType is |
| undefined:. |
| However, all binding numbers between 0 and the maximum binding number in the |
| slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings array may: consume |
| memory in the descriptor set layout even if not all descriptor bindings are |
| used, though it should: not consume additional memory from the descriptor |
| pool. |
| |
| [NOTE] |
| .Note |
| ==== |
| The maximum binding number specified should: be as compact as possible to |
| avoid wasted memory. |
| ==== |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-00282]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER or |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and |
| pname:descriptorCount is not `0` and pname:pImmutableSamplers is not |
| `NULL`, pname:pImmutableSamplers must: be a valid pointer to an array of |
| pname:descriptorCount valid sname:VkSampler handles |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-04604]] |
| If the <<features-inlineUniformBlock,inlineUniformBlock>> feature is not |
| enabled, pname:descriptorType must: not be |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-02209]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:descriptorCount must: be a multiple of `4` |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-02210]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:descriptorCount must: be less than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxInlineUniformBlockSize |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283]] |
| If pname:descriptorCount is not `0`, pname:stageFlags must: be a valid |
| combination of elink:VkShaderStageFlagBits values |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-01510]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and |
| pname:descriptorCount is not `0`, then pname:stageFlags must: be `0` or |
| ename:VK_SHADER_STAGE_FRAGMENT_BIT |
| ifdef::VK_EXT_custom_border_color[] |
| * [[VUID-VkDescriptorSetLayoutBinding-pImmutableSamplers-04009]] |
| The sampler objects indicated by pname:pImmutableSamplers must: not have |
| a pname:borderColor with one of the values |
| ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or |
| ename:VK_BORDER_COLOR_INT_CUSTOM_EXT |
| endif::VK_EXT_custom_border_color[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-04605]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, then |
| sname:pImmutableSamplers must: be `NULL` |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorSetLayoutBinding.txt[] |
| -- |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| [open,refpage='VkDescriptorSetLayoutBindingFlagsCreateInfo',desc='Structure specifying creation flags for descriptor set layout bindings',type='structs',alias='VkDescriptorSetLayoutBindingFlagsCreateInfoEXT'] |
| -- |
| If the pname:pNext chain of a slink:VkDescriptorSetLayoutCreateInfo |
| structure includes a slink:VkDescriptorSetLayoutBindingFlagsCreateInfo |
| structure, then that structure includes an array of flags, one for each |
| descriptor set layout binding. |
| |
| The slink:VkDescriptorSetLayoutBindingFlagsCreateInfo structure is defined |
| as: |
| |
| include::{generated}/api/structs/VkDescriptorSetLayoutBindingFlagsCreateInfo.txt[] |
| |
| ifdef::VK_EXT_descriptor_indexing[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkDescriptorSetLayoutBindingFlagsCreateInfoEXT.txt[] |
| endif::VK_EXT_descriptor_indexing[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:bindingCount is zero or the number of elements in |
| pname:pBindingFlags. |
| * pname:pBindingFlags is a pointer to an array of |
| tlink:VkDescriptorBindingFlags bitfields, one for each descriptor set |
| layout binding. |
| |
| If pname:bindingCount is zero or if this structure is not included in the |
| pname:pNext chain, the tlink:VkDescriptorBindingFlags for each descriptor |
| set layout binding is considered to be zero. |
| Otherwise, the descriptor set layout binding at |
| slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings[i] uses the flags in |
| pname:pBindingFlags[i]. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-bindingCount-03002]] |
| If pname:bindingCount is not zero, pname:bindingCount must: equal |
| slink:VkDescriptorSetLayoutCreateInfo::pname:bindingCount |
| ifdef::VK_KHR_push_descriptor[] |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-flags-03003]] |
| If slink:VkDescriptorSetLayoutCreateInfo::pname:flags includes |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all |
| elements of pname:pBindingFlags must: not include |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT, |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, or |
| ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT |
| endif::VK_KHR_push_descriptor[] |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03004]] |
| If an element of pname:pBindingFlags includes |
| ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, then all |
| other elements of slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings |
| must: have a smaller value of pname:binding |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformBufferUpdateAfterBind-03005]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingUniformBufferUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingSampledImageUpdateAfterBind-03006]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingSampledImageUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageImageUpdateAfterBind-03007]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingStorageImageUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageBufferUpdateAfterBind-03008]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingStorageBufferUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformTexelBufferUpdateAfterBind-03009]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingUniformTexelBufferUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageTexelBufferUpdateAfterBind-03010]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingStorageTexelBufferUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingInlineUniformBlockUpdateAfterBind-02211]] |
| If |
| slink:VkPhysicalDeviceInlineUniformBlockFeaturesEXT::pname:descriptorBindingInlineUniformBlockUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_KHR_acceleration_structure[] |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingAccelerationStructureUpdateAfterBind-03570]] |
| If |
| slink:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:descriptorBindingAccelerationStructureUpdateAfterBind |
| is not enabled, all bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR or |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| endif::VK_KHR_acceleration_structure[] |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-None-03011]] |
| All bindings with descriptor type |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must: not use |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUpdateUnusedWhilePending-03012]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingUpdateUnusedWhilePending |
| is not enabled, all elements of pname:pBindingFlags must: not include |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingPartiallyBound-03013]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingPartiallyBound |
| is not enabled, all elements of pname:pBindingFlags must: not include |
| ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingVariableDescriptorCount-03014]] |
| If |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingVariableDescriptorCount |
| is not enabled, all elements of pname:pBindingFlags must: not include |
| ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT |
| * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03015]] |
| If an element of pname:pBindingFlags includes |
| ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, that |
| element's pname:descriptorType must: not be |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorSetLayoutBindingFlagsCreateInfo.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorBindingFlagBits',desc='Bitmask specifying descriptor set layout binding properties',type='enums',alias='VkDescriptorBindingFlagBitsEXT'] |
| -- |
| Bits which can: be set in each element of |
| slink:VkDescriptorSetLayoutBindingFlagsCreateInfo::pname:pBindingFlags to |
| specify options for the corresponding descriptor set layout binding are: |
| |
| include::{generated}/api/enums/VkDescriptorBindingFlagBits.txt[] |
| |
| ifdef::VK_EXT_descriptor_indexing[] |
| or the equivalent |
| |
| include::{generated}/api/enums/VkDescriptorBindingFlagBitsEXT.txt[] |
| endif::VK_EXT_descriptor_indexing[] |
| |
| * ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT indicates that if |
| descriptors in this binding are updated between when the descriptor set |
| is bound in a command buffer and when that command buffer is submitted |
| to a queue, then the submission will use the most recently set |
| descriptors for this binding and the updates do not invalidate the |
| command buffer. |
| Descriptor bindings created with this flag are also partially exempt |
| from the external synchronization requirement in |
| ifdef::VK_KHR_descriptor_update_template[] |
| flink:vkUpdateDescriptorSetWithTemplateKHR and |
| endif::VK_KHR_descriptor_update_template[] |
| flink:vkUpdateDescriptorSets. |
| Multiple descriptors with this flag set can: be updated concurrently in |
| different threads, though the same descriptor must: not be updated |
| concurrently by two threads. |
| Descriptors with this flag set can: be updated concurrently with the set |
| being bound to a command buffer in another thread, but not concurrently |
| with the set being reset or freed. |
| * ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT indicates that |
| descriptors in this binding that are not _dynamically used_ need not |
| contain valid descriptors at the time the descriptors are consumed. |
| A descriptor is dynamically used if any shader invocation executes an |
| instruction that performs any memory access using the descriptor. |
| * ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT indicates |
| that descriptors in this binding can: be updated after a command buffer |
| has bound this descriptor set, or while a command buffer that uses this |
| descriptor set is pending execution, as long as the descriptors that are |
| updated are not used by those command buffers. |
| If ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT is also set, then |
| descriptors can: be updated as long as they are not dynamically used by |
| any shader invocations. |
| If ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT is not set, then |
| descriptors can: be updated as long as they are not statically used by |
| any shader invocations. |
| * ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT indicates that |
| this descriptor binding has a variable size that will be specified when |
| a descriptor set is allocated using this layout. |
| The value of pname:descriptorCount is treated as an upper bound on the |
| size of the binding. |
| This must: only be used for the last binding in the descriptor set |
| layout (i.e. the binding with the largest value of pname:binding). |
| For the purposes of counting against limits such as |
| pname:maxDescriptorSet* and pname:maxPerStageDescriptor*, the full value |
| of pname:descriptorCount is |
| ifndef::VK_EXT_inline_uniform_block[counted.] |
| ifdef::VK_EXT_inline_uniform_block[] |
| counted, except for descriptor bindings with a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT where |
| pname:descriptorCount specifies the upper bound on the byte size of the |
| binding, thus it counts against the <<limits-maxInlineUniformBlockSize, |
| pname:maxInlineUniformBlockSize>> limit instead. |
| endif::VK_EXT_inline_uniform_block[] |
| |
| [NOTE] |
| .Note |
| ==== |
| Note that while ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT and |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT both involve |
| updates to descriptor sets after they are bound, |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT is a weaker |
| requirement since it is only about descriptors that are not used, whereas |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT requires the |
| implementation to observe updates to descriptors that are used. |
| ==== |
| -- |
| |
| [open,refpage='VkDescriptorBindingFlags',desc='Bitmask of VkDescriptorBindingFlagBits',type='flags',alias='VkDescriptorBindingFlagsEXT'] |
| -- |
| include::{generated}/api/flags/VkDescriptorBindingFlags.txt[] |
| |
| ifdef::VK_EXT_descriptor_indexing[] |
| or the equivalent |
| |
| include::{generated}/api/flags/VkDescriptorBindingFlagsEXT.txt[] |
| endif::VK_EXT_descriptor_indexing[] |
| |
| tname:VkDescriptorBindingFlags is a bitmask type for setting a mask of zero |
| or more elink:VkDescriptorBindingFlagBits. |
| -- |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[] |
| [open,refpage='vkGetDescriptorSetLayoutSupport',desc='Query whether a descriptor set layout can be created',type='protos'] |
| -- |
| To query information about whether a descriptor set layout can: be created, |
| call: |
| |
| ifdef::VK_VERSION_1_1[] |
| include::{generated}/api/protos/vkGetDescriptorSetLayoutSupport.txt[] |
| endif::VK_VERSION_1_1[] |
| |
| ifdef::VK_VERSION_1_1+VK_KHR_maintenance3[or the equivalent command] |
| |
| ifdef::VK_KHR_maintenance3[] |
| include::{generated}/api/protos/vkGetDescriptorSetLayoutSupportKHR.txt[] |
| endif::VK_KHR_maintenance3[] |
| |
| * pname:device is the logical device that would create the descriptor set |
| layout. |
| * pname:pCreateInfo is a pointer to a |
| slink:VkDescriptorSetLayoutCreateInfo structure specifying the state of |
| the descriptor set layout object. |
| * pname:pSupport is a pointer to a slink:VkDescriptorSetLayoutSupport |
| structure, in which information about support for the descriptor set |
| layout object is returned. |
| |
| Some implementations have limitations on what fits in a descriptor set which |
| are not easily expressible in terms of existing limits like |
| pname:maxDescriptorSet*, for example if all descriptor types share a limited |
| space in memory but each descriptor is a different size or alignment. |
| This command returns information about whether a descriptor set satisfies |
| this limit. |
| If the descriptor set layout satisfies the |
| slink:VkPhysicalDeviceMaintenance3Properties::pname:maxPerSetDescriptors |
| limit, this command is guaranteed to return ename:VK_TRUE in |
| slink:VkDescriptorSetLayoutSupport::pname:supported. |
| If the descriptor set layout exceeds the |
| slink:VkPhysicalDeviceMaintenance3Properties::pname:maxPerSetDescriptors |
| limit, whether the descriptor set layout is supported is |
| implementation-dependent and may: depend on whether the descriptor sizes and |
| alignments cause the layout to exceed an internal limit. |
| |
| This command does not consider other limits such as |
| pname:maxPerStageDescriptor*, and so a descriptor set layout that is |
| supported according to this command must: still satisfy the pipeline layout |
| limits such as pname:maxPerStageDescriptor* in order to be used in a |
| pipeline layout. |
| |
| [NOTE] |
| .Note |
| ==== |
| This is a sname:VkDevice query rather than sname:VkPhysicalDevice because |
| the answer may: depend on enabled features. |
| ==== |
| |
| include::{generated}/validity/protos/vkGetDescriptorSetLayoutSupport.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorSetLayoutSupport',desc='Structure returning information about whether a descriptor set layout can be supported',type='structs'] |
| -- |
| Information about support for the descriptor set layout is returned in a |
| sname:VkDescriptorSetLayoutSupport structure: |
| |
| include::{generated}/api/structs/VkDescriptorSetLayoutSupport.txt[] |
| |
| ifdef::VK_KHR_maintenance3[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkDescriptorSetLayoutSupportKHR.txt[] |
| endif::VK_KHR_maintenance3[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:supported specifies whether the descriptor set layout can: be |
| created. |
| |
| pname:supported is set to ename:VK_TRUE if the descriptor set can: be |
| created, or else is set to ename:VK_FALSE. |
| |
| include::{generated}/validity/structs/VkDescriptorSetLayoutSupport.txt[] |
| -- |
| endif::VK_VERSION_1_1,VK_KHR_maintenance3[] |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| [open,refpage='VkDescriptorSetVariableDescriptorCountLayoutSupport',desc='Structure returning information about whether a descriptor set layout can be supported',type='structs',alias='VkDescriptorSetVariableDescriptorCountLayoutSupportEXT'] |
| -- |
| If the pname:pNext chain of a slink:VkDescriptorSetLayoutSupport structure |
| includes a sname:VkDescriptorSetVariableDescriptorCountLayoutSupport |
| structure, then that structure returns additional information about whether |
| the descriptor set layout is supported. |
| |
| include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountLayoutSupport.txt[] |
| |
| ifdef::VK_EXT_descriptor_indexing[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountLayoutSupportEXT.txt[] |
| endif::VK_EXT_descriptor_indexing[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:maxVariableDescriptorCount indicates the maximum number of |
| descriptors supported in the highest numbered binding of the layout, if |
| that binding is variable-sized. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the highest numbered binding of the layout has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:maxVariableDescriptorCount indicates the maximum byte size |
| supported for the binding, if that binding is variable-sized. |
| endif::VK_EXT_inline_uniform_block[] |
| |
| If the slink:VkDescriptorSetLayoutCreateInfo structure specified in |
| flink:vkGetDescriptorSetLayoutSupport::pname:pCreateInfo includes a |
| variable-sized descriptor, then pname:supported is determined assuming the |
| requested size of the variable-sized descriptor, and |
| pname:maxVariableDescriptorCount is set to the maximum size of that |
| descriptor that can: be successfully created (which is greater than or equal |
| to the requested size passed in). |
| If the slink:VkDescriptorSetLayoutCreateInfo structure does not include a |
| variable-sized descriptor, or if the |
| slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingVariableDescriptorCount |
| feature is not enabled, then pname:maxVariableDescriptorCount is set to |
| zero. |
| For the purposes of this command, a variable-sized descriptor binding with a |
| pname:descriptorCount of zero is treated as if the pname:descriptorCount is |
| one, and thus the binding is not ignored and the maximum descriptor count |
| will be returned. |
| If the layout is not supported, then the value written to |
| pname:maxVariableDescriptorCount is undefined:. |
| |
| include::{generated}/validity/structs/VkDescriptorSetVariableDescriptorCountLayoutSupport.txt[] |
| -- |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| |
| The following examples show a shader snippet using two descriptor sets, and |
| application code that creates corresponding descriptor set layouts. |
| |
| .GLSL example |
| [source,glsl] |
| --------------------------------------------------- |
| // |
| // binding to a single sampled image descriptor in set 0 |
| // |
| layout (set=0, binding=0) uniform texture2D mySampledImage; |
| |
| // |
| // binding to an array of sampled image descriptors in set 0 |
| // |
| layout (set=0, binding=1) uniform texture2D myArrayOfSampledImages[12]; |
| |
| // |
| // binding to a single uniform buffer descriptor in set 1 |
| // |
| layout (set=1, binding=0) uniform myUniformBuffer |
| { |
| vec4 myElement[32]; |
| }; |
| --------------------------------------------------- |
| |
| .SPIR-V example |
| [source,spirv] |
| --------------------------------------------------- |
| ... |
| %1 = OpExtInstImport "GLSL.std.450" |
| ... |
| OpName %9 "mySampledImage" |
| OpName %14 "myArrayOfSampledImages" |
| OpName %18 "myUniformBuffer" |
| OpMemberName %18 0 "myElement" |
| OpName %20 "" |
| OpDecorate %9 DescriptorSet 0 |
| OpDecorate %9 Binding 0 |
| OpDecorate %14 DescriptorSet 0 |
| OpDecorate %14 Binding 1 |
| OpDecorate %17 ArrayStride 16 |
| OpMemberDecorate %18 0 Offset 0 |
| OpDecorate %18 Block |
| OpDecorate %20 DescriptorSet 1 |
| OpDecorate %20 Binding 0 |
| %2 = OpTypeVoid |
| %3 = OpTypeFunction %2 |
| %6 = OpTypeFloat 32 |
| %7 = OpTypeImage %6 2D 0 0 0 1 Unknown |
| %8 = OpTypePointer UniformConstant %7 |
| %9 = OpVariable %8 UniformConstant |
| %10 = OpTypeInt 32 0 |
| %11 = OpConstant %10 12 |
| %12 = OpTypeArray %7 %11 |
| %13 = OpTypePointer UniformConstant %12 |
| %14 = OpVariable %13 UniformConstant |
| %15 = OpTypeVector %6 4 |
| %16 = OpConstant %10 32 |
| %17 = OpTypeArray %15 %16 |
| %18 = OpTypeStruct %17 |
| %19 = OpTypePointer Uniform %18 |
| %20 = OpVariable %19 Uniform |
| ... |
| --------------------------------------------------- |
| |
| .API example |
| [source,c++] |
| --------------------------------------------------- |
| VkResult myResult; |
| |
| const VkDescriptorSetLayoutBinding myDescriptorSetLayoutBinding[] = |
| { |
| // binding to a single image descriptor |
| { |
| 0, // binding |
| VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, // descriptorType |
| 1, // descriptorCount |
| VK_SHADER_STAGE_FRAGMENT_BIT, // stageFlags |
| NULL // pImmutableSamplers |
| }, |
| |
| // binding to an array of image descriptors |
| { |
| 1, // binding |
| VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, // descriptorType |
| 12, // descriptorCount |
| VK_SHADER_STAGE_FRAGMENT_BIT, // stageFlags |
| NULL // pImmutableSamplers |
| }, |
| |
| // binding to a single uniform buffer descriptor |
| { |
| 0, // binding |
| VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // descriptorType |
| 1, // descriptorCount |
| VK_SHADER_STAGE_FRAGMENT_BIT, // stageFlags |
| NULL // pImmutableSamplers |
| } |
| }; |
| |
| const VkDescriptorSetLayoutCreateInfo myDescriptorSetLayoutCreateInfo[] = |
| { |
| // Information for first descriptor set with two descriptor bindings |
| { |
| VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, // sType |
| NULL, // pNext |
| 0, // flags |
| 2, // bindingCount |
| &myDescriptorSetLayoutBinding[0] // pBindings |
| }, |
| |
| // Information for second descriptor set with one descriptor binding |
| { |
| VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, // sType |
| NULL, // pNext |
| 0, // flags |
| 1, // bindingCount |
| &myDescriptorSetLayoutBinding[2] // pBindings |
| } |
| }; |
| |
| VkDescriptorSetLayout myDescriptorSetLayout[2]; |
| |
| // |
| // Create first descriptor set layout |
| // |
| myResult = vkCreateDescriptorSetLayout( |
| myDevice, |
| &myDescriptorSetLayoutCreateInfo[0], |
| NULL, |
| &myDescriptorSetLayout[0]); |
| |
| // |
| // Create second descriptor set layout |
| // |
| myResult = vkCreateDescriptorSetLayout( |
| myDevice, |
| &myDescriptorSetLayoutCreateInfo[1], |
| NULL, |
| &myDescriptorSetLayout[1]); |
| --------------------------------------------------- |
| |
| [open,refpage='vkDestroyDescriptorSetLayout',desc='Destroy a descriptor set layout object',type='protos'] |
| -- |
| To destroy a descriptor set layout, call: |
| |
| include::{generated}/api/protos/vkDestroyDescriptorSetLayout.txt[] |
| |
| * pname:device is the logical device that destroys the descriptor set |
| layout. |
| * pname:descriptorSetLayout is the descriptor set layout to destroy. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284]] |
| If sname:VkAllocationCallbacks were provided when |
| pname:descriptorSetLayout was created, a compatible set of callbacks |
| must: be provided here |
| * [[VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285]] |
| If no sname:VkAllocationCallbacks were provided when |
| pname:descriptorSetLayout was created, pname:pAllocator must: be `NULL` |
| **** |
| |
| include::{generated}/validity/protos/vkDestroyDescriptorSetLayout.txt[] |
| -- |
| |
| |
| [[descriptorsets-pipelinelayout]] |
| === Pipeline Layouts |
| |
| [open,refpage='VkPipelineLayout',desc='Opaque handle to a pipeline layout object',type='handles'] |
| -- |
| Access to descriptor sets from a pipeline is accomplished through a |
| _pipeline layout_. |
| Zero or more descriptor set layouts and zero or more push constant ranges |
| are combined to form a pipeline layout object describing the complete set of |
| resources that can: be accessed by a pipeline. |
| The pipeline layout represents a sequence of descriptor sets with each |
| having a specific layout. |
| This sequence of layouts is used to determine the interface between shader |
| stages and shader resources. |
| Each pipeline is created using a pipeline layout. |
| |
| Pipeline layout objects are represented by sname:VkPipelineLayout handles: |
| |
| include::{generated}/api/handles/VkPipelineLayout.txt[] |
| -- |
| |
| [open,refpage='vkCreatePipelineLayout',desc='Creates a new pipeline layout object',type='protos'] |
| -- |
| To create a pipeline layout, call: |
| |
| include::{generated}/api/protos/vkCreatePipelineLayout.txt[] |
| |
| * pname:device is the logical device that creates the pipeline layout. |
| * pname:pCreateInfo is a pointer to a slink:VkPipelineLayoutCreateInfo |
| structure specifying the state of the pipeline layout object. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| * pname:pPipelineLayout is a pointer to a slink:VkPipelineLayout handle in |
| which the resulting pipeline layout object is returned. |
| |
| include::{generated}/validity/protos/vkCreatePipelineLayout.txt[] |
| -- |
| |
| [open,refpage='VkPipelineLayoutCreateInfo',desc='Structure specifying the parameters of a newly created pipeline layout object',type='structs'] |
| -- |
| The slink:VkPipelineLayoutCreateInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkPipelineLayoutCreateInfo.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:flags is reserved for future use. |
| * pname:setLayoutCount is the number of descriptor sets included in the |
| pipeline layout. |
| * pname:pSetLayouts is a pointer to an array of |
| sname:VkDescriptorSetLayout objects. |
| * pname:pushConstantRangeCount is the number of push constant ranges |
| included in the pipeline layout. |
| * pname:pPushConstantRanges is a pointer to an array of |
| sname:VkPushConstantRange structures defining a set of push constant |
| ranges for use in a single pipeline layout. |
| In addition to descriptor set layouts, a pipeline layout also describes |
| how many push constants can: be accessed by each stage of the pipeline. |
| + |
| [NOTE] |
| .Note |
| ==== |
| Push constants represent a high speed path to modify constant data in |
| pipelines that is expected to outperform memory-backed resource updates. |
| ==== |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286]] |
| pname:setLayoutCount must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxBoundDescriptorSets |
| ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSamplers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorUniformBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSampledImages |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageImages |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorInputAttachments |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02212]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorInlineUniformBlocks |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSamplers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader |
| stages and across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffersDynamic |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader |
| stages and across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffersDynamic |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSampledImages |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageImages |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader |
| stages and across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetInputAttachments |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02213]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetInlineUniformBlocks |
| endif::VK_EXT_inline_uniform_block[] |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03016]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSamplers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03017]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER |
| and ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorUniformBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03018]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER |
| and ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03019]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSampledImages |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03020]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, |
| and ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageImages |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03021]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT |
| accessible to any given shader stage across all elements of |
| pname:pSetLayouts must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorInputAttachments |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02214]] |
| The total number of bindings in descriptor set layouts created without |
| the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit |
| set with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorInlineUniformBlocks |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03022]] |
| The total number of descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindSamplers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03023]] |
| The total number of descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03024]] |
| The total number of descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03025]] |
| The total number of descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindSampledImages |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03026]] |
| The total number of descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any given |
| shader stage across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindStorageImages |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03027]] |
| The total number of descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader |
| stage across all elements of pname:pSetLayouts must: be less than or |
| equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindInputAttachments |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02215]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03028]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSamplers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03029]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER |
| accessible across all shader stages and across all elements of |
| pname:pSetLayouts must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03030]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffersDynamic |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03031]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER |
| accessible across all shader stages and across all elements of |
| pname:pSetLayouts must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03032]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffersDynamic |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03033]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSampledImages |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03034]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, |
| and ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageImages |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03035]] |
| The total number of descriptors in descriptor set layouts created |
| without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set |
| with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT |
| accessible across all shader stages and across all elements of |
| pname:pSetLayouts must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetInputAttachments |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02216]] |
| The total number of bindings in descriptor set layouts created without |
| the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit |
| set with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetInlineUniformBlocks |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindSamplers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader |
| stages and across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindUniformBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader |
| stages and across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindStorageBuffers |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindSampledImages |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindStorageImages |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043]] |
| The total number of descriptors of the type |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader |
| stages and across all elements of pname:pSetLayouts must: be less than |
| or equal to |
| sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindInputAttachments |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02217]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks |
| endif::VK_EXT_inline_uniform_block[] |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292]] |
| Any two elements of pname:pPushConstantRanges must: not include the same |
| stage in pname:stageFlags |
| ifdef::VK_KHR_push_descriptor[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293]] |
| pname:pSetLayouts must: not contain more than one descriptor set layout |
| that was created with |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set |
| endif::VK_KHR_push_descriptor[] |
| ifdef::VK_KHR_acceleration_structure[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03571]] |
| The total number of bindings in descriptor set layouts created without |
| the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit |
| set with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxPerStageDescriptorAccelerationStructures |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03572]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible to any |
| given shader stage across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03573]] |
| The total number of bindings in descriptor set layouts created without |
| the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit |
| set with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible across |
| all shader stages and across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxDescriptorSetAccelerationStructures |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03574]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible across |
| all shader stages and across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxDescriptorSetUpdateAfterBindAccelerationStructures |
| endif::VK_KHR_acceleration_structure[] |
| ifdef::VK_NV_ray_tracing[] |
| * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02381]] |
| The total number of bindings with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV accessible across all |
| shader stages and across all elements of pname:pSetLayouts must: be less |
| than or equal to |
| slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxDescriptorSetAccelerationStructures |
| endif::VK_NV_ray_tracing[] |
| ifdef::VK_EXT_fragment_density_map2[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pImmutableSamplers-03566]] |
| The total number of pname:pImmutableSamplers created with pname:flags |
| containing ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT or |
| ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT across |
| all shader stages and across all elements of pname:pSetLayouts must: be |
| less than or equal to |
| <<limits-maxDescriptorSetSubsampledSamplers,sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::pname:maxDescriptorSetSubsampledSamplers>> |
| endif::VK_EXT_fragment_density_map2[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-04606]] |
| Any element of pname:pSetLayouts must: not have been created with the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE bit set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkPipelineLayoutCreateInfo.txt[] |
| -- |
| |
| [open,refpage='VkPipelineLayoutCreateFlags',desc='Reserved for future use',type='flags'] |
| -- |
| include::{generated}/api/flags/VkPipelineLayoutCreateFlags.txt[] |
| |
| tname:VkPipelineLayoutCreateFlags is a bitmask type for setting a mask, but |
| is currently reserved for future use. |
| -- |
| |
| [open,refpage='VkPushConstantRange',desc='Structure specifying a push constant range',type='structs'] |
| -- |
| The sname:VkPushConstantRange structure is defined as: |
| |
| include::{generated}/api/structs/VkPushConstantRange.txt[] |
| |
| * pname:stageFlags is a set of stage flags describing the shader stages |
| that will access a range of push constants. |
| If a particular stage is not included in the range, then accessing |
| members of that range of push constants from the corresponding shader |
| stage will return undefined: values. |
| * pname:offset and pname:size are the start offset and size, respectively, |
| consumed by the range. |
| Both pname:offset and pname:size are in units of bytes and must: be a |
| multiple of 4. |
| The layout of the push constant variables is specified in the shader. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkPushConstantRange-offset-00294]] |
| pname:offset must: be less than |
| sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize |
| * [[VUID-VkPushConstantRange-offset-00295]] |
| pname:offset must: be a multiple of `4` |
| * [[VUID-VkPushConstantRange-size-00296]] |
| pname:size must: be greater than `0` |
| * [[VUID-VkPushConstantRange-size-00297]] |
| pname:size must: be a multiple of `4` |
| * [[VUID-VkPushConstantRange-size-00298]] |
| pname:size must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize minus |
| pname:offset |
| **** |
| |
| include::{generated}/validity/structs/VkPushConstantRange.txt[] |
| -- |
| |
| Once created, pipeline layouts are used as part of pipeline creation (see |
| <<pipelines, Pipelines>>), as part of binding descriptor sets (see |
| <<descriptorsets-binding, Descriptor Set Binding>>), and as part of setting |
| push constants (see <<descriptorsets-push-constants, Push Constant |
| Updates>>). |
| Pipeline creation accepts a pipeline layout as input, and the layout may: be |
| used to map (set, binding, arrayElement) tuples to implementation resources |
| or memory locations within a descriptor set. |
| The assignment of implementation resources depends only on the bindings |
| defined in the descriptor sets that comprise the pipeline layout, and not on |
| any shader source. |
| |
| [[descriptorsets-pipelinelayout-consistency]] |
| All resource variables <<shaders-staticuse,statically used>> in all shaders |
| in a pipeline must: be declared with a (set,binding,arrayElement) that |
| exists in the corresponding descriptor set layout and is of an appropriate |
| descriptor type and includes the set of shader stages it is used by in |
| pname:stageFlags. |
| The pipeline layout can: include entries that are not used by a particular |
| pipeline, or that are dead-code eliminated from any of the shaders. |
| The pipeline layout allows the application to provide a consistent set of |
| bindings across multiple pipeline compiles, which enables those pipelines to |
| be compiled in a way that the implementation may: cheaply switch pipelines |
| without reprogramming the bindings. |
| |
| Similarly, the push constant block declared in each shader (if present) |
| must: only place variables at offsets that are each included in a push |
| constant range with pname:stageFlags including the bit corresponding to the |
| shader stage that uses it. |
| The pipeline layout can: include ranges or portions of ranges that are not |
| used by a particular pipeline, or for which the variables have been |
| dead-code eliminated from any of the shaders. |
| |
| There is a limit on the total number of resources of each type that can: be |
| included in bindings in all descriptor set layouts in a pipeline layout as |
| shown in <<descriptorsets-pipelinelayout-limits,Pipeline Layout Resource |
| Limits>>. |
| The "`Total Resources Available`" column gives the limit on the number of |
| each type of resource that can: be included in bindings in all descriptor |
| sets in the pipeline layout. |
| Some resource types count against multiple limits. |
| Additionally, there are limits on the total number of each type of resource |
| that can: be used in any pipeline stage as described in |
| <<interfaces-resources-limits,Shader Resource Limits>>. |
| |
| [[descriptorsets-pipelinelayout-limits]] |
| .Pipeline Layout Resource Limits |
| [width="80%",cols="<37,<22",options="header"] |
| |==== |
| | Total Resources Available | Resource Types |
| .2+<.^| pname:maxDescriptorSetSamplers |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindSamplers |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | sampler | combined image sampler |
| .3+<.^| pname:maxDescriptorSetSampledImages |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindSampledImages |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | sampled image | combined image sampler | uniform texel buffer |
| .2+<.^| pname:maxDescriptorSetStorageImages |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindStorageImages |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | storage image | storage texel buffer |
| .2+<.^| pname:maxDescriptorSetUniformBuffers |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindUniformBuffers |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | uniform buffer | uniform buffer dynamic |
| | pname:maxDescriptorSetUniformBuffersDynamic |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | uniform buffer dynamic |
| .2+<.^| pname:maxDescriptorSetStorageBuffers |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindStorageBuffers |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | storage buffer | storage buffer dynamic |
| | pname:maxDescriptorSetStorageBuffersDynamic |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | storage buffer dynamic |
| | pname:maxDescriptorSetInputAttachments |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindInputAttachments |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | input attachment |
| ifdef::VK_EXT_inline_uniform_block[] |
| | pname:maxDescriptorSetInlineUniformBlocks |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| or pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| | inline uniform block |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[] |
| | pname:maxDescriptorSetAccelerationStructures |
| ifdef::VK_KHR_acceleration_structure[] |
| or pname:maxDescriptorSetUpdateAfterBindAccelerationStructures |
| endif::VK_KHR_acceleration_structure[] |
| | acceleration structure |
| endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[] |
| |==== |
| |
| |
| [open,refpage='vkDestroyPipelineLayout',desc='Destroy a pipeline layout object',type='protos'] |
| -- |
| To destroy a pipeline layout, call: |
| |
| include::{generated}/api/protos/vkDestroyPipelineLayout.txt[] |
| |
| * pname:device is the logical device that destroys the pipeline layout. |
| * pname:pipelineLayout is the pipeline layout to destroy. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkDestroyPipelineLayout-pipelineLayout-00299]] |
| If sname:VkAllocationCallbacks were provided when pname:pipelineLayout |
| was created, a compatible set of callbacks must: be provided here |
| * [[VUID-vkDestroyPipelineLayout-pipelineLayout-00300]] |
| If no sname:VkAllocationCallbacks were provided when |
| pname:pipelineLayout was created, pname:pAllocator must: be `NULL` |
| * [[VUID-vkDestroyPipelineLayout-pipelineLayout-02004]] |
| pname:pipelineLayout must: not have been passed to any ftext:vkCmd* |
| command for any command buffers that are still in the |
| <<commandbuffers-lifecycle, recording state>> when |
| fname:vkDestroyPipelineLayout is called |
| **** |
| |
| include::{generated}/validity/protos/vkDestroyPipelineLayout.txt[] |
| -- |
| |
| |
| [[descriptorsets-compatibility]] |
| ==== Pipeline Layout Compatibility |
| |
| Two pipeline layouts are defined to be "`compatible for |
| <<descriptorsets-push-constants, push constants>>`" if they were created |
| with identical push constant ranges. |
| Two pipeline layouts are defined to be "`compatible for set N`" if they were |
| created with _identically defined_ descriptor set layouts for sets zero |
| through N, and if they were created with identical push constant ranges. |
| |
| When binding a descriptor set (see <<descriptorsets-binding, Descriptor Set |
| Binding>>) to set number N, if the previously bound descriptor sets for sets |
| zero through N-1 were all bound using compatible pipeline layouts, then |
| performing this binding does not disturb any of the lower numbered sets. |
| If, additionally, the previously bound descriptor set for set N was bound |
| using a pipeline layout compatible for set N, then the bindings in sets |
| numbered greater than N are also not disturbed. |
| |
| Similarly, when binding a pipeline, the pipeline can: correctly access any |
| previously bound descriptor sets which were bound with compatible pipeline |
| layouts, as long as all lower numbered sets were also bound with compatible |
| layouts. |
| |
| Layout compatibility means that descriptor sets can: be bound to a command |
| buffer for use by any pipeline created with a compatible pipeline layout, |
| and without having bound a particular pipeline first. |
| It also means that descriptor sets can: remain valid across a pipeline |
| change, and the same resources will be accessible to the newly bound |
| pipeline. |
| |
| ifdef::implementation-guide[] |
| .Implementor's Note |
| **** |
| A consequence of layout compatibility is that when the implementation |
| compiles a pipeline layout and maps pipeline resources to implementation |
| resources, the mechanism for set N should: only be a function of sets |
| [0..N]. |
| **** |
| endif::implementation-guide[] |
| |
| |
| [NOTE] |
| .Note |
| ==== |
| Place the least frequently changing descriptor sets near the start of the |
| pipeline layout, and place the descriptor sets representing the most |
| frequently changing resources near the end. |
| When pipelines are switched, only the descriptor set bindings that have been |
| invalidated will need to be updated and the remainder of the descriptor set |
| bindings will remain in place. |
| ==== |
| |
| The maximum number of descriptor sets that can: be bound to a pipeline |
| layout is queried from physical device properties (see |
| pname:maxBoundDescriptorSets in <<limits, Limits>>). |
| |
| .API example |
| [source,c++] |
| --------------------------------------------------- |
| const VkDescriptorSetLayout layouts[] = { layout1, layout2 }; |
| |
| const VkPushConstantRange ranges[] = |
| { |
| { |
| VK_SHADER_STAGE_VERTEX_BIT, // stageFlags |
| 0, // offset |
| 4 // size |
| }, |
| |
| { |
| VK_SHADER_STAGE_FRAGMENT_BIT, // stageFlags |
| 4, // offset |
| 4 // size |
| }, |
| }; |
| |
| const VkPipelineLayoutCreateInfo createInfo = |
| { |
| VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType |
| NULL, // pNext |
| 0, // flags |
| 2, // setLayoutCount |
| layouts, // pSetLayouts |
| 2, // pushConstantRangeCount |
| ranges // pPushConstantRanges |
| }; |
| |
| VkPipelineLayout myPipelineLayout; |
| myResult = vkCreatePipelineLayout( |
| myDevice, |
| &createInfo, |
| NULL, |
| &myPipelineLayout); |
| --------------------------------------------------- |
| |
| |
| [[descriptorsets-allocation]] |
| === Allocation of Descriptor Sets |
| |
| [open,refpage='VkDescriptorPool',desc='Opaque handle to a descriptor pool object',type='handles'] |
| -- |
| A _descriptor pool_ maintains a pool of descriptors, from which descriptor |
| sets are allocated. |
| Descriptor pools are externally synchronized, meaning that the application |
| must: not allocate and/or free descriptor sets from the same pool in |
| multiple threads simultaneously. |
| |
| Descriptor pools are represented by sname:VkDescriptorPool handles: |
| |
| include::{generated}/api/handles/VkDescriptorPool.txt[] |
| |
| -- |
| |
| [open,refpage='vkCreateDescriptorPool',desc='Creates a descriptor pool object',type='protos'] |
| -- |
| To create a descriptor pool object, call: |
| |
| include::{generated}/api/protos/vkCreateDescriptorPool.txt[] |
| |
| * pname:device is the logical device that creates the descriptor pool. |
| * pname:pCreateInfo is a pointer to a slink:VkDescriptorPoolCreateInfo |
| structure specifying the state of the descriptor pool object. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| * pname:pDescriptorPool is a pointer to a slink:VkDescriptorPool handle in |
| which the resulting descriptor pool object is returned. |
| |
| The created descriptor pool is returned in pname:pDescriptorPool. |
| |
| include::{generated}/validity/protos/vkCreateDescriptorPool.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorPoolCreateInfo',desc='Structure specifying parameters of a newly created descriptor pool',type='structs'] |
| -- |
| Additional information about the pool is passed in a |
| sname:VkDescriptorPoolCreateInfo structure: |
| |
| include::{generated}/api/structs/VkDescriptorPoolCreateInfo.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:flags is a bitmask of elink:VkDescriptorPoolCreateFlagBits |
| specifying certain supported operations on the pool. |
| * pname:maxSets is the maximum number of descriptor sets that can: be |
| allocated from the pool. |
| * pname:poolSizeCount is the number of elements in pname:pPoolSizes. |
| * pname:pPoolSizes is a pointer to an array of slink:VkDescriptorPoolSize |
| structures, each containing a descriptor type and number of descriptors |
| of that type to be allocated in the pool. |
| |
| If multiple sname:VkDescriptorPoolSize structures containing the same |
| descriptor type appear in the pname:pPoolSizes array then the pool will be |
| created with enough storage for the total number of descriptors of each |
| type. |
| |
| Fragmentation of a descriptor pool is possible and may: lead to descriptor |
| set allocation failures. |
| A failure due to fragmentation is defined as failing a descriptor set |
| allocation despite the sum of all outstanding descriptor set allocations |
| from the pool plus the requested allocation requiring no more than the total |
| number of descriptors requested at pool creation. |
| Implementations provide certain guarantees of when fragmentation must: not |
| cause allocation failure, as described below. |
| |
| If a descriptor pool has not had any descriptor sets freed since it was |
| created or most recently reset then fragmentation must: not cause an |
| allocation failure (note that this is always the case for a pool created |
| without the ename:VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT bit |
| set). |
| Additionally, if all sets allocated from the pool since it was created or |
| most recently reset use the same number of descriptors (of each type) and |
| the requested allocation also uses that same number of descriptors (of each |
| type), then fragmentation must: not cause an allocation failure. |
| |
| If an allocation failure occurs due to fragmentation, an application can: |
| create an additional descriptor pool to perform further descriptor set |
| allocations. |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| If pname:flags has the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT |
| bit set, descriptor pool creation may: fail with the error |
| ename:VK_ERROR_FRAGMENTATION if the total number of descriptors across all |
| pools (including this one) created with this bit set exceeds |
| pname:maxUpdateAfterBindDescriptorsInAllPools, or if fragmentation of the |
| underlying hardware resources occurs. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| If a pname:pPoolSizes[i]::pname:type is |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, a |
| slink:VkMutableDescriptorTypeCreateInfoVALVE struct in the pname:pNext chain |
| can: be used to specify which mutable descriptor types can: be allocated |
| from the pool. |
| If present in the pname:pNext chain, |
| slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pMutableDescriptorTypeLists[i] |
| specifies which kind of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE descriptors |
| can: be allocated from this pool entry. |
| If slink:VkMutableDescriptorTypeCreateInfoVALVE does not exist in the |
| pname:pNext chain, or |
| slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pMutableDescriptorTypeLists[i] |
| is out of range, the descriptor pool allocates enough memory to be able to |
| allocate a ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE descriptor with any |
| supported elink:VkDescriptorType as a mutable descriptor. |
| A mutable descriptor can: be allocated from a pool entry if the type list in |
| slink:VkDescriptorSetLayoutCreateInfo is a subset of the type list declared |
| in the descriptor pool, or if the pool entry is created without a descriptor |
| type list. |
| Multiple pname:pPoolSizes entries with |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE can: be declared. |
| When multiple such pool entries are present in pname:pPoolSizes, they |
| specify sets of supported descriptor types which either fully overlap, |
| partially overlap, or are disjoint. |
| Two sets fully overlap if the sets of supported descriptor types are equal. |
| If the sets are not disjoint they partially overlap. |
| A pool entry without a sname:VkMutableDescriptorTypeListVALVE assigned to it |
| is considered to partially overlap any other pool entry which has a |
| sname:VkMutableDescriptorTypeListVALVE assigned to it. |
| The application must: ensure that partial overlap does not exist in |
| pname:pPoolSizes. |
| |
| [NOTE] |
| .Note |
| ==== |
| The requirement of no partial overlap is intended to resolve ambiguity for |
| validation as there is no confusion which pname:pPoolSizes entries will be |
| allocated from. |
| An implementation is not expected to depend on this requirement. |
| ==== |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorPoolCreateInfo-maxSets-00301]] |
| pname:maxSets must: be greater than `0` |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorPoolCreateInfo-flags-04607]] |
| If pname:flags has the |
| ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE bit set, then the |
| ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT bit must: not be |
| set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorPoolCreateInfo-mutableDescriptorType-04608]] |
| If |
| slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType |
| is not enabled, pname:pPoolSizes must: not contain a |
| pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| * [[VUID-VkDescriptorPoolCreateInfo-flags-04609]] |
| If pname:flags has the |
| ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE bit set, |
| slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType |
| must: be enabled |
| * [[VUID-VkDescriptorPoolCreateInfo-pPoolSizes-04787]] |
| If pname:pPoolSizes contains a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, any other |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE element in pname:pPoolSizes must: |
| not have sets of supported descriptor types which partially overlap |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorPoolCreateInfo.txt[] |
| -- |
| |
| ifdef::VK_EXT_inline_uniform_block[] |
| [open,refpage='VkDescriptorPoolInlineUniformBlockCreateInfoEXT',desc='Structure specifying the maximum number of inline uniform block bindings of a newly created descriptor pool',type='structs'] |
| -- |
| In order to be able to allocate descriptor sets having |
| <<descriptorsets-inlineuniformblock, inline uniform block>> bindings the |
| descriptor pool must: be created with specifying the inline uniform block |
| binding capacity of the descriptor pool, in addition to the total inline |
| uniform data capacity in bytes which is specified through a |
| slink:VkDescriptorPoolSize structure with a pname:descriptorType value of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT. |
| This can: be done by adding a |
| sname:VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure to the |
| pname:pNext chain of slink:VkDescriptorPoolCreateInfo. |
| |
| The sname:VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure is |
| defined as: |
| |
| include::{generated}/api/structs/VkDescriptorPoolInlineUniformBlockCreateInfoEXT.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:maxInlineUniformBlockBindings is the number of inline uniform |
| block bindings to allocate. |
| |
| include::{generated}/validity/structs/VkDescriptorPoolInlineUniformBlockCreateInfoEXT.txt[] |
| -- |
| endif::VK_EXT_inline_uniform_block[] |
| |
| [open,refpage='VkDescriptorPoolCreateFlagBits',desc='Bitmask specifying certain supported operations on a descriptor pool',type='enums'] |
| -- |
| Bits which can: be set in slink:VkDescriptorPoolCreateInfo::pname:flags to |
| enable operations on a descriptor pool are: |
| |
| include::{generated}/api/enums/VkDescriptorPoolCreateFlagBits.txt[] |
| |
| * ename:VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT specifies that |
| descriptor sets can: return their individual allocations to the pool, |
| i.e. all of flink:vkAllocateDescriptorSets, flink:vkFreeDescriptorSets, |
| and flink:vkResetDescriptorPool are allowed. |
| Otherwise, descriptor sets allocated from the pool must: not be |
| individually freed back to the pool, i.e. only |
| flink:vkAllocateDescriptorSets and flink:vkResetDescriptorPool are |
| allowed. |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT specifies that |
| descriptor sets allocated from this pool can: include bindings with the |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set. |
| It is valid to allocate descriptor sets that have bindings that do not |
| set the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit from a |
| pool that has ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT set. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE specifies that this |
| descriptor pool and the descriptor sets allocated from it reside |
| entirely in host memory and cannot be bound. |
| Descriptor sets allocated from this pool are partially exempt from the |
| external synchronization requirement in |
| ifdef::VK_KHR_descriptor_update_template[] |
| flink:vkUpdateDescriptorSetWithTemplateKHR and |
| endif::VK_KHR_descriptor_update_template[] |
| flink:vkUpdateDescriptorSets. |
| Descriptor sets and their descriptors can be updated concurrently in |
| different threads, though the same descriptor must: not be updated |
| concurrently by two threads. |
| endif::VK_VALVE_mutable_descriptor_type[] |
| -- |
| |
| [open,refpage='VkDescriptorPoolCreateFlags',desc='Bitmask of VkDescriptorPoolCreateFlagBits',type='flags'] |
| -- |
| include::{generated}/api/flags/VkDescriptorPoolCreateFlags.txt[] |
| |
| tname:VkDescriptorPoolCreateFlags is a bitmask type for setting a mask of |
| zero or more elink:VkDescriptorPoolCreateFlagBits. |
| -- |
| |
| [open,refpage='VkDescriptorPoolSize',desc='Structure specifying descriptor pool size',type='structs'] |
| -- |
| The sname:VkDescriptorPoolSize structure is defined as: |
| |
| include::{generated}/api/structs/VkDescriptorPoolSize.txt[] |
| |
| * pname:type is the type of descriptor. |
| * pname:descriptorCount is the number of descriptors of that type to |
| allocate. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If pname:type is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:descriptorCount is the number of bytes to allocate for descriptors |
| of this type. |
| endif::VK_EXT_inline_uniform_block[] |
| |
| ifdef::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| [NOTE] |
| .Note |
| ==== |
| When creating a descriptor pool that will contain descriptors for combined |
| image samplers of multi-planar formats, an application needs to account for |
| non-trivial descriptor consumption when choosing the pname:descriptorCount |
| value, as indicated by |
| slink:VkSamplerYcbcrConversionImageFormatProperties::pname:combinedImageSamplerDescriptorCount. |
| ==== |
| endif::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorPoolSize-descriptorCount-00302]] |
| pname:descriptorCount must: be greater than `0` |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorPoolSize-type-02218]] |
| If pname:type is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:descriptorCount must: be a multiple of `4` |
| endif::VK_EXT_inline_uniform_block[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorPoolSize.txt[] |
| -- |
| |
| [open,refpage='vkDestroyDescriptorPool',desc='Destroy a descriptor pool object',type='protos'] |
| -- |
| To destroy a descriptor pool, call: |
| |
| include::{generated}/api/protos/vkDestroyDescriptorPool.txt[] |
| |
| * pname:device is the logical device that destroys the descriptor pool. |
| * pname:descriptorPool is the descriptor pool to destroy. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| |
| When a pool is destroyed, all descriptor sets allocated from the pool are |
| implicitly freed and become invalid. |
| Descriptor sets allocated from a given pool do not need to be freed before |
| destroying that descriptor pool. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkDestroyDescriptorPool-descriptorPool-00303]] |
| All submitted commands that refer to pname:descriptorPool (via any |
| allocated descriptor sets) must: have completed execution |
| * [[VUID-vkDestroyDescriptorPool-descriptorPool-00304]] |
| If sname:VkAllocationCallbacks were provided when pname:descriptorPool |
| was created, a compatible set of callbacks must: be provided here |
| * [[VUID-vkDestroyDescriptorPool-descriptorPool-00305]] |
| If no sname:VkAllocationCallbacks were provided when |
| pname:descriptorPool was created, pname:pAllocator must: be `NULL` |
| **** |
| |
| include::{generated}/validity/protos/vkDestroyDescriptorPool.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorSet',desc='Opaque handle to a descriptor set object',type='handles'] |
| -- |
| Descriptor sets are allocated from descriptor pool objects, and are |
| represented by sname:VkDescriptorSet handles: |
| |
| include::{generated}/api/handles/VkDescriptorSet.txt[] |
| -- |
| |
| [open,refpage='vkAllocateDescriptorSets',desc='Allocate one or more descriptor sets',type='protos'] |
| -- |
| To allocate descriptor sets from a descriptor pool, call: |
| |
| include::{generated}/api/protos/vkAllocateDescriptorSets.txt[] |
| |
| * pname:device is the logical device that owns the descriptor pool. |
| * pname:pAllocateInfo is a pointer to a slink:VkDescriptorSetAllocateInfo |
| structure describing parameters of the allocation. |
| * pname:pDescriptorSets is a pointer to an array of slink:VkDescriptorSet |
| handles in which the resulting descriptor set objects are returned. |
| |
| The allocated descriptor sets are returned in pname:pDescriptorSets. |
| |
| When a descriptor set is allocated, the initial state is largely |
| uninitialized and all descriptors are undefined:. |
| Descriptors also become undefined: if the underlying resource is destroyed. |
| Descriptor sets containing undefined: descriptors can: still be bound and |
| used, subject to the following conditions: |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * For descriptor set bindings created with the |
| ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT bit set, all descriptors |
| in that binding that are dynamically used must: have been populated |
| before the descriptor set is <<descriptorsets-binding,consumed>>. |
| * For descriptor set bindings created without the |
| ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT bit set, all descriptors |
| in that binding that are statically used must: have been populated |
| before the descriptor set is <<descriptorsets-binding,consumed>>. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * Descriptors that are <<shaders-staticuse,statically used>> must: have |
| been populated before the descriptor set is |
| <<descriptorsets-binding,consumed>>. |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_EXT_inline_uniform_block[] |
| * Descriptor bindings with descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT can: be undefined: |
| when the descriptor set is <<descriptorsets-binding,consumed>>; though |
| values in that block will be undefined:. |
| endif::VK_EXT_inline_uniform_block[] |
| * Entries that are not used by a pipeline can: have undefined: |
| descriptors. |
| |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| If a call to fname:vkAllocateDescriptorSets would cause the total number of |
| descriptor sets allocated from the pool to exceed the value of |
| slink:VkDescriptorPoolCreateInfo::pname:maxSets used to create |
| pname:pAllocateInfo->descriptorPool, then the allocation may: fail due to |
| lack of space in the descriptor pool. |
| Similarly, the allocation may: fail due to lack of space if the call to |
| fname:vkAllocateDescriptorSets would cause the number of any given |
| descriptor type to exceed the sum of all the pname:descriptorCount members |
| of each element of slink:VkDescriptorPoolCreateInfo::pname:pPoolSizes with a |
| pname:type equal to that type. |
| |
| ifdef::VK_EXT_inline_uniform_block[] |
| Additionally, the allocation may: also fail if a call to |
| fname:vkAllocateDescriptorSets would cause the total number of inline |
| uniform block bindings allocated from the pool to exceed the value of |
| slink:VkDescriptorPoolInlineUniformBlockCreateInfoEXT::pname:maxInlineUniformBlockBindings |
| used to create the descriptor pool. |
| endif::VK_EXT_inline_uniform_block[] |
| |
| If the allocation fails due to no more space in the descriptor pool, and not |
| because of system or device memory exhaustion, then |
| ename:VK_ERROR_OUT_OF_POOL_MEMORY must: be returned. |
| endif::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| |
| ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| If an allocation fails due to fragmentation, an indeterminate error is |
| returned with an unspecified error code. |
| Any returned error other than |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| ename:VK_ERROR_OUT_OF_POOL_MEMORY or |
| endif::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| ename:VK_ERROR_FRAGMENTED_POOL does not imply its usual meaning: |
| applications should: assume that the allocation failed due to fragmentation, |
| and create a new descriptor pool. |
| endif::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| fname:vkAllocateDescriptorSets can: be used to create multiple descriptor |
| sets. |
| If the creation of any of those descriptor sets fails, then the |
| implementation must: destroy all successfully created descriptor set objects |
| from this command, set all entries of the pname:pDescriptorSets array to |
| dlink:VK_NULL_HANDLE and return the error. |
| endif::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| |
| ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| [NOTE] |
| .Note |
| ==== |
| Applications should: check for a negative return value when allocating new |
| descriptor sets, assume that any error |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| other than ename:VK_ERROR_OUT_OF_POOL_MEMORY |
| endif::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| effectively means ename:VK_ERROR_FRAGMENTED_POOL, and try to create a new |
| descriptor pool. |
| If ename:VK_ERROR_FRAGMENTED_POOL is the actual return value, it adds |
| certainty to that decision. |
| |
| The reason for this is that ename:VK_ERROR_FRAGMENTED_POOL was only added in |
| a later version of the 1.0 specification, and so drivers may: return other |
| errors if they were written against earlier versions. |
| To ensure full compatibility with earlier patch versions, these other errors |
| are allowed. |
| ==== |
| endif::VK_VERSION_1_1,VK_KHR_maintenance2[] |
| |
| include::{generated}/validity/protos/vkAllocateDescriptorSets.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorSetAllocateInfo',desc='Structure specifying the allocation parameters for descriptor sets',type='structs'] |
| -- |
| The sname:VkDescriptorSetAllocateInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkDescriptorSetAllocateInfo.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:descriptorPool is the pool which the sets will be allocated from. |
| * pname:descriptorSetCount determines the number of descriptor sets to be |
| allocated from the pool. |
| * pname:pSetLayouts is a pointer to an array of descriptor set layouts, |
| with each member specifying how the corresponding descriptor set is |
| allocated. |
| |
| .Valid Usage |
| **** |
| ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| * [[VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306]] |
| pname:descriptorSetCount must: not be greater than the number of sets |
| that are currently available for allocation in pname:descriptorPool |
| * [[VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307]] |
| pname:descriptorPool must: have enough free descriptor capacity |
| remaining to allocate the descriptor sets of the specified layouts |
| endif::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| ifdef::VK_KHR_push_descriptor[] |
| * [[VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308]] |
| Each element of pname:pSetLayouts must: not have been created with |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set |
| endif::VK_KHR_push_descriptor[] |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044]] |
| If any element of pname:pSetLayouts was created with the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit |
| set, pname:descriptorPool must: have been created with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorSetAllocateInfo-pSetLayouts-04610]] |
| If any element of pname:pSetLayouts was created with the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE bit set, |
| pname:descriptorPool must: have been created with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE flag set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorSetAllocateInfo.txt[] |
| -- |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| [open,refpage='VkDescriptorSetVariableDescriptorCountAllocateInfo',desc='Structure specifying additional allocation parameters for descriptor sets',type='structs',alias='VkDescriptorSetVariableDescriptorCountAllocateInfoEXT'] |
| -- |
| If the pname:pNext chain of a slink:VkDescriptorSetAllocateInfo structure |
| includes a sname:VkDescriptorSetVariableDescriptorCountAllocateInfo |
| structure, then that structure includes an array of descriptor counts for |
| variable descriptor count bindings, one for each descriptor set being |
| allocated. |
| |
| The sname:VkDescriptorSetVariableDescriptorCountAllocateInfo structure is |
| defined as: |
| |
| include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountAllocateInfo.txt[] |
| |
| ifdef::VK_EXT_descriptor_indexing[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountAllocateInfoEXT.txt[] |
| endif::VK_EXT_descriptor_indexing[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:descriptorSetCount is zero or the number of elements in |
| pname:pDescriptorCounts. |
| * pname:pDescriptorCounts is a pointer to an array of descriptor counts, |
| with each member specifying the number of descriptors in a variable |
| descriptor count binding in the corresponding descriptor set being |
| allocated. |
| |
| If pname:descriptorSetCount is zero or this structure is not included in the |
| pname:pNext chain, then the variable lengths are considered to be zero. |
| Otherwise, pname:pDescriptorCounts[i] is the number of descriptors in the |
| variable count descriptor binding in the corresponding descriptor set |
| layout. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the variable count descriptor binding in the corresponding descriptor set |
| layout has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:pDescriptorCounts[i] specifies the binding's capacity in bytes. |
| endif::VK_EXT_inline_uniform_block[] |
| If slink:VkDescriptorSetAllocateInfo::pname:pSetLayouts[i] does not include |
| a variable count descriptor binding, then pname:pDescriptorCounts[i] is |
| ignored. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-descriptorSetCount-03045]] |
| If pname:descriptorSetCount is not zero, pname:descriptorSetCount must: |
| equal slink:VkDescriptorSetAllocateInfo::pname:descriptorSetCount |
| * [[VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pSetLayouts-03046]] |
| If slink:VkDescriptorSetAllocateInfo::pname:pSetLayouts[i] has a |
| variable descriptor count binding, then pname:pDescriptorCounts[i] must: |
| be less than or equal to the descriptor count specified for that binding |
| when the descriptor set layout was created |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorSetVariableDescriptorCountAllocateInfo.txt[] |
| -- |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| |
| [open,refpage='vkFreeDescriptorSets',desc='Free one or more descriptor sets',type='protos'] |
| -- |
| To free allocated descriptor sets, call: |
| |
| include::{generated}/api/protos/vkFreeDescriptorSets.txt[] |
| |
| * pname:device is the logical device that owns the descriptor pool. |
| * pname:descriptorPool is the descriptor pool from which the descriptor |
| sets were allocated. |
| * pname:descriptorSetCount is the number of elements in the |
| pname:pDescriptorSets array. |
| * pname:pDescriptorSets is a pointer to an array of handles to |
| slink:VkDescriptorSet objects. |
| |
| After calling fname:vkFreeDescriptorSets, all descriptor sets in |
| pname:pDescriptorSets are invalid. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkFreeDescriptorSets-pDescriptorSets-00309]] |
| All submitted commands that refer to any element of |
| pname:pDescriptorSets must: have completed execution |
| * [[VUID-vkFreeDescriptorSets-pDescriptorSets-00310]] |
| pname:pDescriptorSets must: be a valid pointer to an array of |
| pname:descriptorSetCount sname:VkDescriptorSet handles, each element of |
| which must: either be a valid handle or dlink:VK_NULL_HANDLE |
| * [[VUID-vkFreeDescriptorSets-descriptorPool-00312]] |
| pname:descriptorPool must: have been created with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag |
| **** |
| |
| include::{generated}/validity/protos/vkFreeDescriptorSets.txt[] |
| -- |
| |
| [open,refpage='vkResetDescriptorPool',desc='Resets a descriptor pool object',type='protos'] |
| -- |
| To return all descriptor sets allocated from a given pool to the pool, |
| rather than freeing individual descriptor sets, call: |
| |
| include::{generated}/api/protos/vkResetDescriptorPool.txt[] |
| |
| * pname:device is the logical device that owns the descriptor pool. |
| * pname:descriptorPool is the descriptor pool to be reset. |
| * pname:flags is reserved for future use. |
| |
| Resetting a descriptor pool recycles all of the resources from all of the |
| descriptor sets allocated from the descriptor pool back to the descriptor |
| pool, and the descriptor sets are implicitly freed. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkResetDescriptorPool-descriptorPool-00313]] |
| All uses of pname:descriptorPool (via any allocated descriptor sets) |
| must: have completed execution |
| **** |
| |
| include::{generated}/validity/protos/vkResetDescriptorPool.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorPoolResetFlags',desc='Reserved for future use',type='flags'] |
| -- |
| include::{generated}/api/flags/VkDescriptorPoolResetFlags.txt[] |
| |
| tname:VkDescriptorPoolResetFlags is a bitmask type for setting a mask, but |
| is currently reserved for future use. |
| -- |
| |
| |
| [[descriptorsets-updates]] |
| === Descriptor Set Updates |
| |
| [open,refpage='vkUpdateDescriptorSets',desc='Update the contents of a descriptor set object',type='protos'] |
| -- |
| Once allocated, descriptor sets can: be updated with a combination of write |
| and copy operations. |
| To update descriptor sets, call: |
| |
| include::{generated}/api/protos/vkUpdateDescriptorSets.txt[] |
| |
| * pname:device is the logical device that updates the descriptor sets. |
| * pname:descriptorWriteCount is the number of elements in the |
| pname:pDescriptorWrites array. |
| * pname:pDescriptorWrites is a pointer to an array of |
| slink:VkWriteDescriptorSet structures describing the descriptor sets to |
| write to. |
| * pname:descriptorCopyCount is the number of elements in the |
| pname:pDescriptorCopies array. |
| * pname:pDescriptorCopies is a pointer to an array of |
| slink:VkCopyDescriptorSet structures describing the descriptor sets to |
| copy between. |
| |
| The operations described by pname:pDescriptorWrites are performed first, |
| followed by the operations described by pname:pDescriptorCopies. |
| Within each array, the operations are performed in the order they appear in |
| the array. |
| |
| Each element in the pname:pDescriptorWrites array describes an operation |
| updating the descriptor set using descriptors for resources specified in the |
| structure. |
| |
| Each element in the pname:pDescriptorCopies array is a |
| slink:VkCopyDescriptorSet structure describing an operation copying |
| descriptors between sets. |
| |
| If the pname:dstSet member of any element of pname:pDescriptorWrites or |
| pname:pDescriptorCopies is bound, accessed, or modified by any command that |
| was recorded to a command buffer which is currently in the |
| <<commandbuffers-lifecycle, recording or executable state>>, |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| and any of the descriptor bindings that are updated were not created with |
| the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT or |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT bits set, |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| that command buffer becomes <<commandbuffers-lifecycle, invalid>>. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06236]] |
| For each element [eq]#i# where |
| pname:pDescriptorWrites[i].pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, elements of the |
| pname:pTexelBufferView member of pname:pDescriptorWrites[i] must: have |
| been created on pname:device |
| * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06237]] |
| For each element [eq]#i# where |
| pname:pDescriptorWrites[i].pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:buffer member |
| of any element of the pname:pBufferInfo member of |
| pname:pDescriptorWrites[i] must: have been created on pname:device |
| * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06238]] |
| For each element [eq]#i# where |
| pname:pDescriptorWrites[i].pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_SAMPLER or |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and pname:dstSet was |
| not allocated with a layout that included immutable samplers for |
| pname:dstBinding with pname:descriptorType, the pname:sampler member of |
| any element of the pname:pImageInfo member of pname:pDescriptorWrites[i] |
| must: have been created on pname:device |
| * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06239]] |
| For each element [eq]#i# where |
| pname:pDescriptorWrites[i].pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, or |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER the pname:imageView |
| member of any element of pname:pDescriptorWrites[i] must: have been |
| created on pname:device |
| ifdef::VK_KHR_acceleration_structure[] |
| * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06240]] |
| For each element [eq]#i# where |
| pname:pDescriptorWrites[i].pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, elements of the |
| pname:pAccelerationStructures member of a |
| slink:VkWriteDescriptorSetAccelerationStructureKHR structure in the |
| pname:pNext chain of pname:pDescriptorWrites[i] must: have been created |
| on pname:device |
| endif::VK_KHR_acceleration_structure[] |
| ifdef::VK_NV_ray_tracing[] |
| * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06241]] |
| For each element [eq]#i# where |
| pname:pDescriptorWrites[i].pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, elements of the |
| pname:pAccelerationStructures member of a |
| slink:VkWriteDescriptorSetAccelerationStructureNV structure in the |
| pname:pNext chain of pname:pDescriptorWrites[i] must: have been created |
| on pname:device |
| endif::VK_NV_ray_tracing[] |
| ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-vkUpdateDescriptorSets-dstSet-00314]] |
| The pname:dstSet member of each element of pname:pDescriptorWrites or |
| pname:pDescriptorCopies must: not be used by any command that was |
| recorded to a command buffer which is in the <<commandbuffers-lifecycle, |
| pending state>> |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-vkUpdateDescriptorSets-None-03047]] |
| Descriptor bindings updated by this command which were created without |
| the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT or |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT bits set |
| must: not be used by any command that was recorded to a command buffer |
| which is in the <<commandbuffers-lifecycle,pending state>> |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| **** |
| |
| include::{generated}/validity/protos/vkUpdateDescriptorSets.txt[] |
| -- |
| |
| [open,refpage='VkWriteDescriptorSet',desc='Structure specifying the parameters of a descriptor set write operation',type='structs'] |
| -- |
| The sname:VkWriteDescriptorSet structure is defined as: |
| |
| include::{generated}/api/structs/VkWriteDescriptorSet.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:dstSet is the destination descriptor set to update. |
| * pname:dstBinding is the descriptor binding within that set. |
| * pname:dstArrayElement is the starting element in that array. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:dstSet and |
| pname:dstBinding has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:dstArrayElement specifies the starting byte offset within the |
| binding. |
| endif::VK_EXT_inline_uniform_block[] |
| * pname:descriptorCount is the number of descriptors to update. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:dstSet and |
| pname:dstBinding has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, then |
| pname:descriptorCount specifies the number of bytes to update. |
| Otherwise, |
| endif::VK_EXT_inline_uniform_block[] |
| pname:descriptorCount is one of |
| ** the number of elements in pname:pImageInfo |
| ** the number of elements in pname:pBufferInfo |
| ** the number of elements in pname:pTexelBufferView |
| ifdef::VK_EXT_inline_uniform_block[] |
| ** a value matching the pname:dataSize member of a |
| slink:VkWriteDescriptorSetInlineUniformBlockEXT structure in the |
| pname:pNext chain |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[] |
| ** a value matching the pname:accelerationStructureCount of a |
| slink:VkWriteDescriptorSetAccelerationStructureKHR structure in the |
| pname:pNext chain |
| endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[] |
| * pname:descriptorType is a elink:VkDescriptorType specifying the type of |
| each descriptor in pname:pImageInfo, pname:pBufferInfo, or |
| pname:pTexelBufferView, as described below. |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| If sname:VkDescriptorSetLayoutBinding for pname:dstSet at |
| pname:dstBinding is not equal to ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, |
| pname:descriptorType must: |
| endif::VK_VALVE_mutable_descriptor_type[] |
| ifndef::VK_VALVE_mutable_descriptor_type[] |
| It must: |
| endif::VK_VALVE_mutable_descriptor_type[] |
| be the same type as that specified in sname:VkDescriptorSetLayoutBinding |
| for pname:dstSet at pname:dstBinding. |
| The type of the descriptor also controls which array the descriptors are |
| taken from. |
| * pname:pImageInfo is a pointer to an array of slink:VkDescriptorImageInfo |
| structures or is ignored, as described below. |
| * pname:pBufferInfo is a pointer to an array of |
| slink:VkDescriptorBufferInfo structures or is ignored, as described |
| below. |
| * pname:pTexelBufferView is a pointer to an array of slink:VkBufferView |
| handles as described in the <<resources-buffer-views,Buffer Views>> |
| section or is ignored, as described below. |
| |
| Only one of pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView |
| members is used according to the descriptor type specified in the |
| pname:descriptorType member of the containing sname:VkWriteDescriptorSet |
| structure, |
| ifdef::VK_EXT_inline_uniform_block[] |
| or none of them in case pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, in which case the source |
| data for the descriptor writes is taken from the |
| slink:VkWriteDescriptorSetInlineUniformBlockEXT structure included in the |
| pname:pNext chain of sname:VkWriteDescriptorSet, |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_KHR_acceleration_structure[] |
| or if pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, in which case the |
| source data for the descriptor writes is taken from the |
| slink:VkWriteDescriptorSetAccelerationStructureKHR structure in the |
| pname:pNext chain of sname:VkWriteDescriptorSet, |
| endif::VK_KHR_acceleration_structure[] |
| ifdef::VK_NV_ray_tracing[] |
| or if pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, in which case the source |
| data for the descriptor writes is taken from the |
| slink:VkWriteDescriptorSetAccelerationStructureNV structure in the |
| pname:pNext chain of sname:VkWriteDescriptorSet, |
| endif::VK_NV_ray_tracing[] |
| as specified below. |
| |
| ifdef::VK_EXT_robustness2[] |
| If the <<features-nullDescriptor,nullDescriptor>> feature is enabled, the |
| buffer, |
| ifdef::VK_KHR_acceleration_structure[] |
| acceleration structure, |
| endif::VK_KHR_acceleration_structure[] |
| imageView, or bufferView can: be dlink:VK_NULL_HANDLE. |
| Loads from a null descriptor return zero values and stores and atomics to a |
| null descriptor are discarded. |
| ifdef::VK_KHR_acceleration_structure[] |
| A null acceleration structure descriptor results in the miss shader being |
| invoked. |
| endif::VK_KHR_acceleration_structure[] |
| endif::VK_EXT_robustness2[] |
| |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| If the destination descriptor is a mutable descriptor, the active descriptor |
| type for the destination descriptor becomes pname:descriptorType. |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| [[descriptorsets-updates-consecutive, consecutive binding updates]] |
| If the pname:dstBinding has fewer than pname:descriptorCount array elements |
| remaining starting from pname:dstArrayElement, then the remainder will be |
| used to update the subsequent binding - [eq]#pname:dstBinding+1# starting at |
| array element zero. |
| If a binding has a pname:descriptorCount of zero, it is skipped. |
| This behavior applies recursively, with the update affecting consecutive |
| bindings as needed to update all pname:descriptorCount descriptors. |
| Consecutive bindings must: have identical elink:VkDescriptorType, |
| tlink:VkShaderStageFlags, |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| elink:VkDescriptorBindingFlagBits, |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| and immutable samplers references. |
| |
| ifdef::VK_EXT_inline_uniform_block[] |
| [NOTE] |
| .Note |
| ==== |
| The same behavior applies to bindings with a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT where |
| pname:descriptorCount specifies the number of bytes to update while |
| pname:dstArrayElement specifies the starting byte offset, thus in this case |
| if the pname:dstBinding has a smaller byte size than the sum of |
| pname:dstArrayElement and pname:descriptorCount, then the remainder will be |
| used to update the subsequent binding - [eq]#pname:dstBinding+1# starting at |
| offset zero. |
| This falls out as a special case of the above rule. |
| ==== |
| endif::VK_EXT_inline_uniform_block[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkWriteDescriptorSet-dstBinding-00315]] |
| pname:dstBinding must: be less than or equal to the maximum value of |
| pname:binding of all slink:VkDescriptorSetLayoutBinding structures |
| specified when pname:dstSet's descriptor set layout was created |
| * [[VUID-VkWriteDescriptorSet-dstBinding-00316]] |
| pname:dstBinding must: be a binding with a non-zero |
| pname:descriptorCount |
| * [[VUID-VkWriteDescriptorSet-descriptorCount-00317]] |
| All consecutive bindings updated via a single sname:VkWriteDescriptorSet |
| structure, except those with a pname:descriptorCount of zero, must: have |
| identical pname:descriptorType and pname:stageFlags |
| * [[VUID-VkWriteDescriptorSet-descriptorCount-00318]] |
| All consecutive bindings updated via a single sname:VkWriteDescriptorSet |
| structure, except those with a pname:descriptorCount of zero, must: all |
| either use immutable samplers or must: all not use immutable samplers |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00319]] |
| pname:descriptorType must: match the type of pname:dstBinding within |
| pname:dstSet |
| * [[VUID-VkWriteDescriptorSet-dstSet-00320]] |
| pname:dstSet must: be a valid slink:VkDescriptorSet handle |
| * [[VUID-VkWriteDescriptorSet-dstArrayElement-00321]] |
| The sum of pname:dstArrayElement and pname:descriptorCount must: be less |
| than or equal to the number of array elements in the descriptor set |
| binding specified by pname:dstBinding, and all applicable consecutive |
| bindings, as described by <<descriptorsets-updates-consecutive>> |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02219]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:dstArrayElement |
| must: be an integer multiple of `4` |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02220]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount |
| must: be an integer multiple of `4` |
| endif::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00322]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pname:pImageInfo must: be a |
| valid pointer to an array of pname:descriptorCount valid |
| sname:VkDescriptorImageInfo structures |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02994]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER |
| or ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, each element of |
| pname:pTexelBufferView must: be either a valid sname:VkBufferView handle |
| or dlink:VK_NULL_HANDLE |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02995]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER |
| or ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER and the |
| <<features-nullDescriptor,nullDescriptor>> feature is not enabled, each |
| element of pname:pTexelBufferView must: not be dlink:VK_NULL_HANDLE |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00324]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pname:pBufferInfo must: |
| be a valid pointer to an array of pname:descriptorCount valid |
| sname:VkDescriptorBufferInfo structures |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00325]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER or |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and pname:dstSet was |
| not allocated with a layout that included immutable samplers for |
| pname:dstBinding with pname:descriptorType, the pname:sampler member of |
| each element of pname:pImageInfo must: be a valid sname:VkSampler object |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02996]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the pname:imageView member of |
| each element of pname:pImageInfo must: be either a valid |
| sname:VkImageView handle or dlink:VK_NULL_HANDLE |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02997]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and the |
| <<features-nullDescriptor,nullDescriptor>> feature is not enabled, the |
| pname:imageView member of each element of pname:pImageInfo must: not be |
| dlink:VK_NULL_HANDLE |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02221]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, the pname:pNext chain |
| must: include a slink:VkWriteDescriptorSetInlineUniformBlockEXT |
| structure whose pname:dataSize member equals pname:descriptorCount |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_KHR_acceleration_structure[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02382]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, the pname:pNext |
| chain must: include a slink:VkWriteDescriptorSetAccelerationStructureKHR |
| structure whose pname:accelerationStructureCount member equals |
| pname:descriptorCount |
| endif::VK_KHR_acceleration_structure[] |
| ifdef::VK_NV_ray_tracing[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-03817]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, the pname:pNext |
| chain must: include a slink:VkWriteDescriptorSetAccelerationStructureNV |
| structure whose pname:accelerationStructureCount member equals |
| pname:descriptorCount |
| endif::VK_NV_ray_tracing[] |
| ifdef::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-01946]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, then |
| the pname:imageView member of each pname:pImageInfo element must: have |
| been created without a sname:VkSamplerYcbcrConversionInfo structure in |
| its pname:pNext chain |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02738]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and if any element of |
| pname:pImageInfo has a pname:imageView member that was created with a |
| sname:VkSamplerYcbcrConversionInfo structure in its pname:pNext chain, |
| then pname:dstSet must: have been allocated with a layout that included |
| immutable samplers for pname:dstBinding, and the corresponding immutable |
| sampler must: have been created with an _identically defined_ |
| sname:VkSamplerYcbcrConversionInfo object |
| * [[VUID-VkWriteDescriptorSet-descriptorType-01948]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and pname:dstSet was |
| allocated with a layout that included immutable samplers for |
| pname:dstBinding, then the pname:imageView member of each element of |
| pname:pImageInfo which corresponds to an immutable sampler that enables |
| <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> must: have been |
| created with a sname:VkSamplerYcbcrConversionInfo structure in its |
| pname:pNext chain with an _identically defined_ |
| sname:VkSamplerYcbcrConversionInfo to the corresponding immutable |
| sampler |
| endif::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00327]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the pname:offset member |
| of each element of pname:pBufferInfo must: be a multiple of |
| sname:VkPhysicalDeviceLimits::pname:minUniformBufferOffsetAlignment |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00328]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:offset member |
| of each element of pname:pBufferInfo must: be a multiple of |
| sname:VkPhysicalDeviceLimits::pname:minStorageBufferOffsetAlignment |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00329]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, and the pname:buffer |
| member of any element of pname:pBufferInfo is the handle of a non-sparse |
| buffer, then that buffer must: be bound completely and contiguously to a |
| single sname:VkDeviceMemory object |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00330]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the pname:buffer member |
| of each element of pname:pBufferInfo must: have been created with |
| ename:VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00331]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:buffer member |
| of each element of pname:pBufferInfo must: have been created with |
| ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00332]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the pname:range member |
| of each element of pname:pBufferInfo, or the effective range if |
| pname:range is ename:VK_WHOLE_SIZE, must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxUniformBufferRange |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00333]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:range member |
| of each element of pname:pBufferInfo, or the effective range if |
| pname:range is ename:VK_WHOLE_SIZE, must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxStorageBufferRange |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00334]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, the sname:VkBuffer that |
| each element of pname:pTexelBufferView was created from must: have been |
| created with ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00335]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, the sname:VkBuffer that |
| each element of pname:pTexelBufferView was created from must: have been |
| created with ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00336]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the pname:imageView member of |
| each element of pname:pImageInfo must: have been created with the |
| identity swizzle |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00337]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the pname:imageView |
| member of each element of pname:pImageInfo must: have been created with |
| ename:VK_IMAGE_USAGE_SAMPLED_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-04149]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE the |
| pname:imageLayout member of each element of pname:pImageInfo must: be a |
| member of the list given in <<descriptorsets-sampledimage, Sampled |
| Image>> |
| * [[VUID-VkWriteDescriptorSet-descriptorType-04150]] |
| If pname:descriptorType is |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER the pname:imageLayout |
| member of each element of pname:pImageInfo must: be a member of the list |
| given in <<descriptorsets-combinedimagesampler, Combined Image Sampler>> |
| * [[VUID-VkWriteDescriptorSet-descriptorType-04151]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT the |
| pname:imageLayout member of each element of pname:pImageInfo must: be a |
| member of the list given in <<descriptorsets-inputattachment, Input |
| Attachment>> |
| * [[VUID-VkWriteDescriptorSet-descriptorType-04152]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE the |
| pname:imageLayout member of each element of pname:pImageInfo must: be a |
| member of the list given in <<descriptorsets-storageimage, Storage |
| Image>> |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00338]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, |
| the pname:imageView member of each element of pname:pImageInfo must: |
| have been created with ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-00339]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the |
| pname:imageView member of each element of pname:pImageInfo must: have |
| been created with ename:VK_IMAGE_USAGE_STORAGE_BIT set |
| * [[VUID-VkWriteDescriptorSet-descriptorType-02752]] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER, then |
| pname:dstSet must: not have been allocated with a layout that included |
| immutable samplers for pname:dstBinding |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkWriteDescriptorSet-dstSet-04611]] |
| If the sname:VkDescriptorSetLayoutBinding for pname:dstSet at |
| pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the new |
| active descriptor type pname:descriptorType must: exist in the |
| corresponding pname:pMutableDescriptorTypeLists list for |
| pname:dstBinding |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkWriteDescriptorSet.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorType',desc='Specifies the type of a descriptor in a descriptor set',type='enums'] |
| -- |
| The type of descriptors in a descriptor set is specified by |
| slink:VkWriteDescriptorSet::pname:descriptorType, which must: be one of the |
| values: |
| |
| include::{generated}/api/enums/VkDescriptorType.txt[] |
| |
| * ename:VK_DESCRIPTOR_TYPE_SAMPLER specifies a <<descriptorsets-sampler, |
| sampler descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER specifies a |
| <<descriptorsets-combinedimagesampler, combined image sampler |
| descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE specifies a |
| <<descriptorsets-sampledimage, sampled image descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE specifies a |
| <<descriptorsets-storageimage, storage image descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER specifies a |
| <<descriptorsets-uniformtexelbuffer, uniform texel buffer descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER specifies a |
| <<descriptorsets-storagetexelbuffer, storage texel buffer descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER specifies a |
| <<descriptorsets-uniformbuffer, uniform buffer descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER specifies a |
| <<descriptorsets-storagebuffer, storage buffer descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC specifies a |
| <<descriptorsets-uniformbufferdynamic, dynamic uniform buffer |
| descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC specifies a |
| <<descriptorsets-storagebufferdynamic, dynamic storage buffer |
| descriptor>>. |
| * ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT specifies an |
| <<descriptorsets-inputattachment, input attachment descriptor>>. |
| ifdef::VK_EXT_inline_uniform_block[] |
| * ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT specifies an |
| <<descriptorsets-inlineuniformblock, inline uniform block>>. |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE specifies a |
| <<descriptorsets-mutable, descriptor of mutable type>>. |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| When a descriptor set is updated via elements of slink:VkWriteDescriptorSet, |
| members of pname:pImageInfo, pname:pBufferInfo and pname:pTexelBufferView |
| are only accessed by the implementation when they correspond to descriptor |
| type being defined - otherwise they are ignored. |
| The members accessed are as follows for each descriptor type: |
| |
| * For ename:VK_DESCRIPTOR_TYPE_SAMPLER, only the pname:sampler member of |
| each element of slink:VkWriteDescriptorSet::pname:pImageInfo is |
| accessed. |
| * For ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, only the pname:imageView and |
| pname:imageLayout members of each element of |
| slink:VkWriteDescriptorSet::pname:pImageInfo are accessed. |
| * For ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, all members of each |
| element of slink:VkWriteDescriptorSet::pname:pImageInfo are accessed. |
| * For ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, all members of each |
| element of slink:VkWriteDescriptorSet::pname:pBufferInfo are accessed. |
| * For ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, each element of |
| slink:VkWriteDescriptorSet::pname:pTexelBufferView is accessed. |
| |
| ifdef::VK_EXT_inline_uniform_block[] |
| When updating descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, none of the |
| pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are |
| accessed, instead the source data of the descriptor update operation is |
| taken from the slink:VkWriteDescriptorSetInlineUniformBlockEXT structure in |
| the pname:pNext chain of sname:VkWriteDescriptorSet. |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_KHR_acceleration_structure[] |
| When updating descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, none of the |
| pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are |
| accessed, instead the source data of the descriptor update operation is |
| taken from the slink:VkWriteDescriptorSetAccelerationStructureKHR structure |
| in the pname:pNext chain of sname:VkWriteDescriptorSet. |
| endif::VK_KHR_acceleration_structure[] |
| ifdef::VK_NV_ray_tracing[] |
| When updating descriptors with a pname:descriptorType of |
| ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, none of the |
| pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are |
| accessed, instead the source data of the descriptor update operation is |
| taken from the slink:VkWriteDescriptorSetAccelerationStructureNV structure |
| in the pname:pNext chain of sname:VkWriteDescriptorSet. |
| endif::VK_NV_ray_tracing[] |
| -- |
| |
| [open,refpage='VkDescriptorBufferInfo',desc='Structure specifying descriptor buffer information',type='structs'] |
| -- |
| The sname:VkDescriptorBufferInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkDescriptorBufferInfo.txt[] |
| |
| * pname:buffer is |
| ifdef::VK_EXT_robustness2[] |
| dlink:VK_NULL_HANDLE or |
| endif::VK_EXT_robustness2[] |
| the buffer resource. |
| * pname:offset is the offset in bytes from the start of pname:buffer. |
| Access to buffer memory via this descriptor uses addressing that is |
| relative to this starting offset. |
| * pname:range is the size in bytes that is used for this descriptor |
| update, or ename:VK_WHOLE_SIZE to use the range from pname:offset to the |
| end of the buffer. |
| |
| [NOTE] |
| .Note |
| ==== |
| When setting pname:range to ename:VK_WHOLE_SIZE, the effective range must: |
| not be larger than the maximum range for the descriptor type |
| (<<limits-maxUniformBufferRange, pname:maxUniformBufferRange>> or |
| <<limits-maxStorageBufferRange, pname:maxStorageBufferRange>>). |
| This means that ename:VK_WHOLE_SIZE is not typically useful in the common |
| case where uniform buffer descriptors are suballocated from a buffer that is |
| much larger than pname:maxUniformBufferRange. |
| ==== |
| |
| For ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC and |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC descriptor types, |
| pname:offset is the base offset from which the dynamic offset is applied and |
| pname:range is the static size used for all dynamic offsets. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorBufferInfo-offset-00340]] |
| pname:offset must: be less than the size of pname:buffer |
| * [[VUID-VkDescriptorBufferInfo-range-00341]] |
| If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be |
| greater than `0` |
| * [[VUID-VkDescriptorBufferInfo-range-00342]] |
| If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be |
| less than or equal to the size of pname:buffer minus pname:offset |
| * [[VUID-VkDescriptorBufferInfo-buffer-02998]] |
| If the <<features-nullDescriptor,nullDescriptor>> feature is not |
| enabled, pname:buffer must: not be dlink:VK_NULL_HANDLE |
| ifdef::VK_EXT_robustness2[] |
| * [[VUID-VkDescriptorBufferInfo-buffer-02999]] |
| If pname:buffer is dlink:VK_NULL_HANDLE, pname:offset must: be zero and |
| pname:range must: be ename:VK_WHOLE_SIZE |
| endif::VK_EXT_robustness2[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorBufferInfo.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorImageInfo',desc='Structure specifying descriptor image information',type='structs'] |
| -- |
| The sname:VkDescriptorImageInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkDescriptorImageInfo.txt[] |
| |
| * pname:sampler is a sampler handle, and is used in descriptor updates for |
| types ename:VK_DESCRIPTOR_TYPE_SAMPLER and |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER if the binding being |
| updated does not use immutable samplers. |
| * pname:imageView is |
| ifdef::VK_EXT_robustness2[] |
| dlink:VK_NULL_HANDLE or |
| endif::VK_EXT_robustness2[] |
| an image view handle, and is used in descriptor updates for types |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT. |
| * pname:imageLayout is the layout that the image subresources accessible |
| from pname:imageView will be in at the time this descriptor is accessed. |
| pname:imageLayout is used in descriptor updates for types |
| ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, |
| ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and |
| ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT. |
| |
| Members of sname:VkDescriptorImageInfo that are not used in an update (as |
| described above) are ignored. |
| |
| .Valid Usage |
| **** |
| ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| * [[VUID-VkDescriptorImageInfo-imageView-00343]] |
| pname:imageView must: not be 2D or 2D array image view created from a 3D |
| image |
| endif::VK_VERSION_1_1,VK_KHR_maintenance1[] |
| * [[VUID-VkDescriptorImageInfo-imageView-01976]] |
| If pname:imageView is created from a depth/stencil image, the |
| pname:aspectMask used to create the pname:imageView must: include either |
| ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT but |
| not both |
| * [[VUID-VkDescriptorImageInfo-imageLayout-00344]] |
| pname:imageLayout must: match the actual elink:VkImageLayout of each |
| subresource accessible from pname:imageView at the time this descriptor |
| is accessed as defined by the <<resources-image-layouts-matching-rule, |
| image layout matching rules>> |
| ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| * [[VUID-VkDescriptorImageInfo-sampler-01564]] |
| If pname:sampler is used and the elink:VkFormat of the image is a |
| <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>, the |
| image must: have been created with |
| ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, and the pname:aspectMask of |
| the pname:imageView must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT, |
| ename:VK_IMAGE_ASPECT_PLANE_1_BIT or (for three-plane formats only) |
| ename:VK_IMAGE_ASPECT_PLANE_2_BIT |
| endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] |
| ifdef::VK_KHR_portability_subset[] |
| * [[VUID-VkDescriptorImageInfo-mutableComparisonSamplers-04450]] |
| If the `apiext:VK_KHR_portability_subset` extension is enabled, and |
| slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:mutableComparisonSamplers |
| is ename:VK_FALSE, then pname:sampler must: have been created with |
| slink:VkSamplerCreateInfo::pname:compareEnable set to ename:VK_FALSE |
| endif::VK_KHR_portability_subset[] |
| **** |
| |
| |
| include::{generated}/validity/structs/VkDescriptorImageInfo.txt[] |
| -- |
| |
| ifdef::VK_EXT_inline_uniform_block[] |
| [open,refpage='VkWriteDescriptorSetInlineUniformBlockEXT',desc='Structure specifying inline uniform block data',type='structs'] |
| -- |
| If the pname:descriptorType member of slink:VkWriteDescriptorSet is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then the data to write to |
| the descriptor set is specified through a |
| sname:VkWriteDescriptorSetInlineUniformBlockEXT structure included in the |
| pname:pNext chain of sname:VkWriteDescriptorSet. |
| |
| The sname:VkWriteDescriptorSetInlineUniformBlockEXT structure is defined as: |
| |
| include::{generated}/api/structs/VkWriteDescriptorSetInlineUniformBlockEXT.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:dataSize is the number of bytes of inline uniform block data |
| pointed to by pname:pData. |
| * pname:pData is a pointer to pname:dataSize number of bytes of data to |
| write to the inline uniform block. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-02222]] |
| pname:dataSize must: be an integer multiple of `4` |
| **** |
| |
| include::{generated}/validity/structs/VkWriteDescriptorSetInlineUniformBlockEXT.txt[] |
| -- |
| endif::VK_EXT_inline_uniform_block[] |
| |
| ifdef::VK_KHR_acceleration_structure[] |
| [open,refpage='VkWriteDescriptorSetAccelerationStructureKHR',desc='Structure specifying acceleration structure descriptor information',type='structs'] |
| -- |
| :refpage: VkWriteDescriptorSetAccelerationStructureKHR |
| |
| The sname:VkWriteDescriptorSetAccelerationStructureKHR structure is defined |
| as: |
| |
| include::{generated}/api/structs/VkWriteDescriptorSetAccelerationStructureKHR.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:accelerationStructureCount is the number of elements in |
| pname:pAccelerationStructures. |
| * pname:pAccelerationStructures is a pointer to an array of |
| slink:VkAccelerationStructureKHR structures specifying the acceleration |
| structures to update. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-02236]] |
| pname:accelerationStructureCount must: be equal to pname:descriptorCount |
| in the extended structure |
| * [[VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-03579]] |
| Each acceleration structure in pname:pAccelerationStructures must: have |
| been created with a pname:type of |
| ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR or |
| ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR |
| * [[VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-03580]] |
| If the <<features-nullDescriptor,nullDescriptor>> feature is not |
| enabled, each element of pname:pAccelerationStructures must: not be |
| dlink:VK_NULL_HANDLE |
| **** |
| |
| include::{generated}/validity/structs/VkWriteDescriptorSetAccelerationStructureKHR.txt[] |
| -- |
| endif::VK_KHR_acceleration_structure[] |
| |
| ifdef::VK_NV_ray_tracing[] |
| [open,refpage='VkWriteDescriptorSetAccelerationStructureNV',desc='Structure specifying acceleration structure descriptor information',type='structs'] |
| -- |
| :refpage: VkWriteDescriptorSetAccelerationStructureNV |
| |
| The sname:VkWriteDescriptorSetAccelerationStructureNV structure is defined |
| as: |
| |
| include::{generated}/api/structs/VkWriteDescriptorSetAccelerationStructureNV.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:accelerationStructureCount is the number of elements in |
| pname:pAccelerationStructures. |
| * pname:pAccelerationStructures is a pointer to an array of |
| slink:VkAccelerationStructureNV structures specifying the acceleration |
| structures to update. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkWriteDescriptorSetAccelerationStructureNV-accelerationStructureCount-03747]] |
| pname:accelerationStructureCount must: be equal to pname:descriptorCount |
| in the extended structure |
| * [[VUID-VkWriteDescriptorSetAccelerationStructureNV-pAccelerationStructures-03748]] |
| Each acceleration structure in pname:pAccelerationStructures must: have |
| been created with ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR |
| * [[VUID-VkWriteDescriptorSetAccelerationStructureNV-pAccelerationStructures-03749]] |
| If the <<features-nullDescriptor,nullDescriptor>> feature is not |
| enabled, each member of pname:pAccelerationStructures must: not be |
| dlink:VK_NULL_HANDLE |
| **** |
| |
| include::{generated}/validity/structs/VkWriteDescriptorSetAccelerationStructureNV.txt[] |
| -- |
| endif::VK_NV_ray_tracing[] |
| |
| [open,refpage='VkCopyDescriptorSet',desc='Structure specifying a copy descriptor set operation',type='structs'] |
| -- |
| The sname:VkCopyDescriptorSet structure is defined as: |
| |
| include::{generated}/api/structs/VkCopyDescriptorSet.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:srcSet, pname:srcBinding, and pname:srcArrayElement are the source |
| set, binding, and array element, respectively. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:srcSet and |
| pname:srcBinding has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:srcArrayElement specifies the starting byte offset within the |
| binding to copy from. |
| endif::VK_EXT_inline_uniform_block[] |
| * pname:dstSet, pname:dstBinding, and pname:dstArrayElement are the |
| destination set, binding, and array element, respectively. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:dstSet and |
| pname:dstBinding has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:dstArrayElement specifies the starting byte offset within the |
| binding to copy to. |
| endif::VK_EXT_inline_uniform_block[] |
| * pname:descriptorCount is the number of descriptors to copy from the |
| source to destination. |
| If pname:descriptorCount is greater than the number of remaining array |
| elements in the source or destination binding, those affect consecutive |
| bindings in a manner similar to slink:VkWriteDescriptorSet above. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:srcSet and |
| pname:srcBinding has a descriptor type of |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then |
| pname:descriptorCount specifies the number of bytes to copy and the |
| remaining array elements in the source or destination binding refer to |
| the remaining number of bytes in those. |
| endif::VK_EXT_inline_uniform_block[] |
| |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| If the sname:VkDescriptorSetLayoutBinding for pname:dstBinding is |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE and pname:srcBinding is not |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the new active descriptor type |
| becomes the descriptor type of pname:srcBinding. |
| If both sname:VkDescriptorSetLayoutBinding for pname:srcBinding and |
| pname:dstBinding are ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the active |
| descriptor type in each source descriptor is copied into the corresponding |
| destination descriptor. |
| The active descriptor type can: be different for each source descriptor. |
| |
| [NOTE] |
| .Note |
| ==== |
| The intention is that copies to and from mutable descriptors is a simple |
| memcpy. |
| Copies between non-mutable and mutable descriptors are expected to require |
| one memcpy per descriptor to handle the difference in size, but this use |
| case with more than one pname:descriptorCount is considered rare. |
| ==== |
| endif::VK_VALVE_mutable_descriptor_type[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkCopyDescriptorSet-srcBinding-00345]] |
| pname:srcBinding must: be a valid binding within pname:srcSet |
| * [[VUID-VkCopyDescriptorSet-srcArrayElement-00346]] |
| The sum of pname:srcArrayElement and pname:descriptorCount must: be less |
| than or equal to the number of array elements in the descriptor set |
| binding specified by pname:srcBinding, and all applicable consecutive |
| bindings, as described by <<descriptorsets-updates-consecutive>> |
| * [[VUID-VkCopyDescriptorSet-dstBinding-00347]] |
| pname:dstBinding must: be a valid binding within pname:dstSet |
| * [[VUID-VkCopyDescriptorSet-dstArrayElement-00348]] |
| The sum of pname:dstArrayElement and pname:descriptorCount must: be less |
| than or equal to the number of array elements in the descriptor set |
| binding specified by pname:dstBinding, and all applicable consecutive |
| bindings, as described by <<descriptorsets-updates-consecutive>> |
| * [[VUID-VkCopyDescriptorSet-dstBinding-02632]] |
| The type of pname:dstBinding within pname:dstSet must: be equal to the |
| type of pname:srcBinding within pname:srcSet |
| * [[VUID-VkCopyDescriptorSet-srcSet-00349]] |
| If pname:srcSet is equal to pname:dstSet, then the source and |
| destination ranges of descriptors must: not overlap, where the ranges |
| may: include array elements from consecutive bindings as described by |
| <<descriptorsets-updates-consecutive>> |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkCopyDescriptorSet-srcBinding-02223]] |
| If the descriptor type of the descriptor set binding specified by |
| pname:srcBinding is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, |
| pname:srcArrayElement must: be an integer multiple of `4` |
| * [[VUID-VkCopyDescriptorSet-dstBinding-02224]] |
| If the descriptor type of the descriptor set binding specified by |
| pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, |
| pname:dstArrayElement must: be an integer multiple of `4` |
| * [[VUID-VkCopyDescriptorSet-srcBinding-02225]] |
| If the descriptor type of the descriptor set binding specified by either |
| pname:srcBinding or pname:dstBinding is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount |
| must: be an integer multiple of `4` |
| endif::VK_EXT_inline_uniform_block[] |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkCopyDescriptorSet-srcSet-01918]] |
| If pname:srcSet's layout was created with the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag |
| set, then pname:dstSet's layout must: also have been created with the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag |
| set |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkCopyDescriptorSet-srcSet-04885]] |
| If pname:srcSet's layout was created with neither |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT nor |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE flags |
| set, then pname:dstSet's layout must: have been created without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag |
| set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| ifndef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkCopyDescriptorSet-srcSet-04886]] |
| If pname:srcSet's layout was created without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag |
| set, then pname:dstSet's layout must: also have been created without the |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag |
| set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkCopyDescriptorSet-srcSet-01920]] |
| If the descriptor pool from which pname:srcSet was allocated was created |
| with the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set, |
| then the descriptor pool from which pname:dstSet was allocated must: |
| also have been created with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkCopyDescriptorSet-srcSet-04887]] |
| If the descriptor pool from which pname:srcSet was allocated was created |
| with neither ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT nor |
| ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE flags set, then the |
| descriptor pool from which pname:dstSet was allocated must: have been |
| created without the |
| ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| ifndef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkCopyDescriptorSet-srcSet-04888]] |
| If the descriptor pool from which pname:srcSet was allocated was created |
| without the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag |
| set, then the descriptor pool from which pname:dstSet was allocated |
| must: also have been created without the |
| ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * [[VUID-VkCopyDescriptorSet-dstBinding-02753]] |
| If the descriptor type of the descriptor set binding specified by |
| pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_SAMPLER, then pname:dstSet |
| must: not have been allocated with a layout that included immutable |
| samplers for pname:dstBinding |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkCopyDescriptorSet-dstSet-04612]] |
| If sname:VkDescriptorSetLayoutBinding for pname:dstSet at |
| pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the new |
| active descriptor type must: exist in the corresponding |
| pname:pMutableDescriptorTypeLists list for pname:dstBinding if the new |
| active descriptor type is not ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| * [[VUID-VkCopyDescriptorSet-srcSet-04613]] |
| If sname:VkDescriptorSetLayoutBinding for pname:srcSet at |
| pname:srcBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE and the |
| sname:VkDescriptorSetLayoutBinding for pname:dstSet at pname:dstBinding |
| is not ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the active descriptor |
| type for the source descriptor must: match the descriptor type of |
| pname:dstBinding |
| * [[VUID-VkCopyDescriptorSet-dstSet-04614]] |
| If sname:VkDescriptorSetLayoutBinding for pname:dstSet at |
| pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, and the new |
| active descriptor type is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the |
| pname:pMutableDescriptorTypeLists for pname:srcBinding and |
| pname:dstBinding must: match exactly |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/structs/VkCopyDescriptorSet.txt[] |
| -- |
| |
| |
| ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[] |
| [[descriptorsets-updates-with-template]] |
| === Descriptor Update Templates |
| |
| [open,refpage='VkDescriptorUpdateTemplate',desc='Opaque handle to a descriptor update template',type='handles'] |
| -- |
| A descriptor update template specifies a mapping from descriptor update |
| information in host memory to descriptors in a descriptor set. |
| It is designed to avoid passing redundant information to the driver when |
| frequently updating the same set of descriptors in descriptor sets. |
| |
| Descriptor update template objects are represented by |
| sname:VkDescriptorUpdateTemplate handles: |
| |
| include::{generated}/api/handles/VkDescriptorUpdateTemplate.txt[] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| or the equivalent |
| |
| include::{generated}/api/handles/VkDescriptorUpdateTemplateKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| -- |
| |
| |
| === Descriptor Set Updates with Templates |
| |
| [open,refpage='vkCreateDescriptorUpdateTemplate',desc='Create a new descriptor update template',type='protos'] |
| -- |
| Updating a large sname:VkDescriptorSet array can: be an expensive operation |
| since an application must: specify one slink:VkWriteDescriptorSet structure |
| for each descriptor or descriptor array to update, each of which |
| re-specifies the same state when updating the same descriptor in multiple |
| descriptor sets. |
| For cases when an application wishes to update the same set of descriptors |
| in multiple descriptor sets allocated using the same |
| sname:VkDescriptorSetLayout, flink:vkUpdateDescriptorSetWithTemplate can: be |
| used as a replacement for flink:vkUpdateDescriptorSets. |
| |
| sname:VkDescriptorUpdateTemplate allows implementations to convert a set of |
| descriptor update operations on a single descriptor set to an internal |
| format that, in conjunction with flink:vkUpdateDescriptorSetWithTemplate |
| ifdef::VK_KHR_push_descriptor[] |
| or flink:vkCmdPushDescriptorSetWithTemplateKHR |
| endif::VK_KHR_push_descriptor[] |
| , can: be more efficient compared to calling flink:vkUpdateDescriptorSets |
| ifdef::VK_KHR_push_descriptor[] |
| or flink:vkCmdPushDescriptorSetKHR |
| endif::VK_KHR_push_descriptor[] |
| . |
| The descriptors themselves are not specified in the |
| sname:VkDescriptorUpdateTemplate, rather, offsets into an application |
| provided pointer to host memory are specified, which are combined with a |
| pointer passed to flink:vkUpdateDescriptorSetWithTemplate |
| ifdef::VK_KHR_push_descriptor[] |
| or flink:vkCmdPushDescriptorSetWithTemplateKHR |
| endif::VK_KHR_push_descriptor[] |
| . |
| This allows large batches of updates to be executed without having to |
| convert application data structures into a strictly-defined Vulkan data |
| structure. |
| |
| To create a descriptor update template, call: |
| |
| ifdef::VK_VERSION_1_1[] |
| include::{generated}/api/protos/vkCreateDescriptorUpdateTemplate.txt[] |
| endif::VK_VERSION_1_1[] |
| |
| ifdef::VK_VERSION_1_1+VK_KHR_descriptor_update_template[or the equivalent command] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| include::{generated}/api/protos/vkCreateDescriptorUpdateTemplateKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| * pname:device is the logical device that creates the descriptor update |
| template. |
| * pname:pCreateInfo is a pointer to a |
| slink:VkDescriptorUpdateTemplateCreateInfo structure specifying the set |
| of descriptors to update with a single call to |
| ifdef::VK_KHR_push_descriptor[] |
| flink:vkCmdPushDescriptorSetWithTemplateKHR or |
| endif::VK_KHR_push_descriptor[] |
| flink:vkUpdateDescriptorSetWithTemplate. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| * pname:pDescriptorUpdateTemplate is a pointer to a |
| sname:VkDescriptorUpdateTemplate handle in which the resulting |
| descriptor update template object is returned. |
| |
| include::{generated}/validity/protos/vkCreateDescriptorUpdateTemplate.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorUpdateTemplateCreateInfo',desc='Structure specifying parameters of a newly created descriptor update template',type='structs'] |
| -- |
| The slink:VkDescriptorUpdateTemplateCreateInfo structure is defined as: |
| include::{generated}/api/structs/VkDescriptorUpdateTemplateCreateInfo.txt[] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkDescriptorUpdateTemplateCreateInfoKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:flags is reserved for future use. |
| * pname:descriptorUpdateEntryCount is the number of elements in the |
| pname:pDescriptorUpdateEntries array. |
| * pname:pDescriptorUpdateEntries is a pointer to an array of |
| slink:VkDescriptorUpdateTemplateEntry structures describing the |
| descriptors to be updated by the descriptor update template. |
| * pname:templateType Specifies the type of the descriptor update template. |
| If set to ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET it |
| can: only be used to update descriptor sets with a fixed |
| pname:descriptorSetLayout. |
| ifdef::VK_KHR_push_descriptor[] |
| If set to ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR |
| it can: only be used to push descriptor sets using the provided |
| pname:pipelineBindPoint, pname:pipelineLayout, and pname:set number. |
| endif::VK_KHR_push_descriptor[] |
| * pname:descriptorSetLayout is the descriptor set layout used to build the |
| descriptor update template. |
| All descriptor sets which are going to be updated through the newly |
| created descriptor update template must: be created with a layout that |
| matches (is the same as, or defined identically to) this layout. |
| This parameter is ignored if pname:templateType is not |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET. |
| ifdef::VK_KHR_push_descriptor[] |
| * pname:pipelineBindPoint is a elink:VkPipelineBindPoint indicating the |
| type of the pipeline that will use the descriptors. |
| This parameter is ignored if pname:templateType is not |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR |
| * pname:pipelineLayout is a slink:VkPipelineLayout object used to program |
| the bindings. |
| This parameter is ignored if pname:templateType is not |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR |
| * pname:set is the set number of the descriptor set in the pipeline layout |
| that will be updated. |
| This parameter is ignored if pname:templateType is not |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR |
| endif::VK_KHR_push_descriptor[] |
| ifndef::VK_KHR_push_descriptor[] |
| * pname:pipelineBindPoint is reserved for future use and is ignored |
| * pname:pipelineLayout is reserved for future use and is ignored |
| * pname:set is reserved for future use and is ignored |
| endif::VK_KHR_push_descriptor[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350]] |
| If pname:templateType is |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, |
| pname:descriptorSetLayout must: be a valid sname:VkDescriptorSetLayout |
| handle |
| ifdef::VK_KHR_push_descriptor[] |
| * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351]] |
| If pname:templateType is |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, |
| pname:pipelineBindPoint must: be a valid elink:VkPipelineBindPoint value |
| * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352]] |
| If pname:templateType is |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, |
| pname:pipelineLayout must: be a valid sname:VkPipelineLayout handle |
| * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353]] |
| If pname:templateType is |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pname:set |
| must: be the unique set number in the pipeline layout that uses a |
| descriptor set layout that was created with |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR |
| endif::VK_KHR_push_descriptor[] |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-04615]] |
| If pname:templateType is |
| ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, |
| pname:descriptorSetLayout must: not contain a binding with type |
| ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| |
| include::{generated}/validity/structs/VkDescriptorUpdateTemplateCreateInfo.txt[] |
| -- |
| |
| [open,refpage='VkDescriptorUpdateTemplateCreateFlags',desc='Reserved for future use',type='flags'] |
| -- |
| include::{generated}/api/flags/VkDescriptorUpdateTemplateCreateFlags.txt[] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| or the equivalent |
| |
| include::{generated}/api/flags/VkDescriptorUpdateTemplateCreateFlagsKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| tname:VkDescriptorUpdateTemplateCreateFlags is a bitmask type for setting a |
| mask, but is currently reserved for future use. |
| -- |
| |
| [open,refpage='VkDescriptorUpdateTemplateType',desc='Indicates the valid usage of the descriptor update template',type='enums'] |
| -- |
| The descriptor update template type is determined by the |
| slink:VkDescriptorUpdateTemplateCreateInfo::pname:templateType property, |
| which takes the following values: |
| |
| include::{generated}/api/enums/VkDescriptorUpdateTemplateType.txt[] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| or the equivalent |
| |
| include::{generated}/api/enums/VkDescriptorUpdateTemplateTypeKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| * ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET specifies that |
| the descriptor update template will be used for descriptor set updates |
| only. |
| ifdef::VK_KHR_push_descriptor[] |
| * ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR specifies |
| that the descriptor update template will be used for push descriptor |
| updates only. |
| endif::VK_KHR_push_descriptor[] |
| -- |
| |
| |
| [open,refpage='VkDescriptorUpdateTemplateEntry',desc='Describes a single descriptor update of the descriptor update template',type='structs'] |
| -- |
| The sname:VkDescriptorUpdateTemplateEntry structure is defined as: |
| include::{generated}/api/structs/VkDescriptorUpdateTemplateEntry.txt[] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkDescriptorUpdateTemplateEntryKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| * pname:dstBinding is the descriptor binding to update when using this |
| descriptor update template. |
| * pname:dstArrayElement is the starting element in the array belonging to |
| pname:dstBinding. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:dstBinding has a |
| descriptor type of ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT |
| then pname:dstArrayElement specifies the starting byte offset to update. |
| endif::VK_EXT_inline_uniform_block[] |
| * pname:descriptorCount is the number of descriptors to update. |
| If pname:descriptorCount is greater than the number of remaining array |
| elements in the destination binding, those affect consecutive bindings |
| in a manner similar to slink:VkWriteDescriptorSet above. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If the descriptor binding identified by pname:dstBinding has a |
| descriptor type of ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT |
| then pname:descriptorCount specifies the number of bytes to update and |
| the remaining array elements in the destination binding refer to the |
| remaining number of bytes in it. |
| endif::VK_EXT_inline_uniform_block[] |
| * pname:descriptorType is a elink:VkDescriptorType specifying the type of |
| the descriptor. |
| * pname:offset is the offset in bytes of the first binding in the raw data |
| structure. |
| * pname:stride is the stride in bytes between two consecutive array |
| elements of the descriptor update informations in the raw data |
| structure. |
| The actual pointer ptr for each array element j of update entry i is |
| computed using the following formula: |
| + |
| [source,c++] |
| ~~~~ |
| const char *ptr = (const char *)pData + pDescriptorUpdateEntries[i].offset + j * pDescriptorUpdateEntries[i].stride |
| ~~~~ |
| + |
| The stride is useful in case the bindings are stored in structs along with |
| other data. |
| ifdef::VK_EXT_inline_uniform_block[] |
| If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT |
| then the value of pname:stride is ignored and the stride is assumed to be |
| `1`, i.e. the descriptor update information for them is always specified as |
| a contiguous range. |
| endif::VK_EXT_inline_uniform_block[] |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354]] |
| pname:dstBinding must: be a valid binding in the descriptor set layout |
| implicitly specified when using a descriptor update template to update |
| descriptors |
| * [[VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355]] |
| pname:dstArrayElement and pname:descriptorCount must: be less than or |
| equal to the number of array elements in the descriptor set binding |
| implicitly specified when using a descriptor update template to update |
| descriptors, and all applicable consecutive bindings, as described by |
| <<descriptorsets-updates-consecutive>> |
| ifdef::VK_EXT_inline_uniform_block[] |
| * [[VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226]] |
| If pname:descriptor type is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:dstArrayElement |
| must: be an integer multiple of `4` |
| * [[VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227]] |
| If pname:descriptor type is |
| ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount |
| must: be an integer multiple of `4` |
| endif::VK_EXT_inline_uniform_block[] |
| **** |
| |
| include::{generated}/validity/structs/VkDescriptorUpdateTemplateEntry.txt[] |
| -- |
| |
| [open,refpage='vkDestroyDescriptorUpdateTemplate',desc='Destroy a descriptor update template object',type='protos'] |
| -- |
| To destroy a descriptor update template, call: |
| |
| ifdef::VK_VERSION_1_1[] |
| include::{generated}/api/protos/vkDestroyDescriptorUpdateTemplate.txt[] |
| endif::VK_VERSION_1_1[] |
| |
| ifdef::VK_VERSION_1_1+VK_KHR_descriptor_update_template[or the equivalent command] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| include::{generated}/api/protos/vkDestroyDescriptorUpdateTemplateKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| * pname:device is the logical device that has been used to create the |
| descriptor update template |
| * pname:descriptorUpdateTemplate is the descriptor update template to |
| destroy. |
| * pname:pAllocator controls host memory allocation as described in the |
| <<memory-allocation, Memory Allocation>> chapter. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356]] |
| If sname:VkAllocationCallbacks were provided when |
| pname:descriptorUpdateTemplate was created, a compatible set of |
| callbacks must: be provided here |
| * [[VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357]] |
| If no sname:VkAllocationCallbacks were provided when |
| pname:descriptorUpdateTemplate was created, pname:pAllocator must: be |
| `NULL` |
| **** |
| |
| include::{generated}/validity/protos/vkDestroyDescriptorUpdateTemplate.txt[] |
| -- |
| |
| [open,refpage='vkUpdateDescriptorSetWithTemplate',desc='Update the contents of a descriptor set object using an update template',type='protos'] |
| -- |
| Once a sname:VkDescriptorUpdateTemplate has been created, descriptor sets |
| can: be updated by calling: |
| |
| ifdef::VK_VERSION_1_1[] |
| include::{generated}/api/protos/vkUpdateDescriptorSetWithTemplate.txt[] |
| endif::VK_VERSION_1_1[] |
| |
| ifdef::VK_VERSION_1_1+VK_KHR_descriptor_update_template[or the equivalent command] |
| |
| ifdef::VK_KHR_descriptor_update_template[] |
| include::{generated}/api/protos/vkUpdateDescriptorSetWithTemplateKHR.txt[] |
| endif::VK_KHR_descriptor_update_template[] |
| |
| * pname:device is the logical device that updates the descriptor set. |
| * pname:descriptorSet is the descriptor set to update |
| * pname:descriptorUpdateTemplate is a slink:VkDescriptorUpdateTemplate |
| object specifying the update mapping between pname:pData and the |
| descriptor set to update. |
| * pname:pData is a pointer to memory containing one or more |
| slink:VkDescriptorImageInfo, slink:VkDescriptorBufferInfo, or |
| slink:VkBufferView structures |
| ifdef::VK_KHR_acceleration_structure[or slink:VkAccelerationStructureKHR] |
| ifdef::VK_NV_ray_tracing[or slink:VkAccelerationStructureNV] |
| ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[handles] |
| used to write the descriptors. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkUpdateDescriptorSetWithTemplate-pData-01685]] |
| pname:pData must: be a valid pointer to a memory containing one or more |
| valid instances of slink:VkDescriptorImageInfo, |
| slink:VkDescriptorBufferInfo, or slink:VkBufferView in a layout defined |
| by pname:descriptorUpdateTemplate when it was created with |
| flink:vkCreateDescriptorUpdateTemplate |
| **** |
| |
| include::{generated}/validity/protos/vkUpdateDescriptorSetWithTemplate.txt[] |
| |
| .API example |
| [source,c++] |
| ~~~~ |
| struct AppBufferView { |
| VkBufferView bufferView; |
| uint32_t applicationRelatedInformation; |
| }; |
| |
| struct AppDataStructure |
| { |
| VkDescriptorImageInfo imageInfo; // a single image info |
| VkDescriptorBufferInfo bufferInfoArray[3]; // 3 buffer infos in an array |
| AppBufferView bufferView[2]; // An application defined structure containing a bufferView |
| // ... some more application related data |
| }; |
| |
| const VkDescriptorUpdateTemplateEntry descriptorUpdateTemplateEntries[] = |
| { |
| // binding to a single image descriptor |
| { |
| 0, // binding |
| 0, // dstArrayElement |
| 1, // descriptorCount |
| VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, // descriptorType |
| offsetof(AppDataStructure, imageInfo), // offset |
| 0 // stride is not required if descriptorCount is 1 |
| }, |
| |
| // binding to an array of buffer descriptors |
| { |
| 1, // binding |
| 0, // dstArrayElement |
| 3, // descriptorCount |
| VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // descriptorType |
| offsetof(AppDataStructure, bufferInfoArray), // offset |
| sizeof(VkDescriptorBufferInfo) // stride, descriptor buffer infos are compact |
| }, |
| |
| // binding to an array of buffer views |
| { |
| 2, // binding |
| 0, // dstArrayElement |
| 2, // descriptorCount |
| VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, // descriptorType |
| offsetof(AppDataStructure, bufferView) + |
| offsetof(AppBufferView, bufferView), // offset |
| sizeof(AppBufferView) // stride, bufferViews do not have to be compact |
| }, |
| }; |
| |
| // create a descriptor update template for descriptor set updates |
| const VkDescriptorUpdateTemplateCreateInfo createInfo = |
| { |
| VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, // sType |
| NULL, // pNext |
| 0, // flags |
| 3, // descriptorUpdateEntryCount |
| descriptorUpdateTemplateEntries, // pDescriptorUpdateEntries |
| VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, // templateType |
| myLayout, // descriptorSetLayout |
| 0, // pipelineBindPoint, ignored by given templateType |
| 0, // pipelineLayout, ignored by given templateType |
| 0, // set, ignored by given templateType |
| }; |
| |
| VkDescriptorUpdateTemplate myDescriptorUpdateTemplate; |
| myResult = vkCreateDescriptorUpdateTemplate( |
| myDevice, |
| &createInfo, |
| NULL, |
| &myDescriptorUpdateTemplate); |
| |
| AppDataStructure appData; |
| |
| // fill appData here or cache it in your engine |
| vkUpdateDescriptorSetWithTemplate(myDevice, myDescriptorSet, myDescriptorUpdateTemplate, &appData); |
| ~~~~ |
| -- |
| endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[] |
| |
| |
| [[descriptorsets-binding]] |
| === Descriptor Set Binding |
| |
| [open,refpage='vkCmdBindDescriptorSets',desc='Binds descriptor sets to a command buffer',type='protos'] |
| -- |
| To bind one or more descriptor sets to a command buffer, call: |
| |
| include::{generated}/api/protos/vkCmdBindDescriptorSets.txt[] |
| |
| * pname:commandBuffer is the command buffer that the descriptor sets will |
| be bound to. |
| * pname:pipelineBindPoint is a elink:VkPipelineBindPoint indicating the |
| type of the pipeline that will use the descriptors. |
| There is a separate set of bind points for each pipeline type, so |
| binding one does not disturb the others. |
| * pname:layout is a slink:VkPipelineLayout object used to program the |
| bindings. |
| * pname:firstSet is the set number of the first descriptor set to be |
| bound. |
| * pname:descriptorSetCount is the number of elements in the |
| pname:pDescriptorSets array. |
| * pname:pDescriptorSets is a pointer to an array of handles to |
| slink:VkDescriptorSet objects describing the descriptor sets to bind to. |
| * pname:dynamicOffsetCount is the number of dynamic offsets in the |
| pname:pDynamicOffsets array. |
| * pname:pDynamicOffsets is a pointer to an array of code:uint32_t values |
| specifying dynamic offsets. |
| |
| fname:vkCmdBindDescriptorSets causes the sets numbered [pname:firstSet.. |
| pname:firstSet+pname:descriptorSetCount-1] to use the bindings stored in |
| pname:pDescriptorSets[0..descriptorSetCount-1] for subsequent |
| <<pipeline-bindpoint-commands, bound pipeline commands>> set by |
| pname:pipelineBindPoint. |
| Any bindings that were previously applied via these sets are no longer |
| valid. |
| |
| Once bound, a descriptor set affects rendering of subsequent commands that |
| interact with the given pipeline type in the command buffer until either a |
| different set is bound to the same set number, or the set is disturbed as |
| described in <<descriptorsets-compatibility, Pipeline Layout |
| Compatibility>>. |
| |
| A compatible descriptor set must: be bound for all set numbers that any |
| shaders in a pipeline access, at the time that a drawing or dispatching |
| command is recorded to execute using that pipeline. |
| However, if none of the shaders in a pipeline statically use any bindings |
| with a particular set number, then no descriptor set need be bound for that |
| set number, even if the pipeline layout includes a non-trivial descriptor |
| set layout for that set number. |
| |
| [[descriptorsets-binding-dynamicoffsets]] |
| If any of the sets being bound include dynamic uniform or storage buffers, |
| then pname:pDynamicOffsets includes one element for each array element in |
| each dynamic descriptor type binding in each set. |
| Values are taken from pname:pDynamicOffsets in an order such that all |
| entries for set N come before set N+1; within a set, entries are ordered by |
| the binding numbers in the descriptor set layouts; and within a binding |
| array, elements are in order. |
| pname:dynamicOffsetCount must: equal the total number of dynamic descriptors |
| in the sets being bound. |
| |
| The effective offset used for dynamic uniform and storage buffer bindings is |
| the sum of the relative offset taken from pname:pDynamicOffsets, and the |
| base address of the buffer plus base offset in the descriptor set. |
| The range of the dynamic uniform and storage buffer bindings is the buffer |
| range as specified in the descriptor set. |
| |
| Each of the pname:pDescriptorSets must: be compatible with the pipeline |
| layout specified by pname:layout. |
| The layout used to program the bindings must: also be compatible with the |
| pipeline used in subsequent <<pipeline-bindpoint-commands, bound pipeline |
| commands>> with that pipeline type, as defined in the |
| <<descriptorsets-compatibility, Pipeline Layout Compatibility>> section. |
| |
| The descriptor set contents bound by a call to fname:vkCmdBindDescriptorSets |
| may: be consumed at the following times: |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * For descriptor bindings created with the |
| ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set, the contents |
| may: be consumed when the command buffer is submitted to a queue, or |
| during shader execution of the resulting draws and dispatches, or any |
| time in between. |
| Otherwise, |
| endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] |
| * during host execution of the command, or during shader execution of the |
| resulting draws and dispatches, or any time in between. |
| |
| Thus, the contents of a descriptor set binding must: not be altered |
| (overwritten by an update command, or freed) between the first point in time |
| that it may: be consumed, and when the command completes executing on the |
| queue. |
| |
| The contents of pname:pDynamicOffsets are consumed immediately during |
| execution of fname:vkCmdBindDescriptorSets. |
| Once all pending uses have completed, it is legal to update and reuse a |
| descriptor set. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358]] |
| Each element of pname:pDescriptorSets must: have been allocated with a |
| sname:VkDescriptorSetLayout that matches (is the same as, or identically |
| defined as) the sname:VkDescriptorSetLayout at set _n_ in pname:layout, |
| where _n_ is the sum of pname:firstSet and the index into |
| pname:pDescriptorSets |
| * [[VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359]] |
| pname:dynamicOffsetCount must: be equal to the total number of dynamic |
| descriptors in pname:pDescriptorSets |
| * [[VUID-vkCmdBindDescriptorSets-firstSet-00360]] |
| The sum of pname:firstSet and pname:descriptorSetCount must: be less |
| than or equal to slink:VkPipelineLayoutCreateInfo::pname:setLayoutCount |
| provided when pname:layout was created |
| * [[VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361]] |
| pname:pipelineBindPoint must: be supported by the pname:commandBuffer's |
| parent sname:VkCommandPool's queue family |
| * [[VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01971]] |
| Each element of pname:pDynamicOffsets which corresponds to a descriptor |
| binding with type ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC must: |
| be a multiple of |
| sname:VkPhysicalDeviceLimits::pname:minUniformBufferOffsetAlignment |
| * [[VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01972]] |
| Each element of pname:pDynamicOffsets which corresponds to a descriptor |
| binding with type ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must: |
| be a multiple of |
| sname:VkPhysicalDeviceLimits::pname:minStorageBufferOffsetAlignment |
| * [[VUID-vkCmdBindDescriptorSets-pDescriptorSets-01979]] |
| For each dynamic uniform or storage buffer binding in |
| pname:pDescriptorSets, the sum of the effective offset, as defined |
| above, and the range of the binding must: be less than or equal to the |
| size of the buffer |
| ifdef::VK_VALVE_mutable_descriptor_type[] |
| * [[VUID-vkCmdBindDescriptorSets-pDescriptorSets-04616]] |
| Each element of pname:pDescriptorSets must: not have been allocated from |
| a sname:VkDescriptorPool with the |
| ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE flag set |
| endif::VK_VALVE_mutable_descriptor_type[] |
| **** |
| |
| include::{generated}/validity/protos/vkCmdBindDescriptorSets.txt[] |
| -- |
| |
| |
| ifdef::VK_KHR_push_descriptor[] |
| [[descriptorsets-push-descriptors]] |
| === Push Descriptor Updates |
| |
| [open,refpage='vkCmdPushDescriptorSetKHR',desc='Pushes descriptor updates into a command buffer',type='protos'] |
| -- |
| In addition to allocating descriptor sets and binding them to a command |
| buffer, an application can: record descriptor updates into the command |
| buffer. |
| |
| To push descriptor updates into a command buffer, call: |
| |
| include::{generated}/api/protos/vkCmdPushDescriptorSetKHR.txt[] |
| |
| * pname:commandBuffer is the command buffer that the descriptors will be |
| recorded in. |
| * pname:pipelineBindPoint is a elink:VkPipelineBindPoint indicating the |
| type of the pipeline that will use the descriptors. |
| There is a separate set of push descriptor bindings for each pipeline |
| type, so binding one does not disturb the others. |
| * pname:layout is a slink:VkPipelineLayout object used to program the |
| bindings. |
| * pname:set is the set number of the descriptor set in the pipeline layout |
| that will be updated. |
| * pname:descriptorWriteCount is the number of elements in the |
| pname:pDescriptorWrites array. |
| * pname:pDescriptorWrites is a pointer to an array of |
| slink:VkWriteDescriptorSet structures describing the descriptors to be |
| updated. |
| |
| _Push descriptors_ are a small bank of descriptors whose storage is |
| internally managed by the command buffer rather than being written into a |
| descriptor set and later bound to a command buffer. |
| Push descriptors allow for incremental updates of descriptors without |
| managing the lifetime of descriptor sets. |
| |
| When a command buffer begins recording, all push descriptors are undefined:. |
| Push descriptors can: be updated incrementally and cause shaders to use the |
| updated descriptors for subsequent <<pipeline-bindpoint-commands, bound |
| pipeline commands>> with the pipeline type set by pname:pipelineBindPoint |
| until the descriptor is overwritten, or else until the set is disturbed as |
| described in <<descriptorsets-compatibility, Pipeline Layout |
| Compatibility>>. |
| When the set is disturbed or push descriptors with a different descriptor |
| set layout are set, all push descriptors are undefined:. |
| |
| Push descriptors that are <<shaders-staticuse,statically used>> by a |
| pipeline must: not be undefined: at the time that a drawing or dispatching |
| command is recorded to execute using that pipeline. |
| This includes immutable sampler descriptors, which must: be pushed before |
| they are accessed by a pipeline (the immutable samplers are pushed, rather |
| than the samplers in pname:pDescriptorWrites). |
| Push descriptors that are not statically used can: remain undefined:. |
| |
| Push descriptors do not use dynamic offsets. |
| Instead, the corresponding non-dynamic descriptor types can: be used and the |
| pname:offset member of slink:VkDescriptorBufferInfo can: be changed each |
| time the descriptor is written. |
| |
| Each element of pname:pDescriptorWrites is interpreted as in |
| slink:VkWriteDescriptorSet, except the pname:dstSet member is ignored. |
| |
| To push an immutable sampler, use a slink:VkWriteDescriptorSet with |
| pname:dstBinding and pname:dstArrayElement selecting the immutable sampler's |
| binding. |
| If the descriptor type is ename:VK_DESCRIPTOR_TYPE_SAMPLER, the |
| pname:pImageInfo parameter is ignored and the immutable sampler is taken |
| from the push descriptor set layout in the pipeline layout. |
| If the descriptor type is ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
| the pname:sampler member of the pname:pImageInfo parameter is ignored and |
| the immutable sampler is taken from the push descriptor set layout in the |
| pipeline layout. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363]] |
| pname:pipelineBindPoint must: be supported by the pname:commandBuffer's |
| parent sname:VkCommandPool's queue family |
| * [[VUID-vkCmdPushDescriptorSetKHR-set-00364]] |
| pname:set must: be less than |
| slink:VkPipelineLayoutCreateInfo::pname:setLayoutCount provided when |
| pname:layout was created |
| * [[VUID-vkCmdPushDescriptorSetKHR-set-00365]] |
| pname:set must: be the unique set number in the pipeline layout that |
| uses a descriptor set layout that was created with |
| ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR |
| **** |
| |
| include::{generated}/validity/protos/vkCmdPushDescriptorSetKHR.txt[] |
| |
| -- |
| |
| |
| ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[] |
| === Push Descriptor Updates with Descriptor Update Templates |
| |
| [open,refpage='vkCmdPushDescriptorSetWithTemplateKHR',desc='Pushes descriptor updates into a command buffer using a descriptor update template',type='protos'] |
| -- |
| It is also possible to use a descriptor update template to specify the push |
| descriptors to update. |
| To do so, call: |
| |
| include::{generated}/api/protos/vkCmdPushDescriptorSetWithTemplateKHR.txt[] |
| |
| * pname:commandBuffer is the command buffer that the descriptors will be |
| recorded in. |
| * pname:descriptorUpdateTemplate is a descriptor update template defining |
| how to interpret the descriptor information in pname:pData. |
| * pname:layout is a slink:VkPipelineLayout object used to program the |
| bindings. |
| It must: be compatible with the layout used to create the |
| pname:descriptorUpdateTemplate handle. |
| * pname:set is the set number of the descriptor set in the pipeline layout |
| that will be updated. |
| This must: be the same number used to create the |
| pname:descriptorUpdateTemplate handle. |
| * pname:pData is a pointer to memory containing descriptors for the |
| templated update. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366]] |
| The pname:pipelineBindPoint specified during the creation of the |
| descriptor update template must: be supported by the |
| pname:commandBuffer's parent sname:VkCommandPool's queue family |
| * [[VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686]] |
| pname:pData must: be a valid pointer to a memory containing one or more |
| valid instances of slink:VkDescriptorImageInfo, |
| slink:VkDescriptorBufferInfo, or slink:VkBufferView in a layout defined |
| by pname:descriptorUpdateTemplate when it was created with |
| flink:vkCreateDescriptorUpdateTemplate |
| **** |
| |
| include::{generated}/validity/protos/vkCmdPushDescriptorSetWithTemplateKHR.txt[] |
| |
| .API example |
| [source,c++] |
| ~~~~ |
| |
| struct AppDataStructure |
| { |
| VkDescriptorImageInfo imageInfo; // a single image info |
| // ... some more application related data |
| }; |
| |
| const VkDescriptorUpdateTemplateEntry descriptorUpdateTemplateEntries[] = |
| { |
| // binding to a single image descriptor |
| { |
| 0, // binding |
| 0, // dstArrayElement |
| 1, // descriptorCount |
| VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, // descriptorType |
| offsetof(AppDataStructure, imageInfo), // offset |
| 0 // stride is not required if descriptorCount is 1 |
| } |
| }; |
| |
| // create a descriptor update template for push descriptor set updates |
| const VkDescriptorUpdateTemplateCreateInfo createInfo = |
| { |
| VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, // sType |
| NULL, // pNext |
| 0, // flags |
| 1, // descriptorUpdateEntryCount |
| descriptorUpdateTemplateEntries, // pDescriptorUpdateEntries |
| VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, // templateType |
| 0, // descriptorSetLayout, ignored by given templateType |
| VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint |
| myPipelineLayout, // pipelineLayout |
| 0, // set |
| }; |
| |
| VkDescriptorUpdateTemplate myDescriptorUpdateTemplate; |
| myResult = vkCreateDescriptorUpdateTemplate( |
| myDevice, |
| &createInfo, |
| NULL, |
| &myDescriptorUpdateTemplate); |
| |
| AppDataStructure appData; |
| // fill appData here or cache it in your engine |
| vkCmdPushDescriptorSetWithTemplateKHR(myCmdBuffer, myDescriptorUpdateTemplate, myPipelineLayout, 0,&appData); |
| ~~~~ |
| -- |
| endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[] |
| endif::VK_KHR_push_descriptor[] |
| |
| |
| [[descriptorsets-push-constants]] |
| === Push Constant Updates |
| |
| As described above in section <<descriptorsets-pipelinelayout, Pipeline |
| Layouts>>, the pipeline layout defines shader push constants which are |
| updated via Vulkan commands rather than via writes to memory or copy |
| commands. |
| |
| [NOTE] |
| .Note |
| ==== |
| Push constants represent a high speed path to modify constant data in |
| pipelines that is expected to outperform memory-backed resource updates. |
| ==== |
| |
| [open,refpage='vkCmdPushConstants',desc='Update the values of push constants',type='protos'] |
| -- |
| To update push constants, call: |
| |
| include::{generated}/api/protos/vkCmdPushConstants.txt[] |
| |
| * pname:commandBuffer is the command buffer in which the push constant |
| update will be recorded. |
| * pname:layout is the pipeline layout used to program the push constant |
| updates. |
| * pname:stageFlags is a bitmask of elink:VkShaderStageFlagBits specifying |
| the shader stages that will use the push constants in the updated range. |
| * pname:offset is the start offset of the push constant range to update, |
| in units of bytes. |
| * pname:size is the size of the push constant range to update, in units of |
| bytes. |
| * pname:pValues is a pointer to an array of pname:size bytes containing |
| the new push constant values. |
| |
| When a command buffer begins recording, all push constant values are |
| undefined:. |
| ifdef::VK_KHR_maintenance4[] |
| Reads of undefined: push constant values by the executing shader return |
| undefined: values. |
| endif::VK_KHR_maintenance4[] |
| |
| Push constant values can: be updated incrementally, causing shader stages in |
| pname:stageFlags to read the new data from pname:pValues for push constants |
| modified by this command, while still reading the previous data for push |
| constants not modified by this command. |
| When a <<pipeline-bindpoint-commands, bound pipeline command>> is issued, |
| the bound pipeline's layout must: be compatible with the layouts used to set |
| the values of all push constants in the pipeline layout's push constant |
| ranges, as described in <<descriptorsets-compatibility,Pipeline Layout |
| Compatibility>>. |
| Binding a pipeline with a layout that is not compatible with the push |
| constant layout does not disturb the push constant values. |
| |
| [NOTE] |
| .Note |
| ==== |
| As pname:stageFlags needs to include all flags the relevant push constant |
| ranges were created with, any flags that are not supported by the queue |
| family that the slink:VkCommandPool used to allocate pname:commandBuffer was |
| created on are ignored. |
| ==== |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkCmdPushConstants-offset-01795]] |
| For each byte in the range specified by pname:offset and pname:size and |
| for each shader stage in pname:stageFlags, there must: be a push |
| constant range in pname:layout that includes that byte and that stage |
| * [[VUID-vkCmdPushConstants-offset-01796]] |
| For each byte in the range specified by pname:offset and pname:size and |
| for each push constant range that overlaps that byte, pname:stageFlags |
| must: include all stages in that push constant range's |
| slink:VkPushConstantRange::pname:stageFlags |
| * [[VUID-vkCmdPushConstants-offset-00368]] |
| pname:offset must: be a multiple of `4` |
| * [[VUID-vkCmdPushConstants-size-00369]] |
| pname:size must: be a multiple of `4` |
| * [[VUID-vkCmdPushConstants-offset-00370]] |
| pname:offset must: be less than |
| sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize |
| * [[VUID-vkCmdPushConstants-size-00371]] |
| pname:size must: be less than or equal to |
| sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize minus |
| pname:offset |
| **** |
| |
| include::{generated}/validity/protos/vkCmdPushConstants.txt[] |
| -- |
| |
| |
| ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[] |
| [[descriptorsets-physical-storage-buffer]] |
| == Physical Storage Buffer Access |
| |
| [open,refpage='vkGetBufferDeviceAddress',desc='Query an address of a buffer',type='protos',alias='vkGetBufferDeviceAddressKHR'] |
| -- |
| To query a 64-bit buffer device address value through which buffer memory |
| can: be accessed in a shader, call: |
| |
| ifdef::VK_VERSION_1_2[] |
| include::{generated}/api/protos/vkGetBufferDeviceAddress.txt[] |
| endif::VK_VERSION_1_2[] |
| |
| ifdef::VK_VERSION_1_2+VK_KHR_buffer_device_address[or the equivalent command] |
| |
| ifdef::VK_KHR_buffer_device_address[] |
| include::{generated}/api/protos/vkGetBufferDeviceAddressKHR.txt[] |
| endif::VK_KHR_buffer_device_address[] |
| |
| // @Jon: 3-way conditional logic here is wrong |
| |
| ifdef::VK_EXT_buffer_device_address[] |
| or the equivalent command |
| |
| include::{generated}/api/protos/vkGetBufferDeviceAddressEXT.txt[] |
| endif::VK_EXT_buffer_device_address[] |
| |
| * pname:device is the logical device that the buffer was created on. |
| * pname:pInfo is a pointer to a slink:VkBufferDeviceAddressInfo structure |
| specifying the buffer to retrieve an address for. |
| |
| The 64-bit return value is an address of the start of pname:pInfo->buffer. |
| The address range starting at this value and whose size is the size of the |
| buffer can: be used in a shader to access the memory bound to that buffer, |
| using the |
| ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[] |
| `SPV_KHR_physical_storage_buffer` extension |
| ifdef::VK_EXT_buffer_device_address[or the equivalent] |
| endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[] |
| ifdef::VK_EXT_buffer_device_address[] |
| `SPV_EXT_physical_storage_buffer` extension |
| endif::VK_EXT_buffer_device_address[] |
| and the code:PhysicalStorageBuffer storage class. |
| For example, this value can: be stored in a uniform buffer, and the shader |
| can: read the value from the uniform buffer and use it to do a dependent |
| read/write to this buffer. |
| A value of zero is reserved as a "`null`" pointer and must: not be returned |
| as a valid buffer device address. |
| All loads, stores, and atomics in a shader through |
| code:PhysicalStorageBuffer pointers must: access addresses in the address |
| range of some buffer. |
| |
| If the buffer was created with a non-zero value of |
| ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[] |
| slink:VkBufferOpaqueCaptureAddressCreateInfo::pname:opaqueCaptureAddress |
| ifdef::VK_EXT_buffer_device_address[or] |
| endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[] |
| ifdef::VK_EXT_buffer_device_address[] |
| slink:VkBufferDeviceAddressCreateInfoEXT::pname:deviceAddress |
| endif::VK_EXT_buffer_device_address[] |
| the return value will be the same address that was returned at capture time. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324]] |
| The <<features-bufferDeviceAddress,bufferDeviceAddress>> or |
| <<features-bufferDeviceAddressEXT,sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pname:bufferDeviceAddress>> |
| feature must: be enabled |
| * [[VUID-vkGetBufferDeviceAddress-device-03325]] |
| If pname:device was created with multiple physical devices, then the |
| <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>> |
| or |
| <<features-bufferDeviceAddressMultiDeviceEXT,sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pname:bufferDeviceAddressMultiDevice>> |
| feature must: be enabled |
| **** |
| |
| include::{generated}/validity/protos/vkGetBufferDeviceAddress.txt[] |
| -- |
| |
| [open,refpage='VkBufferDeviceAddressInfo',desc='Structure specifying the buffer to query an address for',type='structs',alias='VkBufferDeviceAddressInfoKHR,VkBufferDeviceAddressInfoEXT'] |
| -- |
| The sname:VkBufferDeviceAddressInfo structure is defined as: |
| |
| include::{generated}/api/structs/VkBufferDeviceAddressInfo.txt[] |
| |
| ifdef::VK_KHR_buffer_device_address[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkBufferDeviceAddressInfoKHR.txt[] |
| endif::VK_KHR_buffer_device_address[] |
| |
| // @Jon: three-way conditional logic is broken |
| ifdef::VK_EXT_buffer_device_address[] |
| or the equivalent |
| |
| include::{generated}/api/structs/VkBufferDeviceAddressInfoEXT.txt[] |
| endif::VK_EXT_buffer_device_address[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:buffer specifies the buffer whose address is being queried. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkBufferDeviceAddressInfo-buffer-02600]] |
| If pname:buffer is non-sparse and was not created with the |
| ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT flag, then it |
| must: be bound completely and contiguously to a single |
| sname:VkDeviceMemory object |
| * [[VUID-VkBufferDeviceAddressInfo-buffer-02601]] |
| pname:buffer must: have been created with |
| ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
| **** |
| |
| include::{generated}/validity/structs/VkBufferDeviceAddressInfo.txt[] |
| -- |
| endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[] |
| |
| ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[] |
| [open,refpage='vkGetBufferOpaqueCaptureAddress',desc='Query an opaque capture address of a buffer',type='protos',alias='vkGetBufferOpaqueCaptureAddressKHR'] |
| -- |
| To query a 64-bit buffer opaque capture address, call: |
| |
| ifdef::VK_VERSION_1_2[] |
| include::{generated}/api/protos/vkGetBufferOpaqueCaptureAddress.txt[] |
| endif::VK_VERSION_1_2[] |
| |
| ifdef::VK_VERSION_1_2+VK_KHR_buffer_device_address[or the equivalent command] |
| |
| ifdef::VK_KHR_buffer_device_address[] |
| include::{generated}/api/protos/vkGetBufferOpaqueCaptureAddressKHR.txt[] |
| endif::VK_KHR_buffer_device_address[] |
| |
| * pname:device is the logical device that the buffer was created on. |
| * pname:pInfo is a pointer to a slink:VkBufferDeviceAddressInfo structure |
| specifying the buffer to retrieve an address for. |
| |
| The 64-bit return value is an opaque capture address of the start of |
| pname:pInfo->buffer. |
| |
| If the buffer was created with a non-zero value of |
| slink:VkBufferOpaqueCaptureAddressCreateInfo::pname:opaqueCaptureAddress the |
| return value must: be the same address. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetBufferOpaqueCaptureAddress-None-03326]] |
| The <<features-bufferDeviceAddress,bufferDeviceAddress>> feature must: |
| be enabled |
| * [[VUID-vkGetBufferOpaqueCaptureAddress-device-03327]] |
| If pname:device was created with multiple physical devices, then the |
| <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>> |
| feature must: be enabled |
| **** |
| |
| include::{generated}/validity/protos/vkGetBufferOpaqueCaptureAddress.txt[] |
| -- |
| endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[] |