| # Copyright 2013-2021 The Khronos Group Inc. |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| # Relax NG schema for Khronos Vulkan API Registry XML |
| # |
| # See https://www.khronos.org/vulkan/ |
| # |
| # This definition is subject to change (mostly in the form of additions) |
| |
| namespace xsd = "http://www.w3.org/2001/XMLSchema-datatypes" |
| |
| # Toplevel is a <registry> tag. |
| # May be led by an optional <comment> tag containing e.g. copyrights. |
| start = element registry { |
| ( |
| element comment { text } ? | |
| Platforms * | |
| Tags * | |
| Types * | |
| Enums * | |
| Commands * | |
| Feature * | |
| Extensions * | |
| SpirvExtensions * | |
| SpirvCapabilities * |
| ) * |
| } |
| |
| # <platforms> defines a group of platform names |
| Platforms = element platforms { |
| Comment ? , |
| Platform * |
| } |
| |
| # <platform> defines a single platform name. |
| # name - string name of the platform, used as part of extension names |
| # protect - preprocessor symbol to include platform headers from <vulkan.h> |
| # comment - platform description |
| Platform = element platform { |
| attribute name { text } , |
| attribute protect { text } , |
| Comment |
| } |
| |
| # <tags> defines a group of author tags |
| Tags = element tags { |
| Comment ? , |
| Tag * |
| } |
| |
| # <tag> defines a single author tag. |
| # name - name of the tag |
| # author - name of the author (usually a company or project name) |
| # contact - contact responsible for the tag (name and contact information) |
| Tag = element tag { |
| attribute name { text } , |
| attribute author { text } , |
| attribute contact { text } |
| } |
| |
| # <types> defines a group of types |
| Types = element types { |
| Comment ? , |
| ( |
| Type | |
| element comment { text } |
| ) * |
| } |
| |
| # <type> defines a single type. It is usually a C typedef but |
| # may contain arbitrary C code. |
| # name - name of this type, if not present in the <name> tag |
| # api - matches a <feature> api attribute, if present |
| # alias - name of a type this type aliases |
| # requires - name of another type definition required by this one |
| # bitvalues - for a *Flags type, name of an enum definition that |
| # defines the valid values for parameters of that type |
| # name - name of the type being defined |
| # category - if present, 'enum' indicates a matching <enums> |
| # block to generate an enumerated type for, and 'struct' |
| # causes special interpretation of the contents of the type |
| # tag including ... TBD ... |
| # Other allowed values are 'include', 'define', 'handle' and 'bitmask', |
| # which don't change syntactic interpretation but allow organization in |
| # the generated header. |
| # parent - only applicable if category is 'handle'. Notes another type with |
| # the 'handle' category that acts as a parent object for this type. |
| # returnedonly - only applicable if category is 'struct'. Notes that this |
| # struct is going to be filled in by the API, rather than an application |
| # filling it out and passing it to the API. |
| # structextends - only applicable if category is 'struct'. Lists parent |
| # structures which this structure may extend via the pNext chain |
| # of the parent. |
| # When present it suppresses generation of automatic validity for the |
| # pNext member of that structure, and instead the structure is added |
| # to pNext chain validity for the parent structures it extends. |
| # allowduplicate - only applicable if category is 'struct'. pNext can include |
| # multiple structures of this type. |
| # objtypeenum - name of VK_OBJECT_TYPE_* API enumerant which corresponds |
| # to this type. Currently only specified for category="handle" types. |
| # comment - descriptive text with no semantic meaning |
| # For types without a category, contents include |
| # <apientry /> - substitutes for an APIENTRY-style macro on output |
| # <name> - contains name of the type being defined |
| # <type> - contains name of types used to define this type. There |
| # may be multiple imbedded <type> tags |
| # For types with category 'enum', contents should be empty |
| # For types with category 'struct', contents should be one or more |
| # <member> - like <param> for a struct or union member |
| # 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's |
| # just a pointer (used for nested pointers), or a latex equation (prefixed with |
| # 'latexmath:') |
| # altlen - if len has latexmath equations, this contains equivalent C99 |
| # expressions separated by commas. |
| # externsync - denotes that the member should be externally synchronized |
| # when accessed by Vulkan |
| # optional - whether this value can be omitted by providing NULL (for |
| # pointers), VK_NULL_HANDLE (for handles) or 0 (for bitmasks/values) |
| # selector - for a union member, identifies a separate enum member that |
| # selects which of the union's members are valid |
| # selection - for a member of a union, identifies an enum value indicating the member is valid |
| # noautovalidity - tag stating that no automatic validity language should be generated |
| # values - comma-separated list of legal values, usually used only for sType enums |
| # limittype - only applicable for members of VkPhysicalDeviceProperties and |
| # VkPhysicalDeviceProperties2, their substrucutres, and extensions. |
| # Specifies the type of a device limit. |
| # Valid values: 'min', 'max', 'bitmask', 'range', 'struct', 'noauto' |
| # objecttype - only applicable for members representing a handle as |
| # a uint64_t value. Specifies the name of another member which is |
| # a VkObjectType or VkDebugReportObjectTypeEXT value specifying |
| # the type of object the handle references. |
| # <comment> - containing arbitrary text (unused) |
| # |
| # *** There's a problem here: I'm not sure how to represent the <type> |
| # syntax where it may contain arbitrarily interleaved text, <type>, and |
| # <enum> child tags. This allows only the syntax |
| # text <type>name</type> text <enum>name</enum> text |
| # where <type> and <enum> are both optional and occur in the specified |
| # order, which might eventually be a problem. |
| Type = element type { |
| attribute api { text } ? , |
| attribute alias { text } ? , |
| attribute requires { text } ? , |
| attribute bitvalues { text } ? , |
| attribute name { TypeName } ? , |
| attribute category { text } ? , |
| attribute parent { TypeName } ? , |
| attribute returnedonly { text } ? , |
| attribute structextends { text } ? , |
| attribute allowduplicate { text } ? , |
| attribute objtypeenum { text } ? , |
| Comment ? , |
| ( |
| ( |
| ( text , |
| element type { text } * |
| ) * , |
| element apientry { text } ? , |
| ( text , |
| element type { text } * |
| ) * , |
| element name { TypeName } ? , |
| ( text , |
| element type { text } * |
| ) * |
| ) | |
| ( |
| element member { |
| attribute len { text } ? , |
| attribute altlen { text } ? , |
| attribute externsync { text } ? , |
| attribute optional { text } ? , |
| attribute selector { text } ? , |
| attribute selection { EnumName } ? , |
| attribute noautovalidity { text } ? , |
| attribute values { text } ? , |
| attribute limittype { text } ? , |
| attribute objecttype { text } ? , |
| mixed { |
| element type { TypeName } ? , |
| element name { text } ? , |
| element enum { EnumName } ? , |
| element comment { text } ? |
| } |
| } | |
| element comment { text } |
| ) * |
| ) |
| } |
| |
| # <enums> defines a group of enumerants |
| # name - identifies a type name associated with this group. Should |
| # match a <type> name to trigger generation of the type. |
| # start, end - beginning and end of a numeric range |
| # vendor - owner of the numeric range |
| # type - 'enum' or 'bitmask', if present |
| # bitwidth - bit width of the enum value type. |
| # comment - descriptive text with no semantic meaning |
| Enums = element enums { |
| attribute name { text } ? , |
| attribute type { text } ? , |
| attribute start { Integer } ? , |
| attribute end { Integer } ? , |
| attribute bitwidth { Integer } ? , |
| Vendor ? , |
| Comment ? , |
| ( |
| Enum | |
| Unused | |
| element comment { text} |
| ) * |
| } |
| |
| # <enum> defines or references a single enumerant. There are two places it |
| # can be used: in an <enums> block, providing a global definition which |
| # may later be required by a feature or extension; or in a feature or |
| # extension, defining an enumerant specific to that feature. The second |
| # form has more possible attributes. Some combinations of attributes are |
| # nonsensical in on or the other place, but these are not detected by the |
| # validator. |
| # |
| # Ways to specify the enumerant value: |
| # value - integer (including hex) value of the enumerant |
| # bitpos - integer bit position of the enumerant in a bitmask |
| # [extnumber], offset, [dir] - integer extension number specifying a |
| # base block value (inherited from surrounding <extension> if |
| # not specified); integer offset in that block; and direction |
| # of offset ('-' for negative, positive if not specified). |
| # alias - name of another enum this is an alias of |
| # |
| # value and bitpos allow, and extnumber/offset/dir require: |
| # extends - type name of the enumerant being extended |
| # |
| # Other attributes: |
| # api - matches a <feature> api attribute, if present |
| # type - 'uint32_t', 'uint64_t', or 'float', if present. There are |
| # certain conditions under which the tag must be present, or absent, |
| # but they are context-dependent and difficult to express in the |
| # RNC syntax. |
| # name - enumerant name |
| # alias - another enumerant this is semantically identical to |
| # protect - additional #ifdef symbol to place around the enum |
| # comment - descriptive text with no semantic meaning |
| Enum = element enum { |
| ( |
| ( |
| ( |
| attribute value { Integer } & |
| attribute extends { TypeName } ? |
| ) | |
| ( |
| attribute bitpos { Integer } & |
| attribute extends { TypeName } ? |
| ) | |
| ( |
| attribute extnumber { Integer } ? & |
| attribute offset { Integer } & |
| attribute dir { text } ? & |
| attribute extends { TypeName } |
| ) | |
| ( |
| attribute extends { TypeName } ? & |
| attribute alias { TypeName } |
| ) |
| ) ? & |
| attribute protect { text } ? & |
| attribute api { text } ? & |
| attribute type { TypeSuffix } ? & |
| attribute name { text } & |
| Comment ? |
| ) |
| } |
| |
| # <unused> defines a range of enumerants not currently being used |
| # start, end - beginning and end of an unused numeric range |
| # vendor - unused |
| # comment - descriptive text with no semantic meaning |
| Unused = element unused { |
| attribute start { Integer } , |
| attribute end { Integer } ? , |
| Vendor ? , |
| Comment ? |
| } |
| |
| # <commands> defines a group of commands |
| Commands = element commands { |
| Comment ? , |
| Command * |
| } |
| |
| # <command> defines a single command |
| # |
| # There are two forms of the tag. |
| # |
| # The first only has 'name' and 'alias' attributes, and no contents. |
| # It defines a command alias. |
| # |
| # The second fully defines a command, and has the following structure: |
| # The possible attributes are not described in this comment block yet, but |
| # are in readme.pdf. The "prefix" and "suffix" attributes are currently |
| # present only in the OpenCL XML registry, where they are currently unused. |
| # |
| # <proto> is the C function prototype, including the return type |
| # <param> are function parameters, in order |
| # 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's |
| # just a pointer (used for nested pointers), or a latex equation (prefixed with |
| # 'latexmath:') |
| # altlen - if len has latexmath equations, this contains equivalent C99 |
| # expressions separated by commas. |
| # externsync - denotes that the member should be externally synchronized |
| # when accessed by Vulkan |
| # optional - whether this value can be omitted by providing NULL (for |
| # pointers), VK_NULL_HANDLE (for handles) or 0 (for bitmasks/values) |
| # selector - for a union parameter, identifies a separate enum parameter that |
| # selects which of the union's members are valid |
| # noautovalidity - tag stating that no automatic validity language should be generated |
| # objecttype - only applicable for parameters representing a handle as |
| # a uint64_t value. Specifies the name of another parameter which is |
| # a VkObjectType or VkDebugReportObjectTypeEXT value specifying |
| # the type of object the handle references. |
| # <type> is a <type> name, if present |
| # <name> is the function / parameter name, if present (normally should |
| # be, except for void parameters). |
| # The textual contents of <proto> and <param> should be legal C |
| # for those parts of a function declaration. |
| # <alias> - denotes function aliasing, if present |
| # name - name of aliased function |
| # <description> - unused text |
| # <implicitexternsyncparams> are spec-language descriptions of |
| # objects that are not parameters of the command, but |
| # are related to them and also require external synchronization. |
| Command = element command { |
| ( attribute name { text } , |
| attribute alias { text } ) | |
| ( |
| attribute queues { text } ? , |
| attribute successcodes { text } ? , |
| attribute errorcodes { text } ? , |
| attribute renderpass { text } ? , |
| attribute cmdbufferlevel { text } ? , |
| attribute prefix { text } ? , |
| attribute suffix { text } ? , |
| Comment ? , |
| element proto { |
| mixed { |
| element type { TypeName } ? , |
| element name { text } |
| } |
| } , |
| element param { |
| attribute len { text } ? , |
| attribute altlen { text } ? , |
| attribute externsync { text } ? , |
| attribute optional { text } ? , |
| attribute selector { text } ? , |
| attribute noautovalidity { text } ? , |
| attribute objecttype { text } ? , |
| mixed { |
| element type { TypeName } ? , |
| element name { text } ? |
| } |
| } * , |
| ( |
| element alias { |
| Name |
| } ? & |
| element description { |
| text |
| } ? & |
| element implicitexternsyncparams { |
| element param { text } * |
| } ? |
| ) |
| ) |
| } |
| |
| # Each <feature> defines the interface of an API version (e.g. OpenGL 1.2) |
| # api - API tag (e.g. 'gl', 'gles2', etc. - used internally, not |
| # necessarily an actual API name |
| # name - version name (C preprocessor name, e.g. GL_VERSION_4_2) |
| # number - version number, e.g. 4.2 |
| # protect - additional #ifdef symbol to place around the feature |
| # sortorder - order relative to other features, default 0 |
| # <require> / <remove> contains features to require or remove in |
| # this version |
| # profile - only require/remove when generated profile matches |
| # comment - descriptive text with no semantic meaning |
| Feature = element feature { |
| attribute api { text } , |
| Name , |
| attribute number { xsd:float } , |
| attribute protect { text } ? , |
| attribute sortorder { xsd:integer } ?, |
| Comment ? , |
| ( |
| element require { |
| ProfileName ? , |
| ExtensionName ? , |
| Comment ? , |
| ( |
| InterfaceElement | |
| element comment { text } |
| ) * |
| } | |
| element remove { |
| ProfileName ? , |
| Comment ? , |
| ( |
| InterfaceElement | |
| element comment { text } |
| ) * |
| } |
| ) * |
| } |
| |
| Extensions = element extensions { |
| Comment ? , |
| Extension * |
| } |
| |
| # Defines the interface of an API <extension>. Like a <feature> |
| # tag, but with slightly different attributes: |
| # api - regexp pattern matching one or more API tags, indicating |
| # which APIs the extension is known to work with. The only |
| # syntax supported is <name>{|<name>}* and each name must |
| # exactly match an API being generated (implicit ^$ surrounding). |
| # name - extension name string |
| # number - extension number (positive integer, should be unique) |
| # sortorder - order relative to other extensions, default 0 |
| # protect - C preprocessor symbol to conditionally define the interface |
| # platform - should be one of the platform names defined in the |
| # <platform> tag. Currently unused. |
| # author - name of the author (usually a company or project name) |
| # contact - contact responsible for the tag (name and contact information) |
| # type - 'device' or 'instance', if present |
| # requires - commas-separated list of extension names required by this |
| # extension |
| # requiresCore - core version of Vulkan required by the extension, e.g. |
| # "1.1". Defaults to "1.0". |
| # supported - profile name(s) supporting this extension, e.g. 'vulkan' |
| # or 'disabled' to never generate output. |
| # promotedto - 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_county' |
| # deprecatedby - Vulkan version or a name of an extension that deprecates |
| # this extension. It may be empty string. |
| # e.g. 'VK_VERSION_1_1', or 'VK_EXT_debug_utils', or '' |
| # obsoletedby - Vulkan version or a name of an extension that obsoletes |
| # this extension. It may be empty string. |
| # e.g. 'VK_VERSION_1_1', or 'VK_EXT_debug_utils', or '' |
| # provisional - 'true' if this extension is released provisionally |
| # specialuse - contains one or more tokens separated by commas, indicating |
| # a special purpose of the extension. Tokens may include 'cadsupport', |
| # 'd3demulation', 'devtools', 'debugging', and 'glemulation'. Others |
| # may be added in the future. |
| # In addition, <require> / <remove> tags also support an api attribute: |
| # api - only require/remove these features for the matching API. |
| # Not a regular expression. |
| Extension = element extension { |
| Name , |
| attribute number { Integer } ? , |
| attribute sortorder { xsd:integer } ?, |
| attribute protect { text } ? , |
| attribute platform { text } ? , |
| attribute author { text } ? , |
| attribute contact { text } ? , |
| attribute type { text } ? , |
| attribute requires { text } ? , |
| attribute requiresCore { text } ? , |
| attribute supported { StringGroup } ? , |
| attribute promotedto { text } ? , |
| attribute deprecatedby { text } ? , |
| attribute obsoletedby { text } ? , |
| attribute provisional { text } ? , |
| attribute specialuse { text } ? , |
| Comment ? , |
| ( |
| element require { |
| attribute api { text } ? , |
| ProfileName ? , |
| ExtensionName ? , |
| FeatureName ? , |
| Comment ? , |
| ( |
| InterfaceElement | |
| element comment { text } |
| ) * |
| } | |
| element remove { |
| attribute api { text } ? , |
| ProfileName ? , |
| Comment ? , |
| ( |
| InterfaceElement | |
| element comment { text } |
| ) * |
| } |
| ) * |
| } |
| |
| # Each <spirvextension> define a SPIR-V extension that can be used in the API. |
| # Each <spirvcapability> define a SPIR-V capability that can be used in the API. |
| # Contains information to both generate table in spec as well as validation |
| # what needs to be enabled be used in Vulkan |
| SpirvExtensions = element spirvextensions { |
| Comment ? , |
| SpirvExtension * |
| } |
| |
| SpirvExtension = element spirvextension { |
| Name , |
| Enable * |
| } |
| |
| SpirvCapabilities = element spirvcapabilities { |
| Comment ? , |
| SpirvCapability * |
| } |
| |
| SpirvCapability = element spirvcapability { |
| Name , |
| Enable * |
| } |
| |
| # <enable> defines a way to enable the parent element in the API. |
| # If anyone of the <enable> elements are valid then the parent element |
| # can be used. |
| # |
| # There are four forms of the tag. |
| # |
| # The first only has the minimal version of Vulkan of the application |
| # |
| # The second only has a single Vulkan extension that must be enabled |
| # |
| # The third has a single Vulkan feature with the struct where it is from |
| # |
| # The forth has a property struct, the member field in it, and the value |
| # that must be present |
| # |
| # To make scripting easier, each <enable> has a require attribute to map |
| # to the asciidoctor conditional logic in the spec. For version and |
| # extension attribute variations, there is no need for the require attribute |
| # since it is a redundant 1:1 mapping. |
| # |
| # The 'alias' attribute is used in cases where the anchor link can't be |
| # propertly resolved and needs a manual name to link to |
| Enable = element enable { |
| ( |
| attribute version { text } ) | |
| ( |
| attribute extension { text } ) | |
| ( |
| attribute struct { text }, |
| attribute feature { text }, |
| attribute requires { text }, |
| attribute alias { text } ? ) | |
| ( |
| attribute property { text }, |
| attribute member { text }, |
| attribute value { text }, |
| attribute requires { text } ? ) |
| } |
| |
| # Contents of a <require> / <remove> tag, defining a group |
| # of features to require or remove. |
| # <type> / <enum> / <command> all have attributes |
| # name - feature name which must match |
| InterfaceElement = |
| element type { |
| Name , |
| Comment ? |
| } | |
| Enum | |
| element command { |
| Name , |
| Comment ? |
| } |
| |
| # Integers are allowed to be either decimal or C-hex (0x[0-9A-F]+), but |
| # XML Schema types don't seem to support hex notation, so we use this |
| # as a placeholder. |
| Integer = text |
| |
| # EnumName is an compile-time constant name |
| EnumName = text |
| |
| # TypeName is an argument/return value C type name |
| TypeName = text |
| |
| # TypeSuffix is a C numeric type suffix, e.g. 'u' or 'ull' |
| TypeSuffix = text |
| |
| # StringGroup is a regular expression with an implicit |
| # '^(' and ')$' bracketing it. |
| StringGroup = text |
| |
| # Repeatedly used attributes |
| ProfileName = attribute profile { text } |
| ExtensionName = attribute extension { text } |
| FeatureName = attribute feature { text } |
| Vendor = attribute vendor { text } |
| Comment = attribute comment { text } |
| Name = attribute name { text } |
| |
| |