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

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

=== Other Extension Metadata

*Last Modified Date*::
    2018-08-01
*IP Status*::
    No known IP claims.
*Contributors*::
  - Daniel Rakos, AMD
  - Jeff Bolz, NVIDIA
  - Slawomir Grajewski, Intel
  - Neil Henning, Codeplay

=== Description

This extension introduces the ability to back uniform blocks directly with
descriptor sets by storing inline uniform data within descriptor pool
storage.
Compared to push constants this new construct allows uniform data to be
reused across multiple disjoint sets of drawing or dispatching commands and
may: enable uniform data to be accessed with fewer indirections compared to
uniforms backed by buffer memory.

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

=== Issues

1) Do we need a new storage class for inline uniform blocks vs uniform
blocks?

*RESOLVED*: No.
The code:Uniform storage class is used to allow the same syntax used for
both uniform buffers and inline uniform blocks.

2) Is the descriptor array index and array size expressed in terms of bytes
or dwords for inline uniform block descriptors?

*RESOLVED*: In bytes, but both must: be a multiple of 4, similar to how push
constant ranges are specified.
The pname:descriptorCount of sname:VkDescriptorSetLayoutBinding thus
provides the total number of bytes a particular binding with an inline
uniform block descriptor type can hold, while the pname:srcArrayElement,
pname:dstArrayElement, and pname:descriptorCount members of
sname:VkWriteDescriptorSet, sname:VkCopyDescriptorSet, and
sname:VkDescriptorUpdateTemplateEntry (where applicable) specify the byte
offset and number of bytes to write/copy to the binding's backing store.
Additionally, the pname:stride member of
sname:VkDescriptorUpdateTemplateEntry is ignored for inline uniform blocks
and a default value of one is used, meaning that the data to update inline
uniform block bindings with must be contiguous in memory.

3) What layout rules apply for uniform blocks corresponding to inline
constants?

*RESOLVED*: They use the same layout rules as uniform buffers.

4) Do we need to add non-uniform indexing features/properties as introduced
by `VK_EXT_descriptor_indexing` for inline uniform blocks?

*RESOLVED*: No, because inline uniform blocks are not allowed to be
"`arrayed`".
A single binding with an inline uniform block descriptor type corresponds to
a single uniform block instance and the array indices inside that binding
refer to individual offsets within the uniform block (see issue #2).
However, this extension does introduce new features/properties about the
level of support for update-after-bind inline uniform blocks.

5) Is the pname:descriptorBindingVariableDescriptorCount feature introduced
by `VK_EXT_descriptor_indexing` supported for inline uniform blocks?

*RESOLVED*: Yes, as long as other inline uniform block specific limits are
respected.

6) Do the robustness guarantees of pname:robustBufferAccess apply to inline
uniform block accesses?

*RESOLVED*: No, similarly to push constants, as they are not backed by
buffer memory like uniform buffers.

=== Version History

 * Revision 1, 2018-08-01 (Daniel Rakos)
   - Internal revisions
