| // Copyright 2013-2023 The Khronos Group Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| // Core versions and extensions to enable |
| // Must be included before the header and attribs.adoc |
| include::{generated}/specattribs.adoc[] |
| |
| = 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" |
| :attribute-missing: warn |
| :cl: : |
| |
| // Various special / math symbols. This is easier to edit with than Unicode. |
| include::{config}/attribs.adoc[] |
| |
| :leveloffset: 1 |
| |
| <<<< |
| |
| include::{config}/copyright-ccby.adoc[] |
| |
| <<<< |
| |
| [[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. |
| |
| |
| [[introduction-normative]] |
| == Normative References |
| |
| Normative references are references to external documents or resources to |
| which documentation authors must comply. |
| |
| [[vulkan-styleguide]] Jon Leech and Tobias Hector. |
| _Vulkan Documentation and Extensions: Procedures and Conventions_ (February |
| 26, 2023). |
| https://registry.khronos.org/vulkan/specs/1.3/styleguide.html . |
| |
| [[vulkan-spec]] Khronos Vulkan Working Group. |
| _Vulkan 1.3.242 - A Specification_ (February 26, 2023). |
| https://registry.khronos.org/vulkan/ . |
| |
| |
| [[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 <<vulkan-spec, Vulkan API |
| 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-spec, Vulkan API 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-formats,tag:formats>> - defines properties of image formats. |
| Only one tag is used, wrapping all the formats. |
| * <<tag-spirvextensions,tag:spirvextensions>> - defines relationship |
| between SPIR-V extensions and API interfaces which enable each |
| extension. |
| Only one tag is used, wrapping all the SPIR-V extensions. |
| * <<tag-spirvcapabilities,tag:spirvcapabilities>> - defines relationship |
| between SPIR-V capabilities and API interfaces which enable each |
| capability. |
| Only one tag is used, wrapping all the SPIR-V capabilities. |
| * <<tag-sync,tag:sync>> - Defines sync objects |
| * <<tag-syncstage,tag::syncstage>> - Defines all Pipeline Stages |
| * <<tag-syncaccess,tag::syncaccess>> - Defines all Access Types |
| * <<tag-syncpipeline,tag::syncpipeline>> - Defines Pipeline's logical ordering |
| |
| |
| [[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 comma-separated list of <<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:deprecated - optional. |
| Indicates that this type has been deprecated. |
| Possible values are: |
| ** `"true"` - deprecated, but no explanation given. |
| ** `"aliased"` - an old name not following Vulkan conventions. |
| The equivalent alias following Vulkan conventions should be used |
| instead. |
| * 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: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: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:deprecated - optional. |
| Indicates that this member has been deprecated. |
| Possible values are: |
| ** `"true"` - deprecated, but no explanation given. |
| ** `"ignored"` - functionality described by this member no longer |
| operates. |
| * attr:externsync - denotes that the member should be externally |
| synchronized when accessed by Vulkan |
| * attr:optional - optional. |
| A value of `"true"` specifies that this member can be omitted by |
| providing `NULL` (for pointers), `VK_NULL_HANDLE` (for handles), or 0 |
| (for other scalar types). |
| If not present, the value is assumed to be `"false"` (the member must |
| not be omitted). |
| If the member is a pointer to one of those types, multiple values may be |
| provided, separated by commas - one for each pointer indirection. |
| 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-spec, Vulkan API Specification>>. |
| In this case, the attribute serves only as an indicator to human readers of |
| the XML. |
| |
| Explicitly specifying `optional="false"` is not supported, but |
| `optional="false,true"` is supported for a pointer type. |
| ==== |
| -- |
| * 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 |
| `VkFormatProperties`, `VkFormatProperties2`, |
| `VkPhysicalDeviceProperties`, `VkPhysicalDeviceProperties2`, |
| `VkPhysicalDeviceLimits`, `VkQueueFamilyProperties`, |
| `VkQueueFamilyProperties2`, `VkSparseImageFormatProperties`, |
| `VkSparseImageFormatProperties2`, and structures extending or members of |
| any of those structures. |
| 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`. |
| ** `"pot"` denotes a value that has to be a power of two value. |
| They may also apply to arrays and `VkExtent*D`. |
| ** `"mul"` denotes a value that must be an integer multiple of this limit. |
| They may also apply to arrays and `VkExtent*D`. |
| ** `"bits"` corresponds to the bits precision of an implementation. |
| ** `"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. |
| ** `"exact"` specifies a limit that must be a specific value. |
| ** `"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 object handle. |
| Specifies the name of another member which must be a `VkObjectType` or |
| `VkDebugReportObjectTypeEXT` value specifying the type of object the |
| handle refers to. |
| * attr:stride - if the member is an array, stride specifies the name of |
| another member containing the byte stride between consecutive elements |
| in the array. Is assumed tightly packed if omitted. |
| |
| |
| ==== 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: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 comma-separated list of <<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:deprecated - optional. |
| Indicates that this enum has been deprecated. |
| Possible values are: |
| ** `"true"` - deprecated, but no explanation given. |
| ** `"ignored"` - functionality described by this enum no longer operates. |
| ** `"aliased"` - an old name not following Vulkan conventions. |
| The equivalent alias following Vulkan conventions should be used |
| instead. |
| * 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 |
| ==== |
| Using attr:alias on a tag:enum means you want the attr:name defined by the |
| tag to be treated as an alias of the token name in the attr:alias attribute |
| value. |
| For example, the following tag defines `VK_ALIAS` as an alias of `VK_VALUE`: |
| |
| [source,xml] |
| -------------------------------------- |
| <enum name="VK_ALIAS" alias="VK_VALUE"> |
| -------------------------------------- |
| ==== |
| |
| [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:tasks - optional. |
| A string identifying the tasks this command performs, as described in |
| the "`Queue Operation`" section of the <<vulkan-spec, Vulkan API |
| Specification>>. |
| The format of the string is one or more of the terms `"action"`, |
| `"synchronization"`, `"state"`, and `"indirection"`, with multiple terms |
| separated by commas (`","`). |
| * 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"`, |
| `"decode"`, `"encode"`, `"graphics"`, `"transfer"`, `"sparse_binding"`, |
| and `"opticalflow"`, 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:videocoding - optional. |
| A string identifying whether the command can be issued only inside a |
| video coding scope (`"inside"`), only outside a video coding scope |
| (`"outside"`), or both (`"both"`); the default is `"outside"` for |
| commands that do not specify it. |
| * 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. |
| |
| Both forms of tag:command support these options: |
| |
| * 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. |
| |
| == 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 `vkGetInstanceProcAddr` |
| or `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: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: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"` specifies that this parameter can be omitted by |
| providing `NULL` (for pointers), `VK_NULL_HANDLE` (for handles), or 0 |
| (for other scalar types). |
| If not present, the value is assumed to be `"false"` (the parameter must |
| not be omitted). |
| If the parameter is a pointer to one of those types, multiple values may |
| be provided, separated by commas - one for each pointer indirection. |
| + |
| -- |
| [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-spec, Vulkan API Specification>>. |
| In this case, the attribute serves only as an indicator to human readers of |
| the XML. |
| |
| Explicitly specifying `optional="false"` is not supported, but |
| `optional="false,true"` is supported for a pointer type. |
| ==== |
| -- |
| * 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 `VkPresentInfoKHR` struct includes attr:externsync |
| attributes for the `pPresentInfo` array indicating that only specific |
| members of each element of the array are modified: |
| + |
| -- |
| [source,xml] |
| -------------------------------------- |
| <param externsync="pPresentInfo->pWaitSemaphores[],pPresentInfo->pSwapchains[]">const <type>VkPresentInfoKHR</type>* <name>pPresentInfo</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 object handle. |
| Specifies the name of another parameter which must be a `VkObjectType` |
| or `VkDebugReportObjectTypeEXT` value specifying the type of object the |
| handle refers to. |
| * attr:validstructs - optional. |
| Allowed only when the parameter type is a pointer to an abstract |
| `VkBaseInStructure` or `VkBaseOutStructure` type. |
| This is a comma-separated list of structures which can either be |
| passed as the parameter, or can appear anywhere in the `pNext` chain of |
| the parameter. |
| |
| |
| === 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 comma-separated list of <<schema:apiname, API |
| names>> for which this feature is defined, 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 extensions 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 an |
| attr:number attribute, it 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-spec, Vulkan |
| API 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. |
| * [[depends-expressions]] attr:depends - optional. |
| String containing a boolean expression of one or more API core version |
| and extension names. |
| The extension requires the expression in the string to be satisfied to |
| use any functionality it defines (for instance extensions), or to use |
| any device-level functionality it provides (for device extensions). |
| Supported operators include `,` for logical OR, `+` for logical AND, and |
| `(` `)` for grouping. |
| `,` and `+` are of equal precedence, and lower than `(` `)`. |
| Expressions must be evaluated left-to-right for operators of the same |
| precedence. |
| Terms which are core version names are true if the corresponding |
| API version is supported. |
| Terms which are extension names are true if the corresponding extension |
| is enabled. |
| + |
| -- |
| [NOTE] |
| .Note |
| ==== |
| attr:depends is a breaking change in Vulkan 1.3.241, replacing the |
| `requires` and `requiresCore` attributes. |
| For example, an extension which previously specified these two attributes in |
| `vk.xml`: |
| |
| * `requires="VK_KHR_dep_a,VK_EXT_dep_b"` |
| * `requiresCore="1.1"` |
| |
| should replace them both with |
| |
| * `depends="VK_VERSION_1_1+VK_KHR_dep_a+VK_EXT_dep_b"` |
| |
| Note that the use of `,` in the old `requires` attribute was treated as a |
| logical AND, and must be replaced by `+` in the `depends` attribute. |
| ==== |
| -- |
| * 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 - comma-separated list of required <<schema:apiname, API |
| names>> for which this extension is defined. |
| 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:ratified - optional comma-separated list of <<scheme:apiname, API |
| names>> for which this extension has been ratified by the Khronos Board |
| of Promoters. |
| Defaults to the empty string if not specified. |
| * 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. |
| Defaults to `"false"` if not specified. |
| * 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:depends 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 tag, using the |
| attr:depends 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 comma-separated list of <<schema:apiname, API |
| names>> requiring or removing these interfaces. |
| Interfaces in the tag are only required (or removed) if the requested |
| API name matches an element of 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 attributes are allowed only for a tag:require tag. |
| |
| * attr:depends - optional, and only for tag:require tags. |
| String containing a boolean expression of one or more API core version |
| and extension names. |
| The <<depends-expressions, syntax of this string>> is identical to that |
| of the tag:extension attr:depends attribute. |
| Interfaces in the tag are only required if the expression is satisfied. |
| + |
| -- |
| [NOTE] |
| .Note |
| ==== |
| attr:depends is a breaking change in Vulkan 1.3.241, replacing the |
| `extension` and `feature` attributes. |
| ==== |
| -- |
| |
| == 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 comma-separated list of <<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 numeric value of an enumerant is computed as defined in the |
| ``Assigning Extension Token Values`" section of the <<vulkan-styleguide, |
| Vulkan Documentation and Extensions: Procedures and Conventions>> |
| document. |
| * 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 |
| |==== |
| | Description | attr:value | attr:bitpos | attr:alias | attr:offset | attr:extnumber | attr:dir | attr:extends |
| | Numeric value | *Yes* | No | No | No | No | No | *Yes*^2^ |
| | Bitmask value | No | *Yes* | No | No | No | No | *Yes*^2^ |
| | Alias of another enumerant | No | No | *Yes* | No | No | No | *Yes*^2^ |
| | Value added to an enumeration | No | No | No | *Yes* | *Yes*^1^ | *Yes*^3^ | *Yes* |
| |==== |
| |
| [1]: Optional. |
| 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]: Optional. |
| If attr:extends is not present, the enumerant value is a global constant. |
| Otherwise, the value is added to the specified enumeration. |
| |
| [3]: Optional. |
| If not present, the computed value will be positive. |
| |
| 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 |
| -------------------------------------- |
| |
| |
| [[tag-formats]] |
| = Formats (tag:formats Tag) |
| |
| The tag:formats tag contains definitions of each of the image formats which |
| are defined for the API. |
| |
| == Attributes of tag:formats Tags |
| |
| None. |
| |
| // * attr:comment - optional. |
| // Arbitrary string (unused). |
| |
| == Contents of tag:formats Tags |
| |
| A tag:formats block contains zero or more tag:format tags, each describing |
| an image format, in arbitrary order. |
| |
| |
| [[tag-format]] |
| = Image Format (tag:format Tag) |
| |
| Image formats are described in individual tag:format tags. |
| An image format corresponds to a Vulkan `VkFormat` enumerant. |
| This tag contains information specifying the structure and meaning of |
| different parts of the format. |
| The meaning of different parts of the format information is described in |
| more detail in the "`Format Definition`" section of the <<vulkan-spec, |
| Vulkan API Specification>>. |
| |
| == Attributes of tag:format Tags |
| |
| * attr:name - required. |
| Format name, matching a `VkFormat` tag:enum attr:name. |
| Example: `name="VK_FORMAT_R8_UNORM"`. |
| * attr:class - required. |
| Format class. |
| A string whose value is shared by a group of formats which may be |
| compatible, and is a textual description of something important that |
| group has in common. |
| Example: `class="8-bit"`. |
| * attr:blockSize - required. |
| A decimal integer which is the texel block size, in bytes, of the |
| format. |
| * attr:texelsPerBlock - required |
| A decimal integer which is the number of texels in a texel block of the |
| format. |
| * attr:blockExtent - optional. |
| Three-dimensional extent of a texel block. |
| A comma-separated list of three decimal integers. |
| If not present, `blockExtent="1,1,1"` is assumed. |
| * attr:packed - optional. |
| A decimal integer which is the number of bits into which the format is |
| packed. |
| If defined, a single image element in this format can be stored in the |
| same space as a scalar type of this bit width. |
| * attr:compressed - optional. |
| A string whose value is shared by a group of formats which use the same |
| general texture compression scheme, and is a textual description of that |
| scheme. |
| Example: `compressed="ASTC LDR"`. |
| * attr:chroma - optional. |
| A string used to mark if {YCbCr} samplers are required by default when |
| using this format. |
| Must be one of the three values `"420"`, `"422"`, or `"444"` |
| corresponding to different {YCbCr} encodings. |
| |
| == Contents of tag:format Tags |
| |
| One or more <<tag-component,tag:component>> tags. |
| The order of tag:component tags corresponds to the memory order of |
| components of the format. |
| Each tag describes the size and format of that component. |
| |
| Zero or more <<tag-plane,tag:plane>> tags, in arbitrary order. |
| Each tag describes the scale of a specific image plane of the format |
| relative to the overall format. |
| |
| Zero or more <<tag-spirvimageformat,tag:spirvimageformat>> tags, in |
| arbitrary order. |
| Each tag describes a SPIR-V format name corresponding to the tag:format. |
| |
| == Example of a tag:format Tag |
| |
| [source,xml] |
| -------------------------------------- |
| <format name="VK_FORMAT_G16_B16R16_2PLANE_420_UNORM" class="16-bit 2-plane 420" blockSize="6" texelsPerBlock="1" chroma="420"> |
| <component name="G" bits="16" numericFormat="UNORM" planeIndex="0"/> |
| <component name="B" bits="16" numericFormat="UNORM" planeIndex="1"/> |
| <component name="R" bits="16" numericFormat="UNORM" planeIndex="1"/> |
| <plane index="0" widthDivisor="1" heightDivisor="1" compatible="VK_FORMAT_R16_UNORM"/> |
| <plane index="1" widthDivisor="2" heightDivisor="2" compatible="VK_FORMAT_R16G16_UNORM"/> |
| </format> |
| -------------------------------------- |
| |
| |
| [[tag-component]] |
| = Format Components (tag:component Tag) |
| |
| The tag:component tag contains definitions of each of the components which |
| are part of an image format. |
| |
| == Attributes of tag:component Tags |
| |
| * attr:name - required. |
| A string specifying the name of this component. |
| Must be one of the values `"R"`, `"G"`, `"B"`, `"A"`, `"D"`, or `"S"` |
| corresponding to red, green, blue, alpha, depth, and stencil components, |
| respectively. |
| * attr:bits - required. |
| Must be either a decimal integer which is the number of bits in this |
| component, or `"compressed"`, corresponding to a specific compression |
| scheme. |
| * attr:numericFormat - required. |
| A string specifying the scalar data type of the component. |
| Must be one of the following values: |
| ** `"SFLOAT"` - signed floating-point numbers |
| ** `"SINT"` - signed integer values in the range [-2^n-1^,2^n-1^-1] |
| ** `"SNORM"` - signed normalized values in the range [-1,1] |
| ** `"SRGB"` - R, G, and B components are unsigned normalized values that represent values using sRGB nonlinear encoding, while the A component (if one exists) is a regular unsigned normalized value |
| ** `"SSCALED"` - signed integer values that get converted to floating-point in the range [-2^n-1^,2^n-1^-1] |
| ** `"UFLOAT"` - unsigned floating-point numbers (used by packed, shared exponent, and some compressed formats) |
| ** `"UINT"` - unsigned integer values in the range [0,2^n^-1] |
| ** `"UNORM"` - unsigned normalized values in the range [0,1] |
| ** `"USCALED"` - unsigned integer values that get converted to floating-point in the range [0,2^n^-1] |
| * attr:planeIndex - optional. |
| A decimal integer specifying which plane this component lies in. |
| If present, must correspond to the attr:index attribute value of a |
| tag:plane tag for the same tag:component. |
| |
| == Contents of tag:component Tags |
| |
| None. |
| |
| |
| [[tag-plane]] |
| = Format Planes (tag:plane Tag) |
| |
| The tag:plane tag contains definitions of each of the image planes which are |
| part of an image format. |
| |
| == Attributes of tag:plane Tags |
| |
| * attr:index - required. |
| An integer specifying the image plane being defined. |
| Image planes are in the range [0,_p_-1] where _p_ is the number of |
| planes in the format. |
| * attr:widthDivisor - required. |
| An integer specifying the relative width of this plane. |
| A value of _k_ means that this plane is 1/_k_ the width of the overall |
| format. |
| * attr:heightDivisor - required. |
| An integer specifying the relative height of this plane. |
| A value of _k_ means that this plane is 1/_k_ the height of the overall |
| format. |
| * attr:compatible - required. |
| A string naming another, single-plane format that this plane is |
| compatible with. |
| Must match the attr:name of another attr:format. |
| |
| == Contents of tag:plane Tags |
| |
| None. |
| |
| |
| [[tag-spirvimageformat]] |
| = SPIR-V Image Formats (tag:spirvimageformat Tag) |
| |
| The tag:spirvimageformat tag specifies the name of a SPIR-V image format |
| equivalent to this format. |
| |
| == Attributes of tag:spirvimageformat Tags |
| |
| * attr:name - required. |
| The name of the SPIR-V image format. |
| Example: `name="R11fG11fB10f"`. |
| |
| == Contents of tag:spirvimageformat Tags |
| |
| None. |
| |
| |
| [[tag-spirvextensions]] |
| = SPIR-V Extensions (tag:spirvextensions Tag) |
| |
| The tag:spirvextensions tag contains definitions of each of the SPIR-V |
| extensions which are defined for the API. |
| |
| == Attributes of tag:spirvextensions Tags |
| |
| * attr:comment - optional. |
| Arbitrary string (unused). |
| |
| == Contents of tag:spirvextensions Tags |
| |
| Each tag:spirvextensions block contains zero or more tag:spirvextension tags, each |
| describing an single SPIR-V extension, in arbitrary order. |
| |
| |
| [[tag-spirvextension]] |
| = SPIR-V Extension (tag:spirvextension Tag) |
| |
| SPIR-V extensions are described in individual tag:spirvextension tags. |
| A SPIR-V extension is enabled by API versions or extensions. |
| |
| == Attributes of tag:spirvextension Tags |
| |
| * attr:name - required. |
| SPIR-V extension name. |
| Example: `name="SPV_KHR_variable_pointers"` |
| |
| == Contents of tag:spirvextension Tags |
| |
| One or more <<tag-spirvenable,tag:enable>> tags, in arbitrary order. |
| Each tag describes a single enabling mechanism for the extension. |
| |
| == Example of a tag:spirvextensions Tag |
| |
| [source,xml] |
| -------------------------------------- |
| <spirvextension name="SPV_KHR_multiview"> |
| <enable version="VK_VERSION_1_1"/> |
| <enable extension="VK_KHR_multiview"/> |
| </spirvextension> |
| -------------------------------------- |
| |
| |
| [[tag-spirvcapabilities]] |
| = SPIR-V Capabilities (tag:spirvcapabilities Tag) |
| |
| The tag:spirvcapabilities tag contains definitions of each of the SPIR-V |
| capabilities which are defined for the API. |
| |
| == Attributes of tag:spirvcapabilities Tags |
| |
| * attr:comment - optional. |
| Arbitrary string (unused). |
| |
| == Contents of tag:spirvcapabilities Tags |
| |
| Each tag:spirvcapabilities block contains zero or more tag:spirvcapability |
| tags, each describing an single SPIR-V capability, in arbitrary order. |
| |
| |
| [[tag-spirvcapability]] |
| = SPIR-V Capability (tag:spirvcapability Tag) |
| |
| SPIR-V capabilities are described in individual tag:spirvcapability tags. |
| A SPIR-V capability is enabled by API versions, extensions, features, or |
| properties. |
| |
| == Attributes of tag:spirvcapability Tags |
| |
| * attr:name - required. |
| SPIR-V capability name. |
| Example: `name="SPV_KHR_variable_pointers"` |
| |
| == Contents of tag:spirvcapability Tags |
| |
| One or more <<tag-spirvenable,tag:enable>> tags, in arbitrary order. |
| Each tag describes a single enabling mechanism for the capability. |
| |
| == Example of a tag:spirvcapabilities Tag |
| |
| [source,xml] |
| -------------------------------------- |
| <spirvcapability name="ImageCubeArray"> |
| <enable struct="VkPhysicalDeviceFeatures" feature="imageCubeArray" requires="VK_VERSION_1_0"/> |
| </spirvcapability> |
| <spirvcapability name="GroupNonUniform"> |
| <enable property="VkPhysicalDeviceVulkan11Properties" member="subgroupSupportedOperations" value="VK_SUBGROUP_FEATURE_BASIC_BIT" requires="VK_VERSION_1_1"/> |
| </spirvcapability> |
| -------------------------------------- |
| |
| |
| [[tag-spirvenable]] |
| = SPIR-V Enables (tag:enable Tag) |
| |
| The tag:enable tag describes a single mechanism in the API which enables a |
| tag:spirvextension or tag:spirvcapability. |
| There are four forms of tag:enable tags corresponding to different ways the |
| API may advertise enablement, though not all forms may be used with |
| tag:spirvextension tags. |
| Each form is described separately below. |
| |
| [[tag-syncstage]] |
| = Sync Stage (tag:syncstage Tag) |
| |
| The tag:syncstage tag contains definitions of each Pipeline stage. |
| |
| == Attributes of tag:syncstage Tags |
| |
| * attr:name - required. |
| VkPipelineStageFlagBits2 name |
| * attr:alias - optional. |
| Semantically equivalent name which is an alias of attr:name. |
| |
| == Contents of tag:syncstage Tags |
| |
| More information about the Pipeline stage using either |
| tag:syncequivalent or tag:syncsupport |
| |
| [[tag-syncaccess]] |
| = Sync Access (tag:syncaccess Tag) |
| |
| The tag:syncaccess tag contains definitions of each Access mask. |
| |
| == Attributes of tag:syncaccess Tags |
| |
| * attr:name - required. |
| VkAccessFlagBits2 name |
| * attr:alias - optional. |
| Semantically equivalent name which is an alias of attr:name. |
| |
| == Contents of tag:syncaccess Tags |
| |
| More information about the Access mask using either |
| tag:syncequivalent or tag:syncsupport |
| |
| [[tag-syncpipeline]] |
| = Sync Pipeline (tag:syncpipeline Tag) |
| |
| The tag:syncpipeline tag contains definitions of each type of Pipeline. |
| |
| == Attributes of tag:syncpipeline Tags |
| |
| * attr:name - required. |
| A unique string identifying the pipeline. |
| |
| == Contents of tag:syncpipeline Tags |
| |
| The tag:syncpipeline lists each pipeline stage in logical order using |
| tag:syncpipelinestage. Stages have extra attributes to describe |
| special ordering within the list |
| |
| [[tag-syncsupport]] |
| = Sync Support (tag:syncsupport Tag) |
| |
| The tag:syncsupport tag contains information what support there is for |
| a given Sync element. |
| |
| == Attributes of tag:syncsupport Tags |
| |
| * attr:queues - optional. |
| A comma-separated list of Queue types that are supported. |
| * attr:stage - optional. |
| A comma-separated list of Sync Stages that are supported. |
| This is used to cross-reference with tag:syncstage |
| |
| [[tag-syncequivalent]] |
| = Sync Equivalent (tag:syncequivalent Tag) |
| |
| The tag:syncequivalent tag contains information showing a one-to-many |
| relationship of Sync elements |
| |
| == Attributes of tag:syncsupport Tags |
| |
| * attr:stage - optional. |
| A comma-separated list of Sync Stages that are the OR logical |
| equivalence of the parent Sync Element |
| * attr:access - optional. |
| A comma-separated list of Sync Accesses that are the OR logical |
| equivalence of the parent Sync Element |
| |
| == Attributes for API Version Number Enables |
| |
| * attr:version - required. |
| An API feature name, matching a tag:feature attr:name attribute value. |
| |
| If the API version is supported, the SPIR-V extension or capability is |
| enabled. |
| |
| == Attributes for API Extension Enables |
| |
| * attr:extension - required. |
| An API extension name, matching an tag:extension attr:name attribute |
| value. |
| |
| If the API extension is supported and enabled, the SPIR-V extension or |
| capability is enabled. |
| |
| == Attributes for API Feature Enables |
| |
| * attr:struct - required. |
| An API feature structure name, matching a tag:struct attr:name attribute |
| value. |
| * attr:feature - required. |
| An API feature name, matching a tag:member tag:name value of the feature |
| structure. |
| * attr:requires - required. |
| A comma-separated list of API feature version numbers and/or extension |
| names. |
| * attr:alias - optional. |
| Another API feature name which is an alias of attr:feature. |
| Needed when the same feature is provided by two different API versions |
| or extensions. |
| |
| If one of the API feature version numbers or extensions in the attr:requires |
| list is supported or enabled, respectively; and if the attr:feature name is |
| enabled in the feature structure, the SPIR-V capability is enabled. |
| |
| API feature enables are not supported for tag:spirvextension tags. |
| |
| == Attributes for API Property Enables |
| |
| * attr:property - required. |
| An API property structure name, matching a tag:struct attr:name |
| attribute value. |
| * attr:member - required. |
| An API property name, matching a tag:member tag:name value of the |
| attr:property structure. |
| * attr:value - required. |
| A value, matching an API tag:enum tag:name value. |
| If the property is a bitfield, tag:value must be a bitmask value |
| belonging to the attr:member bitfield type. |
| Otherwise, tag:value must be an tag:enum name defined for the |
| attr:member enumeration type. |
| * attr:requires - optional. |
| A comma-separated list of API feature version numbers and/or extension |
| names. |
| |
| If one of the API feature version numbers or extensions in the attr:requires |
| list is supported or enabled, respectively; and if the attr:member property |
| contains the tag:value bit, or matches the tag:value, the SPIR-V capability |
| is enabled. |
| |
| API property enables are not supported for tag:spirvextension tags. |
| |
| == Contents of tag:enable Tags |
| |
| None. |
| |
| |
| [[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. |
| |
| There are multiple API versions defined for Vulkan at this time. |
| The initial Vulkan 1.0 tag can be found by searching for |
| |
| [source,xml] |
| -------------------------------------- |
| <feature api="vulkan" name="VK_VERSION_1_0" |
| -------------------------------------- |
| |
| Inside a tag:feature tag are multiple tag:require tags. |
| Some of these tags are used to express extension interactions, and others |
| only as a logical grouping mechanism for related parts of that API feature. |
| |
| |
| === 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-2023 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 |
| |
| * 2023-06-28 - remove support for tag:member and tag:param attr:optional |
| attribute value `"false"` (internal issue 3548). |
| * 2023-06-14 - removed deprecated attr:start and attr:end from tag:enums |
| * 2023-05-18 - Add tag:sync to help define all sync objects in the XML |
| * 2023-03-29 - add tag:extension attr:ratified attribute to express |
| ratification status. |
| * 2023-02-26 - add normative references section, cite it as needed, and |
| update description of tag:extension tags to refer to the style guide for |
| computing numeric enumerant values (public issue 2069). |
| * 2023-02-22 - specify that attr:depends expressions are |
| <<depends-expressions, evaluated left-to-right>> for operators of the |
| same precedence (public issue 2062). |
| * 2023-02-14 - replace tag:extension attributes attr:requiresCore and |
| attr:requires, and tag:require attributes attr:feature and |
| attr:extension, by a new attr:depends attribute. This is an intentional |
| breaking change to support a more flexible and consistent expression |
| syntax for these dependencies (internal issues 2883, 3272). |
| * 2023-01-11 - add attr:deprecated attribute to tag:enum, tag:type, |
| and tag:type tag:member tags. |
| * 2022-11-23 - update tag:command attr:queues syntax to include all queue |
| types currently in use. |
| * 2022-08-12 - update tag:requires attr:extension syntax to support |
| logical OR and AND constructs for multiple extensions (internal issue |
| 2922). |
| * 2022-07-11 - Add attr:videocoding attribute to <<tag-command,tag:command>> |
| tags to indicate whether a command buffer command can be recorded inside, |
| outside, or both inside and outside of a video coding scope. |
| * 2022-06-29 - Add tag:command attribute attr:tasks (internal issue 3117). |
| * 2022-06-22 - Add attr:validstructs attribute to command |
| <<tag-command:param:attr, tag:param>> tags when using an abstract |
| `VkBaseInStructure` or `VkBaseOutStructure` as the formal parameter |
| type. |
| * 2022-06-16 - Add `VkSparseImageFormatProperties*` to the list of |
| structure types allowed to have 'limittype' member attributes. |
| * 2022-06-08 - Add `exact`, `bits`, `mul` and `pot` limit types. |
| * 2022-06-08 - Update description of types to which the attr:limittype |
| attribute of structure tag:member tags can be applied (internal issue |
| 3101). |
| * 2022-06-08 - Update description of tag:extension attr:requires attribute |
| such that the specified extensions must be *enabled*, not just |
| *supported*. This is consistent with the following NOTE, the |
| specification description of "`required extensions`", and actual use in |
| the XML of this attribute (internal issue 3116). |
| * 2021-12-13 - Add attr:api attribute to the tag:member and tag:param |
| tags. |
| * 2021-11-29 - Add attr:api attribute to the tag:command tag. |
| * 2021-10-11 - Add description of the tag:formats tag for describing |
| Vulkan `VkFormat` image formats, and of the tag:spirvextensions and |
| tag:spirvcapabilities tags for describing enabling mechanisms for SPIR-V |
| extensions (internal issue 2484). |
| * 2021-09-13 - Further clarify that attr:api and attr:supported attributes |
| are comma-separated list of API names (internal issue 2809). |
| * 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. |