// Copyright 2014-2023 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

= Vulkan^(R)^ API Registry Build Instructions and Notes

Jon Leech

  * <<intro,Introduction>>
  * <<build,Build Environment>>
  * <<files,Files>>
  * <<targets,Makefile Targets>>
  * <<linux,Linux Software Dependencies>>
  * <<windows,Windows Software Dependencies>>
  * <<history,Revision History>>


[[intro]]
== Introduction

This is the Vulkan XML API Registry. It is used to generate the canonical
Vulkan header files, the API Asciidoc include files used by the Vulkan
Specification and Reference Pages, and many other types of generated files.

When changes to generated files are needed, follow this workflow.
Normally changes are needed only when defining a new extension or core
version of the API.

  * Clone the repository and create a branch to work in locally
  * Edit `vk.xml`
  * `make validate install test`
  ** This validates the XML files against the schema description; generates
     headers in `../gen/include/vulkan` including `vulkan_core.h` and a set
     of platform-dependent headers `vulkan_<platform>.h`; and runs a simple
     compilation test of the headers.
  * `(cd .. && make generated)`
  ** This uses `vk.xml` to generate asciidoc includes and other intermediate
     files in `../gen` for the specification build.
     There are many ways to invoke the Makefile in `..`.
     This simple recipe only generates includes for the core Vulkan API
     without any extensions.
     See `../BUILD.adoc` for more.
  * Repeat until the headers and/or includes are correct
  * Commit your changes to your local git branch, push to your upstream git
    server (your personal repository clone of KhronosGroup/Vulkan-Docs on
    GitHub, for people outside Khronos; the Khronos member gitlab server,
    otherwise), and create a pull or merge request against the default
    branch (currently `main`) or other appropriate target.

For a detailed description of the schema, go to `..` and `make registry`,
which generates `gen/out/registry.html`.
This document also includes some examples of how to make simple changes in
the API via the XML.

The generator scripts are written in Python 3, using the `etree` package for
processing XML.
See `../scripts/README.adoc` for script descriptions.

=== Video Headers

In addition to `vk.xml` this directory also includes `video.xml`.
This is a similarly structured XML file used to produce headers for
structures and other types (`StdVideo*`) associated with externally defined
video standards.
While these data types are passed into some of the Vulkan Video extension
APIs, they are not treated as part of the Vulkan API.
This is why they are defined in a separate XML file.

The `validate` and `install` targets described above also generate the
`StdVideo*` headers in `../gen/include/vk_video`.
A separate test target, `vtest`, can be used as a simple compilation test of
the `StdVideo*` headers.


[[build]]
== Build Environment

We strongly recommend using the Khronos-provided Docker image, which has all
needed build tools pre-installed.
See `../BUILD.adoc` for details.

It is possible to construct your own build environment on Linux, Windows, or
MacOS by following the recipe in the Dockerfile for the Khronos-provided
Docker image.


[[files]]
== Files

  * `vk.xml` - XML API description.
  * `registry.rnc` - RelaxNG compact schema for validating XML against the
    schema.
  * `Makefile` - generates headers from `vk.xml` (see <<targets,Makefile
    Targets>> below).
  * `../gen/include/vulkan/vulkan_core.h` - Generated Vulkan non-platform
    API header.
  * `../gen/include/vulkan/vulkan_<platform>.h` - Generated Vulkan platform
    API headers.
  * `video.xml` - `StdVideo*` API description.
  * `../gen/include/vk_video/vulkan_video*.h` - Generated `StdVideo*` API
    headers.


[[targets]]
== Makefile Targets

  * `install` (default target) - regenerate Vulkan and `StdVideo*` header
    files in `../gen/include/`.
  * `test` - make sure Vulkan headers compile.
    *Important!* Can also be used to test if platform headers compile by
    specifying `make TESTDEFS=-DVK_USE_PLATFORM_<PLATFORM>_<AUTHORID> test`.
  * `vtest` - make sure `StdVideo*` headers compile.
  * `validate` - validate `vk.xml` and `video.xml` against the schema.
    Requires installing `jing` (see <<linux,Software Dependencies>> below).
    Also important!
  * `clean_dirt` - remove intermediate files.
  * `clean` - remove generated files.

