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

ifdef::env-github[]
:note-caption: :information_source:
endif::[]

= Vulkan^(R)^ API Documentation Project

This repository contains sources for the formal documentation of the Vulkan
API. This includes:

[options="compact"]
 * The Vulkan API Specification
 * Specification of Vulkan extensions
 * API reference ("`man`") pages
 * The XML API Registry (also mirrored at
   link:https://github.com/KhronosGroup/Vulkan-Headers[Vulkan-Headers])
 * Vulkan header files (also mirrored at
   link:https://github.com/KhronosGroup/Vulkan-Headers[Vulkan-Headers])
 * Related tools and scripts.

The authoritative public repository is located at
link:https://github.com/KhronosGroup/Vulkan-Docs/[Vulkan-Docs].
It hosts a public Issue tracker, and outside developers can file proposed
changes (Pull Requests) against the Specification, subject to approval by
Khronos.

If in doubt where to submit your Issue, consult the
link:https://github.com/KhronosGroup/Vulkan-Web-Registry/blob/main/Vulkan-Projects.adoc[Vulkan-Projects] list on the link:https://github.com/KhronosGroup/Vulkan-Web-Registry[Vulkan-Web-Registry] 
repository.


== External Contributions

Khronos welcomes feedback in Github Issues, and proposed changes in Github
Pull Requests (PRs), but will not necessarily accept all such changes.

Please keep your issues and pull requests focused on solving a single
problem. Broader feedback that tries to solve multiple problems, or touches
many parts of the Specification at once, is difficult for the Vulkan Working
Group to review in a timely fashion.


== Branch Structure

The current Specification is maintained in the default branch (currently
`main`) of the repository.
From this branch it is possible to generate Specifications for any published
version of Vulkan (1.2, 1.1, and 1.0), and incorporating any desired set of
extensions.
Each published update is tagged in the form `1.2.*release*` where *release*
is a constantly incrementing release number and `1.2` is the latest
published version of the API.
The last public spec update prior to Vulkan 1.2 is tagged `v1.1.130`.

The last state of the default branch in Khronos' internal gitlab server,
before 1.2 content was merged into it, is tagged `1.1-archive` (this tag is
not in github).


== Directory Structure

The directory structure is as follows:

```
README.adoc           This file
BUILD.adoc            Documents how to build the specifications and reference pages
CONTRIBUTING.adoc     Requirements for external contributions to the repository
COPYING.adoc          Copyright and licensing information
CODE_OF_CONDUCT.adoc  Code of Conduct
LICENSE.adoc          Summary of licenses used by files in the repository
ChangeLog.txt         Change log summary for each public spec update
Makefile, make*       Makefile and helper build scripts (see BUILD.adoc)
appendices/           Specification appendices
chapters/             Specification chapters
proposals/            Design documents for extensions
config/               Asciidoctor configuration, CSS, and index generator
images/               Images (figures, diagrams, icons)
gen/out/              Default directory for the generated documents
scripts/              Helper scripts used in specification, header, and reference page generation
style/                Sources for "styleguide" (Vulkan Documentation and Extensions: Procedures and Conventions)
xml/                  XML API Registry (vk.xml)
registry.txt          Sources for documentation of the vk.xml format
```


== Building the Specification and Reference Pages

The document sources are marked up in Asciidoctor format, and we use
`asciidoctor` and related toolchain components to generate output documents.
See link:BUILD.adoc[BUILD.adoc] for more information on installing the
toolchain and building the Specification.


== Generating Headers and Related Files

See link:xml/README.adoc[xml/README.adoc].

The header files (`include/vulkan/vulkan*.h`) and many parts of the
specification and reference page documents are generated from descriptions
in the XML API Registry (link:xml/vk.xml[`xml/vk.xml`]).
The generated files are not checked into the repository.
If you change `vk.xml`, you can regenerate the headers by going into
`xml/` and running:

    $ make clean install

The other generated files are built as required via dependencies in
the top-level `Makefile`.

