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

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

=== Other Extension Metadata

*Last Modified Date*::
    2017-09-05
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
  - Interacts with `apiext:VK_KHR_push_descriptor`
  - Promoted to Vulkan 1.1 Core
*Contributors*::
  - Jeff Bolz, NVIDIA
  - Michael Worcester, Imagination Technologies

=== Description

Applications may wish to update a fixed set of descriptors in a large number
of descriptor sets very frequently, i.e. during initializaton phase or if it
is required to rebuild descriptor sets for each frame.
For those cases it is also not unlikely that all information required to
update a single descriptor set is stored in a single struct.
This extension provides a way to update a fixed set of descriptors in a
single slink:VkDescriptorSet with a pointer to a user defined data structure
describing the new descriptors.

=== Promotion to Vulkan 1.1

ifdef::VK_KHR_push_descriptor[]
flink:vkCmdPushDescriptorSetWithTemplateKHR is included as an interaction
with `apiext:VK_KHR_push_descriptor`.
If Vulkan 1.1 and `VK_KHR_push_descriptor` are supported, this is included
by `apiext:VK_KHR_push_descriptor`.
endif::VK_KHR_push_descriptor[]

The base functionality in this extension is included in core Vulkan 1.1,
with the KHR suffix omitted.
The original type, enum and command names are still available as aliases of
the core functionality.

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

=== Version History

  * Revision 1, 2016-01-11 (Markus Tavenrath)
    - Initial draft
