// Copyright 2017-2021 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_EXT_descriptor_indexing.txt[]

=== Other Extension Metadata

*Last Modified Date*::
    2017-10-02
*Interactions and External Dependencies*::
  - Promoted to Vulkan 1.2 Core
*Contributors*::
  - Jeff Bolz, NVIDIA
  - Daniel Rakos, AMD
  - Slawomir Grajewski, Intel
  - Tobias Hector, Imagination Technologies

=== Description

This extension adds several small features which together enable
applications to create large descriptor sets containing substantially all of
their resources, and selecting amongst those resources with dynamic
(non-uniform) indexes in the shader.
There are feature enables and SPIR-V capabilities for non-uniform descriptor
indexing in the shader, and non-uniform indexing in the shader requires use
of a new code:NonUniformEXT decoration defined in the
`SPV_EXT_descriptor_indexing` SPIR-V extension.
There are descriptor set layout binding creation flags enabling several
features:

  * Descriptors can be updated after they are bound to a command buffer,
    such that the execution of the command buffer reflects the most recent
    update to the descriptors.
  * Descriptors that are not used by any pending command buffers can be
    updated, which enables writing new descriptors for frame N+1 while frame
    N is executing.
  * Relax the requirement that all descriptors in a binding that is
    "`statically used`" must be valid, such that descriptors that are not
    accessed by a submission need not be valid and can be updated while that
    submission is executing.
  * The final binding in a descriptor set layout can have a variable size
    (and unsized arrays of resources are allowed in the
    `GL_EXT_nonuniform_qualifier` and `SPV_EXT_descriptor_indexing`
    extensions).

Note that it is valid for multiple descriptor arrays in a shader to use the
same set and binding number, as long as they are all compatible with the
descriptor type in the pipeline layout.
This means a single array binding in the descriptor set can serve multiple
texture dimensionalities, or an array of buffer descriptors can be used with
multiple different block layouts.

There are new descriptor set layout and descriptor pool creation flags that
are required to opt in to the update-after-bind functionality, and there are
separate pname:maxPerStage* and pname:maxDescriptorSet* limits that apply to
these descriptor set layouts which may: be much higher than the pre-existing
limits.
The old limits only count descriptors in non-updateAfterBind descriptor set
layouts, and the new limits count descriptors in all descriptor set layouts
in the pipeline layout.

include::{generated}/interfaces/VK_EXT_descriptor_indexing.txt[]

=== Promotion to Vulkan 1.2

Functionality in this extension is included in core Vulkan 1.2, with the EXT
suffix omitted.
However, if Vulkan 1.2 is supported and this extension is not, the
code:descriptorIndexing capability is optional.
The original type, enum and command names are still available as aliases of
the core functionality.

=== Version History

  * Revision 1, 2017-07-26 (Jeff Bolz)
    - Internal revisions
  * Revision 2, 2017-10-02 (Jeff Bolz)
    - ???
