summaryrefslogtreecommitdiff
path: root/codegen/vulkan/registry.txt
diff options
context:
space:
mode:
Diffstat (limited to 'codegen/vulkan/registry.txt')
-rw-r--r--codegen/vulkan/registry.txt2575
1 files changed, 0 insertions, 2575 deletions
diff --git a/codegen/vulkan/registry.txt b/codegen/vulkan/registry.txt
deleted file mode 100644
index baa49141..00000000
--- a/codegen/vulkan/registry.txt
+++ /dev/null
@@ -1,2575 +0,0 @@
-// Copyright 2013-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= The Khronos^®^ Vulkan^®^ API Registry
-Jon Leech
-:data-uri:
-:icons: font
-:toc2:
-:toclevels: 3
-:numbered:
-:source-highlighter: rouge
-:rouge-style: github
-:doctype: book
-:imagewidth: 800
-:fullimagewidth: width="800"
-:cl: :
-
-// Various special / math symbols. This is easier to edit with than Unicode.
-include::{config}/attribs.txt[]
-
-:leveloffset: 1
-
-<<<<
-
-include::{config}/copyright-ccby.txt[]
-
-<<<<
-
-[[introduction]]
-= Introduction
-
-This document describes the Khronos Vulkan API Registry schema, and provides
-some additional information about using the registry and scripts to generate
-a variety of outputs, including C header files as well as several types of
-asciidoc include files used in the Vulkan API specification and reference
-pages.
-The underlying XML files and scripts are located on the Khronos public
-Github server at URL
-
-https://github.com/KhronosGroup/Vulkan-Docs
-
-The authoritative copy of the Registry is maintained in the default branch,
-currently `main`.
-
-The registry uses an XML representation of the Vulkan API, together with a
-set of Python scripts to manipulate the registry once loaded.
-The scripts rely on the Python `etree` package to parse and operate on XML.
-An XML schema and validator target are included.
-
-The schema is based on, but not identical to that used for the previously
-published OpenGL, OpenGL ES and EGL API registries.
-It was extended to represent additional types and concepts not needed for
-those APIs, such as structure and enumerant types, as well as additional
-types of registered information specific to Vulkan.
-
-The Vulkan C header files generated from the registry are checked into a
-separate repository under
-
-https://github.com/KhronosGroup/Vulkan-Headers/
-
-
-== Schema Choices
-
-The XML schema is not pure XML all the way down.
-In particular, command return types/names and parameters, and structure
-members, are described in mixed-mode tag containing C declarations of the
-appropriate information, with some XML nodes annotating particular parts of
-the declaration such as its base type and name.
-This choice is based on prior experience with the SGI `.spec` file format
-used to describe OpenGL, and greatly eases human reading and writing the
-XML, and generating C-oriented output.
-The cost is that people writing output generators for other languages will
-have to include enough logic to parse the C declarations and extract the
-relevant information.
-
-People who do not find the supplied Python scripts to suit their needs are
-likely to write their own parsers, interpreters, and/or converters operating
-on the registry XML.
-We hope that we have provided enough information in this document, the RNC
-schema (`registry.rnc`), and comments in the Registry (`vk.xml`) itself to
-enable such projects.
-If not and you need clarifications; if you have other problems using the
-registry; or if you have proposed changes and enhancements, then please file
-issues on Khronos' public Github project at
-
-https://github.com/KhronosGroup/Vulkan-Docs/issues
-
-Please tag your issues with `[Registry]` in the subject line to help us
-categorize them.
-We have considered separating the registry from the specification source
-into a separate repository, but since there is so much specification valid
-usage language imbedded in the registry XML, this is unlikely to happen.
-
-
-[[starting]]
-= Getting Started
-
-See
-https://gitlab.khronos.org/vulkan/vulkan/blob/main/xml/README.adoc[`xml/README.adoc`]
-in the `Vulkan-Docs` repository for information on required toolchain
-components such as Python 3, pass:[g++], and GNU make.
-
-Once you have the right tools installed, perform the following steps:
-
- * Check out the `Vulkan-Docs` repository linked above from Khronos Github
- (there are instructions at the link)
- * `cd` to the root directory in your checked-out repo
- * Switch to the default branch (`main`).
- * Invoke `make clean ; make install ; make test`
-
-This should regenerate `vulkan_core.h` and a variety of platform-specific
-headers, install them in `../include/vulkan/`, and verify that the headers
-build properly.
-If you build at the latest repository tag, the resulting headers should be
-identical to the latest versions in the
-link:https://github.com/KhronosGroup/Vulkan-Headers/[Vulkan-Headers
-repository].
-
-The `install` target also generates source code for a simple extension
-loader library in `../src/ext_loader/`.
-
-Other Makefile targets in `xml/` include:
-
- * `validate` - validate `vk.xml` against the XML schema.
- Recommended if you are making nontrivial changes.
- * The asciidoc includes used by the Specification and Reference Pages are
- built using the 'make generated' target in the parent directory
- Makefile, although they use the scripts and XML in this directory.
- These files are generated dynamically when building the specs, since
- their contents depend on the exact set of extensions the Specification
- is being built to include.
-
-If you just want to modify the API, changing `vk.xml` and running `make`
-should be all that is needed.
-See <<examples>> for some examples of modifying the XML.
-
-If you want to use the registry for reasons other than generating the header
-file, extension loader, and asciidoc includes, or to generate headers for
-languages other than C, start with the Makefile rules and the files
-`vk.xml` and scripts `genvk.py`, `reg.py`, and `generator.py`.
-The scripts are described below and are all located in the `scripts`
-directory under the repository root.
-
-== Header Generation Script - `genvk.py`
-
-When generating header files using the `genvk.py` script, an API name and
-profile name are required, as shown in the Makefile examples.
-Additionally, specific API versions and extensions can be required or
-excluded.
-Based on this information, the generator script extracts the relevant
-interfaces and creates a C-language header file for them.
-`genvk.py` contains predefined generator options for the current Vulkan
-Specification release.
-
-The generator script is intended to be generalizable to other languages by
-writing new generator classes.
-Such generators would have to rewrite the C types and definitions in the XML
-to something appropriate to their language.
-
-
-== Registry Processing Script - `reg.py`
-
-XML processing is done in `reg.py`, which contains several objects and
-methods for loading registries and extracting interfaces and extensions for
-use in header generation.
-There is some internal documentation in the form of comments, although
-nothing more extensive exists yet.
-
-
-== Output Generator Script - `generator.py`
-
-Once the registry is loaded, the `COutputGenerator` class defined in
-`generator.py` is used to create a header file.
-The `DocOutputGenerator` class is used to create the asciidoc include files.
-Output generators for other purposes can be added as needed.
-There are a variety of output generators included:
-
- * `cgenerator.py` - generate C header file
- * `docgenerator.py` - generate asciidoc includes for APIs
- * `hostsyncgenerator.py` - generate host sync table includes for APIs
- * `validitygenerator.py` - generate validity language includes
- * `pygenerator.py` - generate a Python dictionary-based encoding of
- portions of the registry, used during spec generation
- * `extensionStubSource.py` - generate a simple C extension loader.
-
-
-[[schema]]
-= Vulkan Registry Schema
-
-The format of the Vulkan registry is a top level tag:registry tag containing
-tag:types, tag:enums, tag:commands, tag:feature, and tag:extension tags
-describing the different elements of an API, as explained below.
-This description corresponds to a formal Relax NG schema file,
-`registry.rnc`, against which the XML registry files can be validated.
-
-At present the only registry in this schema is the core Vulkan API registry,
-`vk.xml`.
-
-
-[[schema:profile]]
-== Profiles
-
-Types and enumerants can have different definitions depending on the API
-profile requested.
-This capability is not used in the current Vulkan API but may be in the
-future.
-Features and extensions can include some elements conditionally depending on
-the API profile requested.
-
-
-[[schema:apiname]]
-== API Names
-
-Specific API versions features and extensions can be tagged as belonging to
-to classes of features with the use of _API names_.
-This is intended to allow multiple closely-related API specifications in the
-same family - such as desktop and mobile specifications - to share the same
-XML.
-An API name is an arbitrary alphanumeric string, although it should be
-chosen to match the corresponding API.
-For example, Vulkan and OpenXR use `vulkan` and `openxr` as their API names,
-respectively.
-
-The attr:api attribute of the tag:feature tag and the attr:supported
-attribute of the tag:extensions tag must be comma-separated lists of one or
-more API names, all of which match that feature or extension.
-When generating headers and other artifacts from the XML, an API name may be
-specified to the processing scripts, causing the selection of only those
-features and extensions whose API names match the specified name.
-
-Several other tags for defining types and groups of types also support
-attr:api attributes.
-If present, the attribute value must be a comma-separated list of one or
-more API names.
-This allows specializing a definition for different, closely related APIs.
-
-
-[[schema:root]]
-= Registry Root (tag:registry tag)
-
-A tag:registry contains the entire definition of one or more related APIs.
-
-== Attributes of tag:registry tags
-
-None.
-
-== Contents of tag:registry tags
-
-Zero or more of each of the following tags, normally in this order (although
-order should not be important):
-
- * tag:comment - Contains arbitrary text, such as a copyright statement.
- * <<tag-platforms,tag:platforms>> - defines platform names corresponding
- to platform-specific <<tag-extension,API extensions>>.
- * <<tag-tags,tag:tags>> - defines author IDs used for extensions and
- layers.
- Author IDs are described in detail in the "`Layers & Extensions`"
- section of the "`Vulkan Documentation and Extensions: Procedures and
- Conventions`" document.
- * <<tag-types,tag:types>> - defines API types.
- Usually only one tag is used.
- * <<tag-enums,tag:enums>> - defines API token names and values.
- Usually multiple tags are used.
- Related groups may be tagged as an enumerated type corresponding to a
- tag:type tag, and resulting in a C `enum` declaration.
- This ability is heavily used in the Vulkan API.
- * <<tag-commands,tag:commands>> - defines API commands (functions).
- Usually only one tag is used.
- * <<tag-feature,tag:feature>> - defines API feature interfaces (API
- versions, more or less).
- One tag per feature set.
- * <<tag-extensions,tag:extensions>> - defines API extension interfaces.
- Usually only one tag is used, wrapping many extensions.
-
-
-[[tag-comment]]
-=== Comment Tags (tag:comment tag)
-
-A tag:comment tag contains an arbitrary string, and is unused.
-Comment tags may appear in multiple places in the schema, as described
-below.
-Comment tags are removed by output generators if they would otherwise appear
-in generated headers, asciidoc include files, etc.
-
-
-[[tag-platforms]]
-= Platform Name Blocks (tag:platforms tag)
-
-A tag:platforms contains descriptions of platform IDs for platforms
-supported by window system-specific extensions to Vulkan.
-
-== Attributes of tag:platforms tags
-
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:platforms tags
-
-Zero or more tag:platform tags, in arbitrary order (though they are
-typically ordered by sorting on the platform name).
-
-
-[[tag-platform]]
-= Platform Names (tag:platform tag)
-
-A tag:platform tag describes a single platform name.
-
-== Attributes of tag:platform tags
-
- * attr:name - required.
- The platform name.
- This must be a short alphanumeric string corresponding to the platform
- name, valid as part of a C99 identifier.
- Lower-case is preferred.
- In some cases, it may be desirable to distinguish a subset of platform
- functionality from the entire platform.
- In these cases, the platform name should begin with the entire platform
- name, followed by `_` and the subset name.
-+
---
-[NOTE]
-.Note
-====
-For example,
-
-`name="xlib"`
-
-is used for the X Window System, Xlib client library platform.
-
-`name="xlib_xrandr"`
-
-is used for the XRandR functionality within the `xlib` platform.
-====
---
- * attr:protect - required.
- This must be a C99 preprocessor token beginning with `VK_USE_PLATFORM_`
- followed by the platform name, converted to upper case, followed by `_`
- and the extension suffix of the corresponding window system-specific
- extension supporting the platform.
-+
---
-[NOTE]
-.Note
-====
-For example,
-
-`protect="VK_USE_PLATFORM_XLIB_XRANDR_EXT"`
-
-is used for the `xlib_xrandr` platform name.
-====
---
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:platform tags
-
-No contents are allowed.
-All information is contained in the attributes.
-
-
-[[tag-tags]]
-= Author ID Blocks (tag:tags tag)
-
-A tag:tags tag contains tag:authorid tags describing reserved author IDs
-used by extension and layer authors.
-
-== Attributes of tag:tags tags
-
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:tags tags
-
-Zero or more tag:tag tags, in arbitrary order (though they are typically
-ordered by sorting on the author ID).
-
-
-[[tag-tag]]
-= Author IDs (tag:tag tag)
-
-A tag:tag tag contains information defining a single author ID.
-
-== Attributes of tag:tag tags
-
- * attr:name - required.
- The author ID, as registered with Khronos.
- A short, upper-case string, usually an abbreviation of an author,
- project or company name.
- * attr:author - required.
- The author name, such as a full company or project name.
- * attr:contact - required.
- The contact who registered or is currently responsible for extensions
- and layers using the ID, including sufficient contact information to
- reach the contact such as individual name together with email address,
- Github username, or other contact information.
-
-== Contents of tag:tag tags
-
-No contents are allowed.
-All information is contained in the attributes.
-
-
-[[tag-types]]
-= API Type Blocks (tag:types tag)
-
-A tag:types tag contains definitions of derived types used in the API.
-
-== Attributes of tag:types tags
-
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:types tags
-
-Zero or more tag:type and tag:comment tags, in arbitrary order (though they
-are typically ordered by putting dependencies of other types earlier in the
-list).
-The tag:comment tags are used mostly to indicate grouping of related types.
-
-
-[[tag-type]]
-= API Type (tag:type tag)
-
-A tag:type tag contains information which can be used to generate C code
-corresponding to the type.
-In many cases, this is simply legal C code, with attributes or embedded tags
-denoting the type name and other types used in defining this type.
-In some cases, additional attribute and embedded type information is used to
-generate more complicated C types.
-
-== Attributes of tag:type tags
-
- * attr:requires - optional.
- Another type name this type requires to complete its definition.
- * attr:name - optional.
- Name of this type (if not defined in the tag body).
- * attr:alias - optional.
- Another type name which this type is an alias of.
- Must match the name of another tag:type element.
- This is typically used when promoting a type defined by an extension to
- a new core version of the API.
- The old extension type is still defined, but as an alias of the new
- type.
- * attr:api - optional <<schema:apiname, API names>> for which this
- definition is specialized, so that different APIs may have different
- definitions for the same type.
- This definition is only used if the requested API name matches the
- attribute.
- May be used to address subtle incompatibilities.
- * attr:category - optional.
- A string which indicates that this type contains a more complex
- structured definition.
- At present the only accepted categories are `basetype`, `bitmask`,
- `define`, `enum`, `funcpointer`, `group`, `handle`, `include`, `struct`,
- and `union`, as described below.
- * attr:comment - optional.
- Arbitrary string (unused).
- * attr:parent - only applicable if `"category"` is `handle`.
- Notes another type with the `handle` category that acts as a parent
- object for this type.
- * attr:returnedonly - only applicable if `"category"` is `struct` or
- `union`.
- Notes that this struct/union is going to be filled in by the API, rather
- than an application filling it out and passing it to the API.
- * attr:structextends only applicable if category is `struct` or `union`.
- This is a comma-separated list of structures whose `pNext` can include
- this type.
- This should usually only list the top-level structure that is extended,
- for all possible extending structures.
- This will generate a validity statement on the top level structure that
- validates the entire chain in one go, rather than each extending
- structure repeating the list of valid structs.
- There is no need to set the attr:noautovalidity attribute on the `pNext`
- members of extending structures.
- * attr:allowduplicate - only applicable if attr:category is `"struct"`.
- If `"true"`, then structures whose `pNext` chains include this structure
- may include more than one instance of it.
- * attr:objtypeenum - only applicable at present if attr:category is
- `"handle"`.
- Specifies the name of a `VkObjectType` enumerant which corresponds to
- this type.
- The enumerant must be defined.
-
-== Contents of tag:type tags
-
-The valid contents depend on the attr:category attribute.
-
-=== Enumerated types - attr:category `"enum"`
-
-If the attr:category tag has the value `enum`, the type is a C enumeration.
-The body of the tag is ignored in this case.
-The value of the attr:name attribute must be provided and must match the
-attr:name attribute of a <<tag-enums,tag:enums>> tag.
-The enumerant values defined within the tag:enums tag are used to generate a
-C `enum` type declaration.
-
-=== Structure types - attr:category `"struct"` or `"union"`
-
-If the attr:category tag has the values `struct` or `union`, the type is a C
-structure or union, respectively.
-In this case, the attr:name attribute must be provided, and the contents of
-the tag:type tag are a series of tag:member tags defining the members of the
-aggregate type, in order, interleaved with any number of tag:comment tags.
-
-==== Structure member (tag:member) tags
-
-The tag:member tag defines the type and name of a structure or union member.
-
-==== Attributes of tag:member tags
-
- * attr:values - only valid on the `sType` member of a struct.
- This is a comma-separated list of enumerant values that are valid for
- the structure type; usually there is only a single value.
- * attr:len - if the member is an array, len may be one or more of the
- following things, separated by commas (one for each array indirection):
- another member of that struct; `"null-terminated"` for a string; `"1"`
- to indicate it is just a pointer (used for nested pointers); or an
- equation in math markup for incorporation in the specification (a LaTeX
- math expression delimited by `latexmath:[` and `]`.
- The only variables in the equation should be the names of members of the
- structure.
- * attr:altlen - if the attr:len attribute is specified, and contains a
- `latexmath:` equation, this attribute should be specified with an
- equivalent equation using only C builtin operators, C math library
- function names, and variables as allowed for attr:len.
- It must be a valid C99 expression whose result is equal to attr:len for
- all possible inputs.
- It is a comma separated list that has size equal to only the `latexmath`
- item count in attr:len list.
- This attribute is intended to support consumers of the XML who need to
- generate validation code from the allowed length.
- * attr:externsync - denotes that the member should be externally
- synchronized when accessed by Vulkan
- * attr:optional - optional.
- A value of `"true"` or `"false"` determines whether this member can be
- omitted by providing `NULL` (for pointers), `VK_NULL_HANDLE` (for
- handles), or 0 (for other scalar types).
- If the member is a pointer to one of those types, multiple values may be
- provided, separated by commas - one for each pointer indirection.
- If not present, the value is assumed to be `"false"` (the member must
- not be omitted).
- Structure members with name `pNext` must always be specified with
- `optional="true"`, since there is no requirement that any member of a
- `pNext` chain have a following member in the chain.
-+
---
-[NOTE]
-.Note
-====
-While the attr:optional attribute can be used for scalar types such as
-integers, it does not affect the output generators included with the Vulkan
-Specification.
-In this case, the attribute serves only as an indicator to human readers of
-the XML.
-====
---
- * attr:selector - optional.
- If the member is a union, attr:selector identifies another member of the
- struct that is used to select which of that union's members are valid.
- * attr:selection - optional.
- For a member of a union, attr:selection identifies a value of the
- attr:selector that indicates this member is valid.
- * attr:noautovalidity - prevents automatic validity language being
- generated for the tagged item.
- Only suppresses item-specific validity - parenting issues etc.
- are still captured.
- It must also be used for structures that have no implicit validity when
- such structure has explicit validity.
- * attr:limittype - only applicable for members of
- VkPhysicalDeviceProperties and VkPhysicalDeviceProperties2, their
- substrucutres, and extensions.
- Specifies the type of a device limit.
- This type describes how a value might be compared with the value of a
- member in order to check whether it fits the limit.
- Valid values:
- ** `"min"` and `"max"` denote minimum and maximum limits.
- They may also apply to arrays and `VkExtent*D`.
- ** `"bitmask"` corresponds to bitmasks and `VkBool32`, where set bits
- indicate the presence of a capability
- ** `"range"` specifies a [min, max] range
- ** `"struct"` means that the member's fields should be compared.
- ** `"noauto"` limits cannot be trivially compared.
- This is the default value, if unspecified.
- * attr:objecttype - only applicable for members which are `uint64_t`
- values representing a Vulkan obejct handle.
- Specifies the name of another member which must be a `VkObjectType` or
- `VkDebugReportObjectTypeEXT` value specifying the type of object the
- handle refers to.
-
-==== Contents of tag:member tags
-
-The text elements of a tag:member tag, with all other tags removed, is a
-legal C declaration of a struct or union member.
-In addition it may contain several semantic tags:
-
- * The tag:type tag is optional.
- It contains text which is a valid type name found in another tag:type
- tag, and indicates that this type must be previously defined for the
- definition of the command to succeed.
- Builtin C types should not be wrapped in tag:type tags.
- * The tag:name tag is required, and contains the struct/union member name
- being described.
- * The tag:enum tag is optional.
- It contains text which is a valid enumerant name found in another
- tag:type tag, and indicates that this enumerant must be previously
- defined for the definition of the command to succeed.
- Typically this is used to semantically tag static array lengths.
- * The tag:comment tag is optional.
- It contains an arbitrary string (unused).
-
-
-=== All other types
-
-If the attr:category attribute is one of `basetype`, `bitmask`, `define`,
-`funcpointer`, `group`, `handle` or `include`, or is not specified, tag:type
-contains text which is legal C code for a type declaration.
-It may also contain embedded tags:
-
- * tag:type - nested type tags contain other type names which are required
- by the definition of this type.
- * tag:apientry/ - insert a platform calling convention macro here during
- header generation, used mostly for function pointer types.
- * tag:name - contains the name of this type (if not defined in the tag
- attributes).
- * tag:bitvalues - contains the name of the enumeration defining flag
- values for a `bitmask` type.
- Ignored for other types.
-
-There is no restriction on which sorts of definitions may be made in a given
-category, although the contents of tags with attr:category `enum`, `struct`
-or `union` are interpreted specially as described above.
-
-However, when generating the header, types within each category are grouped
-together, and categories are generated in the order given by the following
-list.
-Therefore, types in a category should correspond to the intended purpose
-given for that category.
-If this recommendation is not followed, it is possible that the resulting
-header file will not compile due to out-of-order type dependencies.
-The intended purpose of each category is:
-
- * `include` (`#include`) directives)
- * `define` (macro `#define` directives)
- * `basetype` (built-in C language types; scalar API typedefs, such as the
- definition of `VkFlags`; and types defined by external APIs, such as an
- underlying OS or window system
- * `handle` (invocations of macros defining scalar types such as
- `VkInstance`)
- * `enum` (enumeration types and `#define` for constant values)
- * `group` (currently unused)
- * `bitmask` (enumeration types whose members are bitmasks)
- * `funcpointer` (function pointer typedefs)
- * `struct` and `union` together (struct and union types)
-
-
-[[tag-types:example]]
-== Example of a tag:types tag
-
-[source,xml]
---------------------------------------
-<types>
- <type name="stddef">#include &lt;stddef.h&gt;</type>
- <type requires="stddef">typedef ptrdiff_t <name>VKlongint</name>;</type>
- <type name="VkEnum" category="enum"/>
- <type category="struct" name="VkStruct">
- <member><type>VkEnum</type> <name>srcEnum</name></member>
- <member><type>VkEnum</type> <name>dstEnum</name></member>
- </type>
-</types>
-
-<enums name="VkEnum" type="enum">
- <enum value="0" name="VK_ENUM_ZERO"/>
- <enum value="42" name="VK_ENUM_FORTY_TWO"/>
-</enums>
---------------------------------------
-
-The `VkStruct` type is defined to require the types `VkEnum` and `VKlongint`
-as well.
-If `VkStruct` is in turn required by a command or another type during header
-generation, it will result in the following declarations:
-
-[source,c]
---------------------------------------
-#include <stddef.h>
-typedef ptrdiff_t VKlongint.
-
-typedef enum {
- VK_ENUM_ZERO = 0,
- VK_ENUM_FORTY_TWO = 42
-} VkEnum;
-
-typedef struct {
- VkEnum dstEnum;
- VkLongint dstVal;
-} VkStruct;
---------------------------------------
-
-Note that the angle brackets around `stddef.h` are represented as XML
-entities in the registry.
-This could also be done using a CDATA block but unless there are many
-characters requiring special representation in XML, using entities is
-preferred.
-
-
-[[tag-enums]]
-= Enumerant Blocks (tag:enums tag)
-
-The tag:enums tags contain individual tag:enum tags describing each of the
-token names used in the API.
-In some cases these correspond to a C `enum`, and in some cases they are
-simply compile time constants (e.g. `#define`).
-
-[NOTE]
-.Note
-====
-It would make more sense to call these `const` or `define` tags.
-This is a historical hangover from the OpenGL XML format which this schema
-was based on.
-====
-
-
-== Attributes of tag:enums tags
-
- * attr:name - optional.
- String naming the C `enum` type whose members are defined by this enum
- group.
- If present, this attribute should match the attr:name attribute of a
- corresponding tag:type tag.
- * attr:type - optional.
- String describing the data type of the values of this group of enums.
- At present the only accepted categories are `enum` and `bitmask`, as
- described below.
- * attr:start, attr:end - optional.
- Integers defining the start and end of a reserved range of enumerants
- for a particular vendor or purpose.
- attr:start must be less than or equal to attr:end.
- These fields define formal enumerant allocations, and are made by the
- Khronos Registrar on request from implementors following the enum
- allocation policy.
- * attr:vendor - optional.
- String describing the vendor or purpose to whom a reserved range of
- enumerants is allocated.
- * attr:comment - optional.
- Arbitrary string (unused).
- * attr:bitwidth - optional.
- Bit width required for the generated enum value type.
- If omitted, a default value of 32 is used.
-
-== Contents of tag:enums tags
-
-Each tag:enums block contains zero or more tag:enum, tag:unused, and
-tag:comment tags, in arbitrary order (although they are typically ordered by
-sorting on enumerant values, to improve human readability).
-
-== Example of tag:enums tags
-
-<<tag-types:example,An example>> showing a tag with attribute
-attr:type`="enum"` is given above.
-The following example is for non-enumerated tokens.
-
-[source,xml]
---------------------------------------
-<enums>
- <enum value="256" name="VK_MAX_EXTENSION_NAME"/>
- <enum value="MAX_FLOAT" name="VK_LOD_CLAMP_NONE"/>
-</enums>
---------------------------------------
-
-When processed into a C header, and assuming all these tokens were required,
-this results in
-
-[source,c]
---------------------------------------
-#define VK_MAX_EXTENSION_NAME 256
-#define VK_LOD_CLAMP_NONE MAX_FLOAT
---------------------------------------
-
-
-[[tag-enum]]
-= Enumerants (tag:enum tag)
-
-Each tag:enum tag defines a single Vulkan (or other API) token.
-
-== Attributes of tag:enum tags
-
- * attr:value is a numeric value in the form of a legal C expression when
- evaluated at compile time in the generated header files.
- This is usually either a literal integer value or the name of an alias
- for a previously defined value, though more complex expressions are
- sometimes employed for <<compile-time-constants, compile time
- constants>>.
- * attr:bitpos is a literal integer bit position in a bitmask.
- The bit position must be in the range [0,30] when used as a flag bit in
- a `Vk*FlagBits` data type.
- Bit positions 31 and up may be used for values that are not flag bits,
- or for <<adding-bitflags, flag bits used with 64-bit flag types>>.
- Exactly one of attr:value and attr:bitpos must be present in an tag:enum
- tag.
- * attr:name - required.
- Enumerant name, a legal C preprocessor token name.
- * attr:api - optional <<schema:apiname, API names>> for which this
- definition is specialized, so that different APIs may have different
- values for the same token.
- This definition is only used if the requested API name matches the
- attribute.
- May be used to address subtle incompatibilities.
- * attr:type - may be used only when attr:value is specified.
- In this case, attr:type is optional except when defining a
- <<compile-time-constants, compile time constant>>, in which case it is
- required when using some output generator paths.
- If present the attribute must be a C scalar type corresponding to the
- type of attr:value, although only `uint32_t`, `uint64_t`, and `float`
- are currently meaningful.
- attr:type is used by some output generators to generate constant
- declarations, although the default behavior is to use C `#define` for
- compile-time constants.
- * attr:alias - optional.
- Name of another enumerant this is an alias of, used where token names
- have been changed as a result of profile changes or for consistency
- purposes.
- An enumerant alias is simply a different attr:name for the exact same
- attr:value or attr:bitpos.
- * attr:protect - optional.
- An additional preprocessor token used to protect an enum definition.
-
-[NOTE]
-.Note
-====
-In older versions of the schema, attr:type was described as allowing only
-the C integer suffix types `u` and `ull`, which is inconsistent with the
-current definition.
-However, attr:type was not actually used in the registry processing scripts
-or `vk.xml` at the time the current definition was introduced, so this is
-expected to be a benign change.
-====
-
-
-== Contents of tag:enum tags
-
-tag:enum tags have no allowed contents.
-All information is contained in the attributes.
-
-
-[[tag-unused]]
-= Unused Enumerants (tag:unused tag)
-
-Each tag:unused tag defines a range of enumerants which is allocated, but
-not yet assigned to specific enums.
-This just tracks the unused values for the Registrar's use, and is not used
-for header generation.
-
-[NOTE]
-.Note
-====
-tag:unused tags could be generated and inserted automatically, which would
-be a good way to avoid the attributes becoming out of date.
-However, they are rarely used in the Vulkan XML schema, unlike the OpenGL
-XML schema it was based on.
-====
-
-== Attributes of tag:unused tags
-
- * attr:start - required, attr:end - optional.
- Integers defining the start and end of an unused range of enumerants.
- attr:start must be {leq} attr:end.
- If attr:end is not present, then attr:start defines a single unused
- enumerant.
- This range should not exceed the range reserved by the surrounding
- tag:enums tag.
- * attr:vendor - optional.
- String describing the vendor or purposes to whom a reserved range of
- enumerants is allocated.
- Usually identical to the attr:vendor attribute of the surrounding
- attr:enums block.
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:unused tags
-
-None.
-
-
-[[tag-commands]]
-= Command Blocks (tag:commands tag)
-
-The tag:commands tag contains definitions of each of the functions
-(commands) used in the API.
-
-== Attributes of tag:commands tags
-
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:commands tags
-
-Each tag:commands block contains zero or more tag:command tags, in arbitrary
-order (although they are typically ordered by sorting on the command name,
-to improve human readability).
-
-
-[[tag-command]]
-= Commands (tag:command tag)
-
-The tag:command tag contains a structured definition of a single API command
-(function).
-
-== Attributes of tag:command tags
-
-There are two ways to define a command.
-The first uses a set of attributes to the tag:command tag defining
-properties of the command used for constructing automatic validation rules,
-and the contents of the tag:command tag define the name, signature, and
-parameters of the command.
-In this case the allowed attributes include:
-
- * attr:queues - optional.
- A string identifying the command queues this command can be placed on.
- The format of the string is one or more of the terms `"compute"`,
- `"transfer"`, and `"graphics"`, with multiple terms separated by commas
- (`","`).
- * attr:successcodes - optional.
- A string describing possible successful return codes from the command,
- as a comma-separated list of Vulkan result code names.
- * attr:errorcodes - optional.
- A string describing possible error return codes from the command, as a
- comma-separated list of Vulkan result code names.
- * attr:renderpass - optional.
- A string identifying whether the command can be issued only inside a
- render pass (`"inside"`), only outside a render pass (`"outside"`), or
- both (`"both"`).
- * attr:cmdbufferlevel - optional.
- A string identifying the command buffer levels that this command can be
- called by.
- The format of the string is one or more of the terms `"primary"` and
- `"secondary"`, with multiple terms separated by commas (`","`).
- * attr:comment - optional.
- Arbitrary string (unused).
-
-The second way of defining a command is as an alias of another command.
-For example when an extension is promoted from extension to core status, the
-commands defined by that extensions become aliases of the corresponding new
-core commands.
-In this case, only two attributes are allowed:
-
- * attr:name - required.
- A string naming the command defined by the tag.
- * attr:alias - required.
- A string naming the command that attr:name is an alias of.
- The string must be the same as the attr:name value of another
- tag:command defining another command.
-
-== Contents of tag:command tags
-
- * tag:proto is required and must be the first element.
- It is a tag defining the C function prototype of a command as described
- below, up to the function name and return type but not including
- function parameters.
- * tag:param elements for each command parameter follow, defining its name
- and type, as described below.
- If a command takes no arguments, it has no tag:param tags.
-
-Following these elements, the remaining elements in a tag:command tag are
-optional and may be in any order:
-
- * tag:alias - optional.
- Has no attributes and contains a string which is the name of another
- command this command is an alias of, used when promoting a function from
- vendor to Khronos extension or Khronos extension to core API status.
- A command alias describes the case where there are two function names
- which implement the same behavior.
- * tag:description - optional.
- Unused text.
- * tag:implicitexternsyncparams - optional.
- Contains a list of tag:param tags, each containing asciidoc source text
- describing an object which is not a parameter of the command but is
- related to one, and which also <<tag-command:param:attr,requires
- external synchronization>>.
- The text is intended to be incorporated into the API specification.
-
-[NOTE]
-.Note
-====
-Versions of the registry documentation prior to 1.1.93 asserted that command
-aliases "`resolve to the _same_ entry point in the underlying layer stack.`"
-Whilst this may be true on many implementations, it is not required - each
-command alias must be queried separately through flink:vkGetInstanceProcAddr
-or flink:vkGetDeviceProcAddr.
-====
-
-
-[[tag-command:proto]]
-== Command prototype (tag:proto tags)
-
-The tag:proto tag defines the return type and name of a command.
-
-=== Attributes of tag:proto tags
-
-None.
-
-// attr:group - group name, an arbitrary string.
-//
-// If the group name is defined, it may be interpreted as described in
-// <<tag-group:meaning>>.
-
-=== Contents of tag:proto tags
-
-The text elements of a tag:proto tag, with all other tags removed, is legal
-C code describing the return type and name of a command.
-In addition to text, it may contain two semantic tags:
-
- * The tag:type tag is optional, and contains text which is a valid type
- name found in a tag:type tag.
- It indicates that this type must be previously defined for the
- definition of the command to succeed.
- Builtin C types, and any derived types which are expected to be found in
- other header files, should not be wrapped in tag:type tags.
- * The tag:name tag is required, and contains the command name being
- described.
-
-
-[[tag-command:param]]
-== Command parameter (tag:param tags)
-
-The tag:param tag defines the type and name of a parameter.
-Its contents are very similar to the tag:member tag used to define struct
-and union members.
-
-
-[[tag-command:param:attr]]
-=== Attributes of tag:param tags
-
- * attr:len - if the param is an array, len may be one or more of the
- following things, separated by commas (one for each array indirection):
- another param of that command; `"null-terminated"` for a string; `"1"`
- to indicate it is just a pointer (used for nested pointers); or an
- equation in math markup for incorporation in the specification (a LaTeX
- math expression delimited by `latexmath:[` and `]`.
- The only variables in the equation should be the names of this or other
- parameters.
- * attr:altlen - if the attr:len attribute is specified, and contains a
- `latexmath:` equation, this attribute should be specified with an
- equivalent equation using only C builtin operators, C math library
- function names, and variables as allowed for attr:len.
- It must be a valid C99 expression whose result is equal to attr:len for
- all possible inputs.
- It is a comma separated list that has size equal to only the `latexmath`
- item count in attr:len list.
- This attribute is intended to support consumers of the XML who need to
- generate validation code from the allowed length.
- * attr:optional - optional.
- A value of `"true"` or `"false"` determines whether this parameter can
- be omitted by providing `NULL` (for pointers), `VK_NULL_HANDLE` (for
- handles), or 0 (for other scalar types).
- If the parameter is a pointer to one of those types, multiple values may
- be provided, separated by commas - one for each pointer indirection.
- If not present, the value is assumed to be `"false"` (the parameter must
- not be omitted).
-+
---
-[NOTE]
-.Note
-====
-While the attr:optional attribute can be used for scalar types such as
-integers, it does not affect the output generators included with the Vulkan
-Specification.
-In this case, the attribute serves only as an indicator to human readers of
-the XML.
-====
---
- * attr:selector - optional.
- If the parameter is a union, attr:selector identifies another parameter
- of the command that is used to select which of that union's members are
- valid.
- * attr:noautovalidity - prevents automatic validity language being
- generated for the tagged item.
- Only suppresses item-specific validity - parenting issues etc.
- are still captured.
- * attr:externsync - optional.
- A value of `"true"` indicates that this parameter (e.g. the object a
- handle refers to, or the contents of an array a pointer refers to) is
- modified by the command, and is not protected against modification in
- multiple app threads.
- If only certain members of an object or elements of an array are
- modified, multiple strings may be provided, separated by commas.
- Each string describes a member which is modified.
- For example, the `vkQueueSubmit` command includes attr:externsync
- attributes for the `pSubmits` array indicating that only specific
- members of each element of the array are modified:
-+
---
-[source,xml]
---------------------------------------
-<param len="submitCount" externsync="pSubmits[].pWaitSemaphores[],pSubmits[].pSignalSemaphores[]">const <type>VkSubmitInfo</type>* <name>pSubmits</name></param>
---------------------------------------
-
-Parameters which do not have an attr:externsync attribute are assumed to not
-require external synchronization.
---
- * attr:objecttype - only applicable for parameters which are `uint64_t`
- values representing a Vulkan obejct handle.
- Specifies the name of another parameter which must be a `VkObjectType`
- or `VkDebugReportObjectTypeEXT` value specifying the type of object the
- handle refers to.
-
-=== Contents of tag:param tags
-
-The text elements of a tag:param tag, with all other tags removed, is legal
-C code describing the type and name of a function parameter.
-In addition it may contain two semantic tags:
-
- * The tag:type tag is optional, and contains text which is a valid type
- name found in tag:type tag, and indicates that this type must be
- previously defined for the definition of the command to succeed.
- Builtin C types, and any derived types which are expected to be found in
- other header files, should not be wrapped in tag:type tags.
- * The tag:name tag is required, and contains the parameter name being
- described.
-
-== Example of a tag:commands tag
-
-[source,xml]
---------------------------------------
-<commands>
- <command>
- <proto><type>VkResult</type> <name>vkCreateInstance</name></proto>
- <param>const <type>VkInstanceCreateInfo</type>* <name>pCreateInfo</name></param>
- <param><type>VkInstance</type>* <name>pInstance</name></param>
- </command>
-</commands>
---------------------------------------
-
-When processed into a C header, this results in
-
-[source,c]
---------------------------------------
-VkResult vkCreateInstance(
- const VkInstanceCreateInfo* pCreateInfo,
- VkInstance* pInstance);
---------------------------------------
-
-
-[[tag-feature]]
-= API Features and Versions (tag:feature tag)
-
-API features are described in individual tag:feature tags.
-A feature is the set of interfaces (enumerants and commands) defined by a
-particular API and version, such as Vulkan 1.0, and includes all profiles of
-that API and version.
-
-== Attributes of tag:feature tags
-
- * attr:api - required <<schema:apiname, API names>> this feature is
- defined for, such as `vulkan`.
- * attr:name - required.
- Version name, used as the C preprocessor token under which the version's
- interfaces are protected against multiple inclusion.
- Example: `"VK_VERSION_1_0"`.
- * attr:number - required.
- Feature version number, usually a string interpreted as
- `majorNumber.minorNumber`.
- Example: `4.2`.
- * attr:sortorder - optional.
- A decimal number which specifies an order relative to other tag:feature
- tags when calling output generators.
- Defaults to `0`.
- Rarely used, for when ordering by attr:name is insufficient.
- * attr:protect - optional.
- An additional preprocessor token used to protect a feature definition.
- Usually another feature or extension attr:name.
- Rarely used, for odd circumstances where the definition of a feature or
- extension requires another to be defined first.
- * attr:comment - optional.
- Arbitrary string (unused).
-
-[NOTE]
-.Note
-====
-The attr:name attribute used for Vulkan core versions, such as
-`"VK_VERSION_1_0"`, is not an API construct.
-It is used only as a preprocessor guard in the headers, and an asciidoctor
-conditional in the specification sources.
-The similar `"VK_API_VERSION_1_0"` symbols are part of the API and their
-values are packed integers containing Vulkan core version numbers.
-====
-
-== Contents of tag:feature tags
-
-Zero or more <<tag-required,tag:require and tag:remove tags>>, in arbitrary
-order.
-Each tag describes a set of interfaces that is respectively required for, or
-removed from, this feature, as described below.
-
-== Example of a tag:feature tag
-
-[source,xml]
---------------------------------------
-<feature api="vulkan" name="VK_VERSION_1_0" number="1.0">
- <require comment="Header boilerplate">
- <type name="vk_platform"/>
- </require>
- <require comment="API constants">
- <enum name="VK_MAX_PHYSICAL_DEVICE_NAME"/>
- <enum name="VK_LOD_CLAMP_NONE"/>
- </require>
- <require comment="Device initialization">
- <command name="vkCreateInstance"/>
- </require>
-</feature>
---------------------------------------
-
-When processed into a C header for Vulkan, this results in:
-
-[source,c]
---------------------------------------
-#ifndef VK_VERSION_1_0
-#define VK_VERSION_1_0 1
-#define VK_MAX_EXTENSION_NAME 256
-#define VK_LOD_CLAMP_NONE MAX_FLOAT
-typedef VkResult (VKAPI_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance);
-#ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
- const VkInstanceCreateInfo* pCreateInfo,
- VkInstance* pInstance);
-#endif
-#endif /* VK_VERSION_1_0 */
---------------------------------------
-
-
-[[tag-extensions]]
-= Extension Blocks (tag:extensions tag)
-
-The tag:extensions tag contains definitions of each of the extenions which
-are defined for the API.
-
-== Attributes of tag:extensions tags
-
- * attr:comment - optional.
- Arbitrary string (unused).
-
-== Contents of tag:extensions tags
-
-Each tag:extensions block contains zero or more tag:extension tags, each
-describing an API extension, in arbitrary order (although they are typically
-ordered by sorting on the extension name, to improve human readability).
-
-
-[[tag-extension]]
-= API Extensions (tag:extension tag)
-
-API extensions are described in individual tag:extension tags.
-An extension is the set of interfaces defined by a particular API extension
-specification, such as `ARB_multitexture`.
-tag:extension is similar to tag:feature, but instead of having attr:version
-and attr:profile attributes, instead has a attr:supported attribute, which
-describes the set of API names which the extension can potentially be
-implemented against.
-
-== Attributes of tag:extension tags
-
- * attr:name - required.
- Extension name, following the conventions in the Vulkan Specification.
- Example: `name="VK_VERSION_1_0"`.
- * attr:number - required.
- A decimal number which is the registered, unique extension number for
- attr:name.
- * attr:sortorder - optional.
- A decimal number which specifies an order relative to other
- tag:extension tags when calling output generators.
- Defaults to `0`.
- Rarely used, for when ordering by attr:number is insufficient.
- * attr:author - optional.
- The author name, such as a full company name.
- If not present, this can be taken from the corresponding tag:tag
- attribute.
- However, `EXT` and other multi-vendor extensions may not have a
- well-defined author or contact in the tag.
- This attribute is not used in processing the XML.
- It is just metadata, mostly used to track the original author of an
- extension (which may have since been promoted to use a different author
- ID).
- * attr:contact - optional.
- The contact who registered or is currently responsible for extensions
- and layers using the tag, including sufficient contact information to
- reach the contact such as individual name together with Github username
- (`@username`), Khronos internal Gitlab username (`gitlab:@username`) if
- no public Github contact is available, or other contact information.
- If not present, this can be taken from the corresponding tag:tag
- attribute just like attr:author.
- * attr:type - required if the attr:supported attribute is not
- `'disabled'`.
- Must be either `'device'` or `'instance'`, if present.
- * attr:requires - optional.
- Comma-separated list of extension names this extension requires to be
- supported.
- Extensions whose attr:type is `'instance'` must not require extensions
- whose attr:type is `'device'`.
- * attr:requiresCore - optional.
- Core version of Vulkan required by the extension, e.g. "1.1".
- Defaults to "1.0".
- * attr:protect - optional.
- An additional preprocessor token used to protect an extension
- definition.
- Usually another feature or extension attr:name.
- Rarely used, for odd circumstances where the definition of an extension
- requires another extension or a header file to be defined first.
- * attr:platform - optional.
- Indicates that the extension is specific to the platform identified by
- the attribute value, and should be emitted conditional on that platform
- being available, in a platform-specific header, etc.
- The attribute value must be the same as one of the tag:platform tag:name
- attribute values.
- * attr:supported - required <<schema:apiname, API names>> this extension
- is defined for.
- When the extension tag is just reserving an extension number, use
- `supported="disabled"` to indicate this extension should never be
- processed.
- Interfaces defined in a `disabled` extension block are tentative at best
- and must: not be generated or otherwise used by scripts processing the
- XML.
- The only exception to this rule is for scripts used solely for
- reserving, or checking for reserved bitflag values.
- * attr:promotedto - optional.
- A Vulkan version or a name of an extension that this extension was
- _promoted_ to.
- E.g. `"VK_VERSION_1_1"`, or `"VK_KHR_draw_indirect_count"`.
- * attr:deprecatedby - optional.
- A Vulkan version or a name of an extension that _deprecates_ this
- extension.
- It may be an empty string.
- E.g. `"VK_VERSION_1_1"`, or `"VK_EXT_debug_utils"`, or `""`.
- * attr:obsoletedby - optional.
- A Vulkan version or a name of an extension that _obsoletes_ this
- extension.
- It may be an empty string.
- E.g. `"VK_VERSION_1_1"`, or `"VK_KHR_maintenance1"`, or `""`.
- * attr:provisional - optional.
- 'true' if this extension is released provisionally.
- * attr:specialuse - optional.
- If present, must contain one or more tokens separated by commas,
- indicating a special purpose of the extension.
- Tokens may include:
- ** 'cadsupport' - for support of CAD software.
- ** 'd3demulation' - for support of Direct3D emulation layers or libraries,
- or applications porting from Direct3D.
- ** 'debugging' - for debugging an application.
- ** 'devtools' - for support of developer tools, such as capture-replay
- libraries.
- ** 'glemulation' - for support of OpenGL and/or OpenGL ES emulation layers
- or libraries, or applications porting from those APIs.
- * attr:comment - optional.
- Arbitrary string (unused).
-
-
-[NOTE]
-.Note
-====
-The attr:requires attribute is used to specify other extensions that *must*
-be enabled for an extension to be enabled.
-
-In some cases, an extension may include functionality which is only defined
-*if* another extension is enabled.
-Such functionality should be specified within a tag:require, using the
-attr:extension attribute to specify that extension.
-====
-
-== Contents of tag:extension tags
-
-Zero or more <<tag-required,tag:require and tag:remove tags>>, in arbitrary
-order.
-Each tag describes a set of interfaces that is respectively required for, or
-removed from, this extension, as described below.
-
-== Example of an tag:extensions tag
-
-[source,xml]
---------------------------------------
-<extension name="VK_KHR_display_swapchain" number="4" supported="vulkan">
- <require>
- <enum value="9" name="VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION"/>
- <enum value="4" name="VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NUMBER"/>
- <enum value="&quot;VK_KHR_display_swapchain&quot;"
- name="VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME"/>
- <type name="VkDisplayPresentInfoKHR"/>
- <command name="vkCreateSharedSwapchainsKHR"/>
- </require>
-</extension>
---------------------------------------
-
-The attr:supported attribute says that the extension is defined for the
-default profile (`vulkan`).
-When processed into a C header for the `vulkan` profile, this results in
-header contents something like (assuming corresponding definitions of the
-specified tag:type and tag:command elsewhere in the XML):
-
-[source,c]
---------------------------------------
-#define VK_KHR_display_swapchain 1
-#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 9
-#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NUMBER 4
-#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME "VK_KHR_display_swapchain"
-
-typedef struct VkDisplayPresentInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkRect2D srcRect;
- VkRect2D dstRect;
- VkBool32 persistent;
-} VkDisplayPresentInfoKHR;
-
-typedef VkResult (VKAPI_PTR *PFN_vkCreateSharedSwapchainsKHR)(
- VkDevice device, uint32_t swapchainCount,
- const VkSwapchainCreateInfoKHR* pCreateInfos,
- const VkAllocationCallbacks* pAllocator,
- VkSwapchainKHR* pSwapchains);
-
-#ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(
- VkDevice device,
- uint32_t swapchainCount,
- const VkSwapchainCreateInfoKHR* pCreateInfos,
- const VkAllocationCallbacks* pAllocator,
- VkSwapchainKHR* pSwapchains);
-#endif
---------------------------------------
-
-
-[[tag-required]]
-= Required and Removed Interfaces (tag:require and tag:remove tags)
-
-A tag:require block defines a set of interfaces (types, enumerants and
-commands) 'required' by a tag:feature or tag:extension.
-A tag:remove block defines a set of interfaces 'removed' by a tag:feature.
-This is primarily for future profiles of an API which may choose to
-deprecate and/or remove some interfaces.
-Extensions should never remove interfaces, although this usage is allowed by
-the schema).
-Except for the tag name and behavior, the contents of tag:require and
-tag:remove tags are identical.
-
-== Attributes of tag:require and tag:remove tags
-
- * attr:profile - optional.
- String name of an API profile.
- Interfaces in the tag are only required (or removed) if the specified
- profile is being generated.
- If not specified, interfaces are required (or removed) for all API
- profiles.
- * attr:comment - optional.
- Arbitrary string (unused).
- * attr:api - optional <<schema:apiname, API names>> requiring or removing
- these interfaces.
- Interfaces in the tag are only required (or removed) if the requested
- API name matches the attribute.
- If not specified, interfaces are required (or removed) for all APIs.
-
-[NOTE]
-.Note
-====
-The attr:api attribute is only supported inside tag:extension tags, since
-tag:feature tags already define a specific API.
-====
-
-== Attributes of tag:require tags
-
-These attribues are allowed only for a tag:require tag.
-
- * attr:extension - optional, and only for tag:require tags.
- String containing an API extension name.
- Interfaces in the tag are only required if the string matches the
- attr:name of an tag:extension tag, and that extension is enabled.
- * attr:feature - optional, and only for tag:require tags.
- String containing an API feature name.
- Interfaces in the tag are only required if the string matches the
- attr:name of a tag:feature tag, and that feature is enabled.
-
-[NOTE]
-.Note
-====
-The attr:extension attribute currently does not affect output generators in
-any way, and is simply metadata.
-This will be addressed as we better define different types of dependencies
-between extensions.
-====
-
-== Contents of tag:require and tag:remove tags
-
-Zero or more of the following tags, in any order:
-
-=== Comment Tags
-
-<<tag-comment, tag:comment>> (as described above).
-
-=== Command Tags
-
-tag:command specifies an required (or removed) command defined in a
-tag:commands block.
-The tag has no content, but contains attributes:
-
- * attr:name - required.
- Name of the command.
- * attr:comment - optional.
- Arbitrary string (unused).
-
-=== Enum tags
-
-tag:enum specifies an required (or removed) enumerant defined in a tag:enums
-block.
-All forms of this tag support the following attributes:
-
- * attr:name - required.
- Name of the enumerant.
- * attr:comment - optional.
- Arbitrary string (unused).
- * attr:api - optional <<schema:apiname, API names>> for which this
- definition is specialized, so that different APIs may have different
- values for the same token.
- This definition is only used if the requested API name matches the
- attribute.
- May be used to address subtle incompatibilities.
-
-There are two forms of tag:enum tags:
-
-_Reference enums_ simply pull in the definition of an enumerant given in a
-separate tag:enums block.
-No attributes other than attr:name and attr:comment are supported for them.
-tag:enum tags appearing inside tag:remove tags should always be reference
-enums.
-Reference enums may also be used inside tag:require tags, if the
-corresponding value is defined in a tag:enums block.
-This is typically used for constants not part of an enumerated type.
-
-_Extension enums_ define the value of an enumerant inline in an tag:feature
-or tag:extensions block.
-Typically these are used to add additional values specified by an extension
-or core feature to an existing enumerated type.
-There are a variety of attributes which are used to specify the value of the
-enumerant:
-
- * attr:value and attr:type - define a constant value in the same fashion
- as an tag:enum tag in an <<tag-enum,tag:enums>> block.
- * attr:bitpos - define a constant bitmask value in the same fashion as an
- <<tag-enum,tag:enum>> tag in an tag:enums block.
- attr:bitpos is a literal integer bit position in a bitmask.
- The same value and usage constraints apply to this bit position as are
- applied to the <<tag-enum, attr:bitpos attribute of an tag:enum tag.
- * attr:extends - the name of a separately defined enumerated type (e.g. a
- tag:type tag with attr:category``="enum"``) to which the extension
- enumerant is added.
- The enumerated type is required to complete the definition of the
- enumerant, in the same fashion as the attr:requires attribute of a
- tag:type tag.
- If not present, the enumerant is treated as a global constant value.
- * attr:extnumber - an extension number.
- The extension number in turn specifies the starting value of a block
- (range) of values reserved for enumerants defined by or associated with
- the corresponding tag:extension tag with the same attr:number.
- This is used when an extension or core feature needs to extend an
- enumerated type in a block defined by a different extension.
- * Attribute attr:offset - the offset within an extension block.
- If attr:extnumber is not present, the extension number defining that
- block is given by the attr:number attribute of the surrounding
- tag:extension tag.
- The actual numeric value of the enumerant is computed as defined in the
- "`Layers and Extensions`" appendix of the Vulkan Specification.
- * Attribute attr:dir - if present, the calculated enumerant value will be
- negative, instead of positive.
- Negative enumerant values are normally used only for Vulkan error codes.
- The attribute value must be specified as `dir="-"`.
- * attr:alias - the name of another enumerant this is an alias of.
- An enumerant alias is simply a different name for the same enumerant
- value.
- This is typically used when promoting an enumerant defined by an
- extension to a new core version of the API.
- The old extension enumerant is still defined, but as an alias of the new
- core enumerant.
- It may also be used when token names have been changed as a result of
- profile changes, or for consistency purposes.
- * attr:protect - define a preprocessor protection symbol for the enum in
- the same fashion as a tag:enum tag in an <<tag-enum,tag:enums>> block.
-
-Not all combinations of attributes are either meaningful or supported.
-The attr:protect attribute may always be present.
-For other attributes, the allowed combinations are:
-
-.Valid Combinations of attr:enum Attributes for Extension Enums
-|====
-| attr:value | attr:bitpos | attr:alias | attr:offset | attr:extnumber | attr:dir | attr:extends | Description
-| {yes} | {no} | {no} | {no} | {no} | {no} | {opt}^2^ | Numeric value
-| {no} | {yes} | {no} | {no} | {no} | {no} | {opt}^2^ | Bitmask value
-| {no} | {no} | {yes} | {no} | {no} | {no} | {opt}^2^ | Alias of another enumerant
-| {no} | {no} | {no} | {yes} | {opt}^1^ | {opt} | {yes} | Value added to an enumeration
-| {no} | {no} | {no} | {yes} | {opt}^1^ | {opt} | {yes} | Value added to an enumeration
-|====
-
-[1]: If attr:extnumber is not present, the tag:enum tag may only be within a
-tag:extension.
-Otherwise, the tag:enum tag may also be within a tag:feature.
-
-[2]: If attr:extends is not present, the enumerant value is a global
-constant.
-Otherwise, the value is added to the specified enumeration.
-
-Examples of <<tag-required-examples,various types of extension enumerants>>
-are given below.
-
-
-=== Type tags
-
-tag:type specifies a required (or removed) type defined in a tag:types
-block.
-Most types are picked up implicitly by using the tag:type tags of commands,
-but in a few cases, additional types need to be specified explicitly.
-It is unlikely that a type would ever be removed, although this usage is
-allowed by the schema.
-The tag has no content, but contains elements:
-
- * attr:name - required.
- Name of the type.
- * attr:comment - optional.
- Arbitrary string (unused).
-
-
-[[tag-required-examples]]
-== Examples of Extension Enumerants
-
-Examples of some of the supported extension enumerant tag:enum tags are
-given below.
-
-[source,xml]
---------------------------------------
-<extensions>
- <extension name="VK_KHR_test_extension" number="1" supported="vulkan">
- <require>
- <enum value="42" name="VK_KHR_TEST_ANSWER"/>
- <enum bitpos="29" name="VK_KHR_TEST_BITMASK"/>
- <enum offset="0" dir="-" extends="VkResult"
- name="VK_ERROR_SURFACE_LOST_KHR"/>
- <enum offset="1" extends="VkResult"
- name="VK_SUBOPTIMAL_KHR"/>
- <enum bitpos="30" extends="VkCullModeFlagBits"
- name="VK_KHR_TEST_CULL_MODE_BIT"/>
- </require>
- </extension>
-</extensions>
---------------------------------------
-
-The corresponding header file will include definitions like this:
-
-[source,c]
---------------------------------------
-typedef enum VkResult {
- <previously defined VkResult enumerant values},
- VK_ERROR_SURFACE_LOST_KHR = -1000000000,
- VK_SUBOPTIMAL_KHR = 1000000001,
- VK_KHR_EXTENSION_BIT = 0x80000000,
-};
-
-#define VK_KHR_test_extension 1
-#define VK_KHR_theanswer 42
-#define VK_KHR_bitmask 0x20000000
---------------------------------------
-
-
-[[examples]]
-= Examples / FAQ / How Do I?
-
-For people new to the Registry, it will not be immediately obvious how to
-make changes.
-This section includes some tips and examples that will help you make changes
-to the Vulkan headers by changing the Registry XML description.
-
-First, follow the steps described to <<starting,get the Vulkan Github
-repository>> containing the registry and assemble the tools necessary to
-work with the XML registry.
-Once you are able to regenerate the Vulkan headers from `vk.xml`, you can
-start making changes.
-
-
-== General Strategy
-
-If you are _adding_ to the API, perform the following steps to _create_ the
-description of that API element:
-
- * For each type, enum group, compile time constant, and command being
- added, create appropriate new tag:type, tag:enums, tag:enum, or
- tag:command tags defining the interface in question.
- * Make sure that all added types and commands appropriately tag their
- dependencies on other types by adding nested tag:type tags.
- * Make sure that each new tag defines the name of the corresponding type,
- enum group, constant, or command, and that structure/union types and
- commands tag the types and names of all their members and parameters.
- This is essential for the automatic dependency process to work.
-
-If you are _modifying_ existing APIs, just make appropriate changes in the
-existing tags.
-
-Once the definition is added, proceed to the next section to create
-dependencies on the changed feature.
-
-
-== API Feature Dependencies
-
-When you add new API elements, they will not result in corresponding changes
-in the generated header unless they are _required_ by the interface being
-generated.
-This makes it possible to include different API versions and extensions in a
-single registry and pull them out as needed.
-So you must introduce a dependency on new features in the corresponding
-tag:feature tag.
-
-Initially, the only API feature is Vulkan 1.0, so there is only one
-tag:feature tag in `vk.xml`.
-You can find it by searching for the following block of `vk.xml`:
-
-[source,xml]
---------------------------------------
-<comment>
-<feature api="vulkan" name="VK_VERSION_1_0" number="1.0"
- comment="Vulkan core API interface definitions">
---------------------------------------
-
-Inside the tag:feature tag are nested multiple tag:require tags.
-These are just being used as a logical grouping mechanism for related parts
-of Vulkan 1.0 at present, though they may have more meaningful roles in the
-future if different API profiles are defined.
-
-
-=== API Feature Walkthrough
-
-This section walks through the first few required API features in the
-`vk.xml` tag:feature tag, showing how each requirement pulls in type, token,
-and command definitions and turns those into definitions in the C header
-file `vulkan_core.h`.
-
-Consider the first few lines of the tag:feature:
-
-[source,xml]
---------------------------------------
-<require comment="Header boilerplate">
- <type name="vk_platform"/>
-</require>
-<require comment="API constants">
- <enum name="VK_MAX_PHYSICAL_DEVICE_NAME"/>
- <enum name="VK_MAX_EXTENSION_NAME"/>
- ...
-</require>
-<require comment="Device initialization">
- <command name="vkCreateInstance"/>
- ...
---------------------------------------
-
-The first tag:require block says to require a type named `vk_platform`.
-If you look at the beginning of the tag:types section, there is a
-corresponding definition section:
-
-[source,xml]
---------------------------------------
-<type name="vk_platform">#include "vk_platform.h"
-#define VK_MAKE_VERSION(major, minor, patch) \
- ((major &lt;&lt; 22) | (minor &lt;&lt; 12) | patch)
- ...
---------------------------------------
-
-This section is invoked by the requirement and emits a bunch of boilerplate
-C code.
-The explicit dependency is not strictly required since `vk_platform` will be
-required by many other types, but placing it first causes this to appear
-first in the output file.
-
-Note that `vk_platform` does not correspond to an actual C type, but instead
-to a collection of freeform preprocessor includes and macros and comments.
-Most other tag:type tags do define a specific type and are much simpler, but
-this approach can be used to inject arbitrary C into the Vulkan headers
-*when there is no other way*.
-In general inserting arbitrary C is strongly discouraged outside of specific
-special cases like this.
-
-The next tag:require block pulls in some compile time constants.
-These correspond to the definitions found in the first tag:enums section of
-`vk.xml`:
-
-[source,xml]
---------------------------------------
-<enums name="API Constants"
- comment="Vulkan hardcoded constants - not an enumerated type, part of the header boilerplate">
- <enum value="256" name="VK_MAX_PHYSICAL_DEVICE_NAME"/>
- <enum value="256" name="VK_MAX_EXTENSION_NAME"/>
- ...
---------------------------------------
-
-The third tag:require block starts pulling in some Vulkan commands.
-The first command corresponds to the following definition found in the
-tag:commands section of `vk.xml`:
-
-[source,xml]
---------------------------------------
-<commands>
- <command>
- <proto><type>VkResult</type> <name>vkCreateInstance</name></proto>
- <param>const <type>VkInstanceCreateInfo</type>* <name>pCreateInfo</name></param>
- <param><type>VkInstance</type>* <name>pInstance</name></param>
- </command>
- ...
---------------------------------------
-
-In turn, the tag:command tag requires the tag:types `VkResult`,
-`VkInstanceCreateInfo`, and `VkInstance` as part of its definition.
-The definitions of these types are determined as follows:
-
-For `VkResult`, the corresponding required tag:type is:
-
-[source,xml]
---------------------------------------
-<type name="VkResult" category="enum"/>
---------------------------------------
-
-Since this is an enumeration type, it simply links to an tag:enums tag with
-the same name:
-
-[source,xml]
---------------------------------------
-<enums name="VkResult" type="enum" comment="API result codes">
- <comment>Return codes (positive values)</comment>
- <enum value="0" name="VK_SUCCESS"/>
- <enum value="1" name="VK_UNSUPPORTED"/>
- <enum value="2" name="VK_NOT_READY"/>
- ...
- <comment>Error codes (negative values)</comment>
- <enum value="-1" name="VK_ERROR_OUT_OF_HOST_MEMORY" comment="A host memory allocation has failed"/>
- ...
---------------------------------------
-
-For `VkInstanceCreateInfo`, the required tag:type is:
-
-[source,xml]
---------------------------------------
-<type category="struct" name="VkInstanceCreateInfo">
- <member values="VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO"><type>VkStructureType</type> <name>sType</name></member>
- <member>const void* <name>pNext</name></member>
- <member>const <type>VkApplicationInfo</type>* <name>pAppInfo</name></member>
- <member>const <type>VkAllocCallbacks</type>* <name>pAllocCb</name></member>
- <member><type>uint32_t</type> <name>extensionCount</name></member>
- <member>const <type>char</type>*const* <name>ppEnabledExtensionNames</name></member>
-</type>
---------------------------------------
-
-This is a structure type, defining a C `struct` with all the members defined
-in each tag:member tag in order.
-In addition, it requires some other types, whose definitions are located by
-name in exactly the same fashion.
-
-For the final direct dependency of the command, `VkInstance`, the required
-tag:type is:
-
-[source,xml]
---------------------------------------
- <comment>Types which can be void pointers or class pointers, selected at compile time</comment>
-<type>VK_DEFINE_BASE_HANDLE(<name>VkObject</name>)</type>
-<type>VK_DEFINE_DISP_SUBCLASS_HANDLE(<name>VkInstance</name>, <type>VkObject</type>)</type>
---------------------------------------
-
-In this case, the type `VkInstance` is defined by a special compile time
-macro which defines it as a derived class of `VkObject` (for `C```) or a
-less typesafe definition (for C).
-This macro is not part of the type dependency analysis, just the boilerplate
-used in the header.
-
-If these are the only tag:feature dependencies in `vk.xml`, the resulting
-`vulkan_core.h` header will look like this:
-
-[source,c]
---------------------------------------
-#ifndef VULKAN_H_
-#define VULKAN_H_ 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-** Copyright 2015-2021 The Khronos Group Inc.
- ...
-*/
-
-/*
-** This header is generated from the Khronos Vulkan XML API Registry.
-**
-** Generated on date 20170208
-*/
-
-
-#define VK_VERSION_1_0 1
-#include "vk_platform.h"
-#define VK_MAKE_VERSION(major, minor, patch) \
- ((major << 22) | (minor << 12) | patch)
-
-// Vulkan API version supported by this file
-#define VK_API_VERSION VK_MAKE_VERSION(0, 104, 0)
-
-#if defined (__cplusplus) && (VK_UINTPTRLEAST64_MAX == UINTPTR_MAX)
- #define VK_TYPE_SAFE_COMPATIBLE_HANDLES 1
-#endif
-
-#if defined(VK_TYPE_SAFE_COMPATIBLE_HANDLES) && !defined(VK_DISABLE_TYPE_SAFE_HANDLES)
- #define VK_DEFINE_PTR_HANDLE(_obj) struct _obj##_T { char _placeholder; }; typedef _obj##_T* _obj;
- #define VK_DEFINE_PTR_SUBCLASS_HANDLE(_obj, _base) struct _obj##_T : public _base##_T {}; typedef _obj##_T* _obj;
-
- #define VK_DEFINE_BASE_HANDLE(_obj) VK_DEFINE_PTR_HANDLE(_obj)
- #define VK_DEFINE_DISP_SUBCLASS_HANDLE(_obj, _base) VK_DEFINE_PTR_SUBCLASS_HANDLE(_obj, _base)
- #define VK_DEFINE_NONDISP_SUBCLASS_HANDLE(_obj, _base) VK_DEFINE_PTR_SUBCLASS_HANDLE(_obj, _base)
-#else
- #define VK_DEFINE_BASE_HANDLE(_obj) typedef VkUintPtrLeast64 _obj;
- #define VK_DEFINE_DISP_SUBCLASS_HANDLE(_obj, _base) typedef uintptr_t _obj;
- #define VK_DEFINE_NONDISP_SUBCLASS_HANDLE(_obj, _base) typedef VkUintPtrLeast64 _obj;
-#endif
-
-typedef enum {
- VK_SUCCESS = 0,
- VK_UNSUPPORTED = 1,
- VK_NOT_READY = 2,
- ...
-} VkResult;
-typedef enum {
- VK_STRUCTURE_TYPE_APPLICATION_INFO = 0,
- ...
-} VKStructureType;
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- const char* pAppName;
- uint32_t appVersion;
- const char* pEngineName;
- uint32_t engineVersion;
- uint32_t apiVersion;
-} VkApplicationInfo;
-typedef enum {
- VK_SYSTEM_ALLOC_TYPE_API_OBJECT = 0,
- ...
-} VkSystemAllocType;
-typedef void* (VKAPI_PTR *PFN_vkAllocFunction)(
- void* pUserData,
- size_t size,
- size_t alignment,
- VkSystemAllocType allocType);
-typedef void (VKAPI_PTR *PFN_vkFreeFunction)(
- void* pUserData,
- void* pMem);
-typedef struct {
- void* pUserData;
- PFN_vkAllocFunction pfnAlloc;
- PFN_vkFreeFunction pfnFree;
-} VkAllocCallbacks;
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- const VkApplicationInfo* pAppInfo;
- const VkAllocCallbacks* pAllocCb;
- uint32_t extensionCount;
- const char*const* ppEnabledExtensionNames;
-} VkInstanceCreateInfo;
-VK_DEFINE_BASE_HANDLE(VkObject)
-VK_DEFINE_DISP_SUBCLASS_HANDLE(VkInstance, VkObject)
-#define VK_MAX_PHYSICAL_DEVICE_NAME 256
-#define VK_MAX_EXTENSION_NAME 256
-typedef VkResult (VKAPI_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance);
-#ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
- const VkInstanceCreateInfo* pCreateInfo,
- VkInstance* pInstance);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
---------------------------------------
-
-Note that several additional types are pulled in by the type dependency
-analysis, but only those types, commands, and tokens required by the
-specified features are generated.
-
-
-[[compile-time-constants]]
-== How To Add A Compile Time Constant
-
-Go to the desired tag:feature or tag:extension tag.
-Add (if not present) a nested tag:require block labelled
-
-[source,xml]
---------------------------------------
-<require comment="API constants">
---------------------------------------
-
-In this block, add an (appropriately indented) tag like
-
-[source,xml]
---------------------------------------
- <enum name="VK_THE_ANSWER"/>
---------------------------------------
-
-Then go to the tag:enums block labelled
-
-[source,xml]
---------------------------------------
-<enums comment="Misc. hardcoded constants - not an enumerated type">
---------------------------------------
-
-In this block, add a tag whose attr:name attribute matches the attr:name you
-defined above and whose attr:value attribute is the value to give the
-constant:
-
-[source,xml]
---------------------------------------
- <enum value="42" type="uint32_t" name="VK_THE_ANSWER"/>
---------------------------------------
-
-The attr:type attribute must be present, and must have one of the allowed
-values `uint32_t`, `uint64_t`, or `float`.
-
-
-[[compile-time-constants-format]]
-== Allowed Format of Compile Time Constants
-
-The attr:value attribute must be a legal C99 constant scalar expression when
-evaluated at compilation time.
-Allowed expressions are additionally restricted to the following syntax:
-
- * a single C decimal integer or floating-point value
- * optionally prefixed with `~`
- * optionally suffixed with `U`, `UL`, `ULL`, or `F`
- * and the entire expression optionally surrounded by paired `(` and `)`.
-
-
-== How To Add A Struct or Union Type
-
-For this example, assume we want to define a type corresponding to a C
-`struct` defined as follows:
-
-[source,c]
---------------------------------------
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- const VkApplicationInfo* pAppInfo;
- const VkAllocCallbacks* pAllocCb;
- uint32_t extensionCount;
- const char*const* ppEnabledExtensionNames;
-} VkInstanceCreateInfo;
---------------------------------------
-
-If `VkInstanceCreateInfo` is the type of a parameter of a command in the
-API, make sure that command's definition (see below for how to add a
-command) puts `VkInstanceCreateInfo` in nested tag:type tags where it is
-used.
-
-Otherwise, if the struct type is not used directly by a command in the API,
-nor required by a chain of type dependencies for other commands, an explicit
-tag:type dependency should be added to the tag:feature tag.
-Go to the tag:types tag and search for the nested block labelled
-
-[source,xml]
---------------------------------------
-<require comment="Types not directly used by the API. Include e.g. structs that are not parameter types of commands, but still defined by the API.">
- ...
---------------------------------------
-
-In this block, add a tag whose attr:name attribute matches the attr:name of
-the struct type being defined:
-
-[source,xml]
---------------------------------------
-<require comment="API types not used by commands">
- <type name="VkInstanceCreateInfo"/>
- ...
---------------------------------------
-
-Then go to the tag:types tag and add a new tag:type tag defining the struct
-names and members, somewhere below the corresponding comment, like this:
-
-[source,xml]
---------------------------------------
-<types>
- ...
- <comment>Struct types</comment>
- <type category="struct" name="VkInstanceCreateInfo">
- <member><type>VkStructureType</type>
- <name>sType</name></member>
- <member>const void*
- <name>pNext</name></member>
- <member>const <type>VkApplicationInfo</type>*
- <name>pAppInfo</name></member>
- <member>const <type>VkAllocCallbacks</type>*
- <name>pAllocCb</name></member>
- <member><type>uint32_t</type>
- <name>extensionCount</name></member>
- <member>const <type>char</type>*const*
- <name>ppEnabledExtensionNames</name></member>
- </type>
- ...
---------------------------------------
-
-If any of the member types are types also defined in the header, make sure
-to enclose those type names in nested tag:type tags, as shown above.
-Basic C types should not be tagged.
-
-If the type is a C `union`, rather than a `struct`, then set the value of
-the attr:category attribute to `"union"` instead of `"struct"`.
-
-
-== How To Add An Enumerated Type
-
-For this example, assume we want to define a type corresponding to a C
-`enum` defined as follows:
-
-[source,c]
---------------------------------------
-typedef enum {
- VK_DEVICE_CREATE_VALIDATION_BIT = 0x00000001,
- VK_DEVICE_CREATE_MULTI_DEVICE_IQ_MATCH_BIT = 0x00000002;
-} VkDeviceCreateFlagBits.
---------------------------------------
-
-If `VkDeviceCreateFlagBits` is the type of a parameter to a command in the
-API, or of a member in a structure or union, make sure that command
-parameter or struct member's definition puts `VkDeviceCreateFlagBits` in
-nested tag:type tags where it is used.
-
-Otherwise, if the enumerated type is not used directly by a command in the
-API, nor required by a chain of type dependencies for commands and structs,
-an explicit tag:type dependency should be added to the tag:feature tag in
-exactly the same fashion as described above for `struct` types.
-
-Next, go to the line labelled
-
-[source,xml]
---------------------------------------
-<comment>Vulkan enumerant (token) definitions</comment>
---------------------------------------
-
-At an appropriate point below this line, add an tag:enums tag whose
-attr:name attribute matches the tag:type name `VkDeviceCreateFlagBits`, and
-whose contents correspond to the individual fields of the enumerated type:
-
-[source,xml]
---------------------------------------
-<enums name="VkDeviceCreateFlagBits" type="bitmask">
- <enum bitpos="0" name="VK_DEVICE_CREATE_VALIDATION_BIT"/>
- <enum bitpos="1" name="VK_DEVICE_CREATE_MULTI_DEVICE_IQ_MATCH_BIT"/>
-</enums>
---------------------------------------
-
-Several other attributes of the tag:enums tag can be set.
-In this case, the attr:type attribute is set to `"bitmask"`, indicating that
-the individual enumerants represent elements of a bitmask.
-
-The individual tag:enum tags define the enumerants, just like the definition
-for compile time constants described above.
-In this case, because the enumerants are bits in a bitmask, their values are
-specified using the attr:bitpos attribute.
-The value of this attribute must be an integer in the range [0,30]
-specifying a single bit number, and the resulting value is printed as a
-hexadecimal constant corresponding to that bit.
-
-It is also possible to specify enumerant values using the attr:value
-attribute, in which case the specified numeric value is passed through to
-the C header unchanged.
-
-
-[[adding-bitflags]]
-== How To Add Bit Flags
-
-Bit masks are defined by two types in the xml - the type of the mask itself,
-and the type of the valid flags.
-
-For this example, assume we want to define bit flags that can handle up to
-64 independent values as follows:
-
-[source,c]
---------------------------------------
-// Flag bits for VkExampleFlagBits
-typedef VkFlags64 VkExampleFlagBits;
-static const VkExampleFlagBits VK_EXAMPLE_NONE = 0;
-static const VkExampleFlagBits VK_EXAMPLE_FIRST_BIT = 0x00000001;
-static const VkExampleFlagBits VK_EXAMPLE_SECOND_BIT = 0x00000002;
-
-typedef VkFlags64 VkExampleFlags;
---------------------------------------
-
-An explicit tag:type dependency should be added to the tag:feature tag in
-exactly the same fashion as described above for `struct` types.
-
-Firstly, a definition is needed for the flags type used as a parameter to
-commands or member of functions.
-Go to the line labelled:
-
-[source,xml]
---------------------------------------
-<comment>Bitmask types</comment>
---------------------------------------
-
-At the end of the list of `VkFlags` and `VkFlags64` types, add a definition
-of the flags type like so:
-
-[source,xml]
---------------------------------------
-<type bitvalues="VkExampleFlagBits" category="bitmask">typedef <type>VkFlags64</type> <name>VkExampleFlags</name>;</type>
---------------------------------------
-
-The attr:category defines this as a `"bitmask"` type.
-The attr:bitvalues attribute identifies the `*FlagBits` entry defining the
-flag bits associated with this type.
-
-Next, go to the line labelled:
-
-[source,xml]
---------------------------------------
-<comment>Types generated from corresponding enums tags below</comment>
---------------------------------------
-
-At an appropriate point in the list of enum types after this comment, add
-the following line:
-
-[source,xml]
---------------------------------------
-<type name="VkExampleFlagBits" category="enum"/>
---------------------------------------
-
-This defines a type for the flag bits for generators that need it.
-The attr:category attribute of `"enum"` identifies that this is an
-enumerated type.
-
-Finally, go to the line labelled:
-
-[source,xml]
---------------------------------------
-<comment>Vulkan enumerant (token) definitions</comment>
---------------------------------------
-
-At the end of the list of enum definitions below this line, add an tag:enums
-tag whose attr:name attribute matches the tag:type name `VkExampleFlagBits`,
-and whose contents correspond to the individual fields of the enumerated
-type:
-
-[source,xml]
---------------------------------------
-<enums name="VkExampleFlagBits" type="bitmask" bitwidth="64">
- <enum value="0" name="VK_EXAMPLE_NONE"/>
- <enum bitpos="0" name="VK_EXAMPLE_FIRST_BIT"/>
- <enum bitpos="1" name="VK_EXAMPLE_SECOND_BIT"/>
-</enums>
---------------------------------------
-
-The attr:type attribute is set to `"bitmask"`, indicating that the
-individual enumerants represent elements of a bitmask.
-The attr:bitwidth attribute is set to `"64"` indicating that this is a
-64-bit flag type.
-
-The individual tag:enum tags define the enumerants, just like the definition
-for compile time constants described above.
-In this case, a "no flags" type is defined in `VK_EXAMPLE_NONE` with the
-attr:value attribute defining it to have a hard value of 0.
-The other types have their values are specified using the attr:bitpos
-attribute, as these are actual bit flag values.
-The value of this attribute must be an integer in the range [0,63]
-specifying a single bit number, and the resulting value is printed as a
-hexadecimal constant corresponding to that bit.
-
-
-=== 32-bit Flags
-
-Bit flags can also be defined using 32-bit C enum types.
-Doing so is broadly similar to 64-bit bit flags, but with a few key
-differences.
-For this example, assume we want to define the same type as above, but
-corresponding to a C `enum` and flags type defined as follows:
-
-[source,c]
---------------------------------------
-typedef enum VkExampleFlagBits {
- VK_EXAMPLE_NONE
- VK_DEVICE_CREATE_VALIDATION_BIT = 0x00000001,
- VK_DEVICE_CREATE_MULTI_DEVICE_IQ_MATCH_BIT = 0x00000002;
-} VkExampleFlagBits;
-
-typedef VkFlags VkExampleFlags;
---------------------------------------
-
-To add this to the xml, entries need to be added to the XML in the same way
-as above, but with slightly different attributes:
-
-For the flag type definition, the entry should use `VkFlags` instead of
-`VkFlags64`, and require the flag bits type, instead of specifying the
-attr:bitvalues attribute:
-
-[source,xml]
---------------------------------------
-<type requires="VkExampleFlagBits" category="bitmask">typedef <type>VkFlags</type> <name>VkExampleFlags</name>;</type>
---------------------------------------
-
-For the definition of the enumerated flag values themselves, the bitwidth
-needs to either be changed to `"32"`, or omitted entirely (which defaults to
-a bitwidth of 32) as follows:
-
-[source,xml]
---------------------------------------
-<enums name="VkExampleFlagBits" type="bitmask">
---------------------------------------
-
-Note that 32-bit bitmasks must use an integer in the range [0,30] - C enums
-are only guaranteed to support signed 32-bit integer values, and defining an
-unsigned value for the 31st bit could change the size of the enum type.
-The generator scripts will warn about values exceeding this range.
-
-
-== How to Add A Command
-
-For this example, assume we want to define the command:
-
-[source,c]
---------------------------------------
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
- const VkInstanceCreateInfo* pCreateInfo,
- VkInstance* pInstance);
---------------------------------------
-
-Commands must always be explicitly required in the tag:feature tag.
-In that tag, you can use an existing tag:require block including API
-features which the new command should be grouped with, or define a new
-block.
-For this example, add a new block, and require the command by using the
-tag:command tag inside that block:
-
-[source,xml]
---------------------------------------
-<feature api="vulkan" name="VK_VERSION_1_0" number="1.0" comment="Vulkan core API interface definitions">
- ...
- <require comment="Device initialization">
- <command name="vkCreateInstance"/>
- </require>
- ...
-</feature>
---------------------------------------
-
-The tag:require block may include a attr:comment attribute whose value is a
-descriptive comment of the contents required within that block.
-The comment is not currently used in header generation, but might be in the
-future, so use comments which are polite and meaningful to users of the
-generated header files.
-
-Then go to the tag:commands tag and add a new tag:command tag defining the
-command, preferably sorted into alphabetic order with other commands for
-ease of reading, as follows:
-
-[source,xml]
---------------------------------------
-<commands comment="Vulkan command definitions">
- ...
- <command>
- <proto><type>VkResult</type>
- <name>vkCreateInstance</name></proto>
- <param>const <type>VkInstanceCreateInfo</type>*
- <name>pCreateInfo</name></param>
- <param><type>VkInstance</type>*
- <name>pInstance</name></param>
- </command>
- ...
-</commands>
---------------------------------------
-
-The tag:proto tag defines the return type and function name of the command.
-The tag:param tags define the command's parameters in the order in which
-they are passed, including the parameter type and name.
-The contents are laid out in the same way as the structure tag:member tags
-described previously.
-
-
-== More Complicated API Representations
-
-The registry schema can represent a good deal of additional information, for
-example by creating multiple tag:feature tags defining different API
-versions and extensions.
-This capability is not yet relevant to Vulkan.
-Those capabilities will be documented as they are needed.
-
-
-== More Complicated Output Formats And Other Languages
-
-The registry schema is oriented towards C-language APIs.
-Types and commands are defined using syntax which is a subset of C,
-especially for structure members and command parameters.
-It would be possible to use a language-independent syntax for representing
-such information, but since we are writing a C API, any such representation
-would have to be converted into C anyway at some stage.
-
-The `vulkan.h` header is written using an _output generator_ object in the
-Python scripts.
-This output generator is specialized for C, but the design of the scripts is
-intended to support writing output generators for other languages as well as
-purposes such as documentation (e.g. generating asciidoc fragments
-corresponding to types and commands for use in the API specification and
-reference pages).
-When targeting other languages, the amount of parsing required to convert
-type declarations into other languages is small.
-However, it will probably be necessary to modify some of the boilerplate C
-text, or specialize the tags by language, to support such generators.
-
-
-== Additional Semantic Tagging
-
-The schema is being extended to support semantic tags describing various
-properties of API features, such as:
-
- * constraints on allowed scalar values to function parameters (non-`NULL`,
- normalized floating-point, etc.)
- * length of arrays corresponding to function pointer parameters
- * miscellaneous properties of commands such as whether the application or
- system is responsible for threadsafe use; which queues they may be
- issued on; whether they are aliases or otherwise related to other
- commands; etc.
-
-These tags will be used by other tools for purposes such as helping create
-validation layers, generating serialization code, and so on.
-We would like to eventually represent everything about the API that is
-amenable to automatic processing within the registry schema.
-Please make suggestions on the Github issue tracker.
-
-
-[[general:stability]]
-== Stability of the XML Database and Schema
-
-The Vulkan XML schema is evolving in response to corresponding changes in
-the Vulkan API and ecosystem.
-Most such change will probably be confined to adding attributes to existing
-tags and properly expressing the relationships to them, and making API
-changes corresponding to accepted feature requests.
-Changes to the schema should be described in the <<changelog,change log>> of
-this document.
-Changes to the `.xml` files and Python scripts are logged in Github history.
-
-
-[[changelog]]
-= Change Log
-
- * 2021-08-22 - Update introductory descriptions of toolchain and scripts.
- * 2021-08-15 - Add an explicit description of the tag:enum attr:extends
- attribute as introducing a requirement for the enumerated type being
- extended.
- * 2021-07-12 - Note that tag:extension tags describing instance extensions
- must not have dependencies on device extensions (internal issue 2387).
- * 2021-06-14 - Add an `objecttype` attribute which specifies the
- relationship between a Vulkan handle and another member or parameter
- specifying the type of object that handle refers to (public issue 1536).
- * 2021-06-06 - Update description of the attr:supported attribute of
- <<tag-extension, tag:extension tags>> to mandate that `disabled`
- extensions are not processed (public issue 1549).
- * 2021-04-21 - Add the attr:limittype attribute to <<tag-type, structure
- tag:member tags>>, to describe how queried limits are interpreted
- (internal issue 2427).
- * 2021-03-30 - Add a description of the <<compile-time-constants-format,
- allowed format of compile time constants>> (internal merge request
- 4451).
- * 2021-03-22 - Update allowed values for the attr:type attribute of
- tag:enum tags and make it mandatory (internal issue 2564).
- * 2021-01-11 - Expand the scope of the attr:optional attribute tag:member
- and tag:param tags to specify that the member or parameter may be 0 for
- all scalar types, not just bitmasks and array sizes (internal issue
- 2435).
- * 2020-11-23 - Add `objtypeenum` attribute to <<tag:type, tag:type>> tags
- to link the object name to the corresponding `VK_OBJECT_TYPE_*`
- enumerant, if any (internal issue 2393).
- * 2020-11-22 - Add requirement that `pNext` members have the
- `optional="true"` attribute set (internal issue 2428).
- * 2020-10-14 - Remove advice to set the attr:noautovalidity attribute on
- the `pNext` member of extending structures in the <<tag:type, tag:type
- tag>>, since the validity generator scripts now take care of this
- (internal issue 2335).
- * 2020-06-02 - Add description of how to switch between 64- and 32-bit
- flags.
- * 2020-05-07 - Update description of <<schema:apiname, API Names>> to
- current usage, including allowing specifying multiple API names for a
- given feature or extension.
- * 2020-04-29 - Expand use of attr:category `basetype` in tag:type tags to
- include external API types.
- * 2020-02-20 - Clarify that tag:enum tags inside tag:remove tags must be
- reference enums, not containing attributes defining values.
- * 2020-01-13 - Restrict attr:bitpos to [0,30] to avoid poorly defined
- compiler behavior.
- * 2019-08-25 - Add attr:sortorder attribute to tag:feature and
- tag:extension tags.
- * 2018-12-06 - Specify that command aliases are not guaranteed to resolve
- to the same entry point in the underlying layer stack, matching a
- related clarification in the Vulkan Specification.
- * 2018-10-01 - Add description of the default value of attr:optional
- member and parameter attributes, if not specified.
- * 2018-08-28 - Add optional attr:provisional attribute to tag:extension
- tags.
- * 2018-07-07 - Add optional attr:promotedto, attr:deprecatedby, and
- attr:obsoletedby attributes to tag:extension tags.
- * 2018-06-25 - Remove attr:vendorids tags for Khronos vendor IDs.
- * 2018-05-08 - Add tag:driverids and tag:driverid tags for describing
- Vulkan driver implementation identification information.
- * 2018-04-15 - Add attr:requiresCore.
- * 2018-03-07 - Updated for Vulkan 1.1 release.
- * 2018-02-21 - Add descriptions of the attr:extnumber and attr:alias
- attributes used for defining tag:enum attributes, the attr:alias
- attribute used for defining tag:type aliases, the attr:name and
- attr:alias attributes used for defining tag:command aliases, the
- attr:platform attribute of tag:extension tags, and the attr:feature
- attribute of tag:require tags; and update the document to the header
- naming and grouping scheme used starting in Vulkan 1.1.
- * 2018-01-07 - Add tag:platforms and tag:platform tags for describing
- Vulkan platform names and preprocessor symbols.
- * 2017-09-10 - Define syntax of member and parameter attr:altlen
- attributes, for use by code generators.
- * 2017-09-01 - Define syntax of member and parameter attr:len attributes
- consistently and correctly for current uses of latexmath:
- * 2017-08-24 - Note that the tag:extension attribute attr:type must be
- specified if the extension is not disabled.
- * 2017-07-27 - Finish removing validextensionstructs attribute and
- replacing it with structextends.
- * 2017-07-14 - Add comment attributes or tags as valid content in several
- places, replacing XML comments which could not be preserved by XML
- transformation tools.
- * 2017-02-20 - Change to asciidoctor markup and move into the
- specification source directory for ease of building.
- * 2016-09-27 - Remove tag:validity and tag:usage tags, since these
- explicit usage statements have been moved to the specification source.
- * 2016-08-26 - Update for the single-branch model.
- * 2016-07-28 - Add attr:type and attr:requires attributes to tag:extension
- tags.
- * 2016-02-22 - Change math markup in attr:len attributes to use asciidoc
- `latexmath:[$` and `$]` delimiters.
- * 2016-02-19 - Add attr:successcodes and attr:errorcodes attributes of
- tag:command tags.
- Add a subsection to the introduction describing the schema choices and
- how to file issues against the registry.
- * 2016-02-07 - Add attr:vendorids tags for Khronos vendor IDs.
- * 2015-12-10 - Add attr:author and attr:contact attributes for
- tag:extension tags.
- * 2015-12-07 - Move `vulkan/vulkan.h` to a subdirectory.
- * 2015-12-01 - Add tag:tags tags for author tags.
- * 2015-11-18 - Bring documentation and schema up to date for extension
- enumerants.
- * 2015-11-02 - Bring documentation and schema up to date with several
- recent merges, including tag:validity tags.
- Still out of date WRT extension enumerants, but that will change soon.
- * 2015-09-08 - Rename `threadsafe` attribute to attr:externsync, and
- `implicitunsafeparams` tag to attr:implicitexternsync.
- * 2015-09-07 - Update tag:command tag description to remove the
- attr:threadsafe attribute and replace it with a combination of
- attr:threadunsafe attributes on individual parameters, and
- tag:implicitunsafeparams tags describing additional unsafe objects for
- the command.
- * 2015-08-04 - Add `basetype` and `funcpointer` attr:category values for
- type tags, and explain the intended use and order in which types in each
- category are emitted.
- * 2015-07-02 - Update description of Makefile targets.
- Add descriptions of attr:threadsafe, attr:queues, and attr:renderpass
- attributes of <<tag-command,tag:command>> tags, and of attr:modified
- attributes of <<tag-command:param,tag:param>> tags.
- * 2015-06-17 - add descriptions of allowed attr:category attribute values
- of tag:type tags, used to group and sort related categories of
- declarations together in the generated header.
- * 2015-06-04 - Add <<examples,examples of making changes and additions>>
- to the registry.
- * 2015-06-03 - Move location to new `vulkan` Git repository.
- Add definition of tag:type tags for C struct/unions.
- Start adding <<examples,examples of making changes>>.
- * 2015-06-02 - Branch from OpenGL specfile documentation and bring up to
- date with current Vulkan schema.
- * 2015-07-10 - Remove contractions to match the style guide.
- * 2015-07-19 - Move this document from LaTeX to asciidoc source format and
- make minor changes to markup.