diff options
Diffstat (limited to 'codegen/vulkan/registry.txt')
-rw-r--r-- | codegen/vulkan/registry.txt | 2575 |
1 files changed, 2575 insertions, 0 deletions
diff --git a/codegen/vulkan/registry.txt b/codegen/vulkan/registry.txt new file mode 100644 index 00000000..baa49141 --- /dev/null +++ b/codegen/vulkan/registry.txt @@ -0,0 +1,2575 @@ +// 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 <stddef.h></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=""VK_KHR_display_swapchain"" + 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 << 22) | (minor << 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. |