summaryrefslogtreecommitdiff
path: root/codegen/vulkan/xml/registry.rnc
diff options
context:
space:
mode:
Diffstat (limited to 'codegen/vulkan/xml/registry.rnc')
-rw-r--r--codegen/vulkan/xml/registry.rnc610
1 files changed, 610 insertions, 0 deletions
diff --git a/codegen/vulkan/xml/registry.rnc b/codegen/vulkan/xml/registry.rnc
new file mode 100644
index 00000000..ad645c04
--- /dev/null
+++ b/codegen/vulkan/xml/registry.rnc
@@ -0,0 +1,610 @@
+# 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 }
+
+