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

[appendix]

[[extensions]]
= Layers & Extensions (Informative)

Extensions to the Vulkan API can: be defined by authors, groups of authors,
and the Khronos Vulkan Working Group.
In order not to compromise the readability of the Vulkan Specification, the
core Specification does not incorporate most extensions.
The online Registry of extensions is available at URL

https://www.khronos.org/registry/vulkan/

and allows generating versions of the Specification incorporating different
extensions.

Most of the content previously in this appendix does not specify *use* of
specific Vulkan extensions and layers, but rather specifies the processes by
which extensions and layers are created.
As of version 1.0.21 of the Vulkan Specification, this content has been
migrated to the <<vulkan-styleguide, Vulkan Documentation and Extensions>>
document.
Authors creating extensions and layers must: follow the mandatory procedures
in that document.

The remainder of this appendix documents a set of extensions chosen when
this document was built.
Versions of the Specification published in the Registry include:

  * Core API + mandatory extensions required of all Vulkan implementations.
  * Core API + all registered and published Khronos (`KHR`) extensions.
  * Core API + all registered and published extensions.

Extensions are grouped as Khronos `KHR`, multivendor `EXT`, and then
alphabetically by author ID.
Within each group, extensions are listed in alphabetical order by their
name.

[NOTE]
.Note
====
As of the initial Vulkan 1.1 public release, the `KHX` author ID is no
longer used.
All `KHX` extensions have been promoted to `KHR` status.
Previously, this author ID was used to indicate that an extension was
experimental, and is being considered for standardization in future `KHR` or
core Vulkan API versions.
We no longer use this mechanism for exposing experimental functionality.

Some vendors may use an alternate author ID ending in `X` for some of their
extensions.
The exact meaning of such an author ID is defined by each vendor, and may
not be equivalent to `KHX`, but it is likely to indicate a lesser degree of
interface stability than a non-`X` extension from the same vendor.
====

include::{generated}/meta/current_extensions_appendix.txt[]
include::{generated}/meta/provisional_extensions_appendix.txt[]
include::{generated}/meta/deprecated_extensions_appendix.txt[]