Generated files can be created in a directory other than the default
`../gen/` by setting the Makefile variable `GENERATED` to that directory
path.

If you have trouble running the Makefile on your platform, the following
steps will build the Vulkan headers and test that `vulkan_core.h` compiles:

[source,sh]
----
# Regenerate header from XML
python3 ../scripts/genvk.py -registry vk.xml -o ../gen/include/vulkan vulkan_core.h
# Verify that the resulting header compiles
gcc -Wall -std=c99 -c -I../gen/include -I../tests ../tests/htest.c
g++ -Wall -std=c++98 -c -I../gen/include -I../tests ../tests/htest.c
rm -f htest.o
----


[[history]]
== Revision History

  * 2021-12-13 -
    Add `video.xml` for `StdVideo*` APIs and headers.
  * 2020-08-25 -
    Update for new default branch (`main`).
  * 2019/05/12 -
    Bring up to date with changes in file paths and build tools.
  * 2019/03/10 -
    Update for script reorganization.
  * 2018/05/21 -
    Do not generate vulkan_ext.[ch] from the `install` target. Add a new
    shortcut `extloader` target for people still using this code and needing
    to regenerate it.
  * 2018/03/13 -
    Update for new directory structure.
  * 2018/03/06 -
    Update for Vulkan 1.1 release and new default branch.
  * 2015/09/18 -
    Split platform-specific headers into their own vulkan_<platform>.h
    files, move vulkan.h to vulkan_core.h, and add a new (static) vulkan.h
    which includes appropriate combinations of the other headers.
  * 2015/06/01 -
    The header that is generated has been improved relative to the first
    version. Function arguments are indented like the hand-generated header,
    enumerant BEGIN/END_RANGE enums are named the same, etc. The ordering of
    declarations is unlike the hand-generated header, and probably always
    will because it results from a type/enum/function dependency analysis.
    Some of this can be forced by being more explicit about it, if that is a
    big deal.
  * 2015/06/02 -
    Per WG signoff, converted hex constant values to decimal (for
    non-bitmasks) and VK_BIT macros to 'bitpos' attributes in the XML and
    hex constants in the header. Updated schema to match. Changed <ptype>
    tag to <type>.
  * 2015/06/03 -
    Moved into new 'vulkan' tree (did not bother preserving history in
    previous repo). Added semantic knowledge about structs and unions to
    <type> tags instead of just imbedding C struct definitions. Improved
    registry.rnc schema a bit.
  * 2015/06/07 -
    Incorporate feedback from F2F including Python 3 and Windows fixes to
    the scripts. Add documentation to readme.pdf. Fold in multiple merge
    requests resulting from action items agreed at the F2F, to prepare
    for everyone moving to XML instead of directly editing the header.
  * 2015/06/20 -
    Add vulkan-docs target and instructions for installing python3 and
    python-lxml for Windows.
  * 2015/08/13 -
    Bring documentation up to date with Makefile targets (default is now
    ../include/vulkan.h).
  * 2015/09/02 -
    Update README with required (or known working) versions of toolchain
    components.
  * 2015/09/02 -
    Move include/vulkan.h to vulkan/vulkan.h so #include "vulkan/vulkan.h"
    is the normal usage (Bug 14576).
  * 2016/02/12 -
    Update README and remove old files to stage for public release.
  * 2016/05/31 -
    Remove dependency on lxml.
  * 2016/07/27 -
    Update documentation for changes to schema and generator scripts.
  * 2016/08/26 -
    Move README to an asciidoc file and update for the single-branch model.
    Use 'clean' target to remove generated files in both spec source and
    registry Makefiles.
  * 2017/02/20 -
    Move registry.txt (schema documentation) to the Vulkan spec source
    directory and update the README here.
