| # Copyright 2013-2020 The Khronos Group Inc. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | # Relax NG schema for Khronos Registry XML | 
 | # See https://www.github.com/KhronosGroup/EGL-Registry | 
 | # | 
 | # Last modified 2017/02/03 | 
 | # 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 } ? | | 
 |         Types      * | | 
 |         Groups     * | | 
 |         Enums      * | | 
 |         Commands   * | | 
 |         Feature    * | | 
 |         Extensions * | 
 |     ) * | 
 | } | 
 |  | 
 | # <types> defines a group of types | 
 | Types = element types { | 
 |     Type * | 
 | } | 
 |  | 
 | # <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 | 
 | #   requires - name of another type definition required by this one | 
 | #   type - "group", if present, indicating a group of values in the | 
 | #       corresponding <enums> definition. | 
 | #   comment - unused | 
 | #   <apientry /> - substitutes for an APIENTRY-style macro on output | 
 | #   <name> - contains typename | 
 | Type = element type { | 
 |     attribute api { text } ? , | 
 |     attribute requires { text } ? , | 
 |     attribute name { TypeName } ? , | 
 |     attribute type { text } ? , | 
 |     Comment ? , | 
 |     text , | 
 |     element apientry { text } ? , | 
 |     text , | 
 |     element name { TypeName } ? , | 
 |     text | 
 | } | 
 |  | 
 | # <groups> defines a group of enum groups | 
 | Groups = element groups { | 
 |     Group * | 
 | } | 
 |  | 
 | # <group> defines a single enum group. Enums may | 
 | # be in multiple groups. | 
 | #   name - group name | 
 | #   comment - unused | 
 | #   <enum name=""> - members of the group | 
 |  | 
 | Group = element group { | 
 |     Name , | 
 |     Comment ? , | 
 |     element enum { Name } * | 
 | } | 
 |  | 
 | # <enums> defines a group of enumerants | 
 | #   namespace - identifies a numeric namespace | 
 | #   group - identifies a functional subset of the namespace - same as <group name=""> | 
 | #   start, end - beginning and end of a numeric range in the namespace | 
 | #   vendor - owner of the numeric range | 
 | #   type - "bitmask", if present | 
 | #   comment - unused | 
 | Enums = element enums { | 
 |     attribute namespace { text } ? , | 
 |     attribute group { text } ? , | 
 |     attribute type { text } ? , | 
 |     attribute start { Integer } ? , | 
 |     attribute end { Integer } ? , | 
 |     Vendor ? , | 
 |     Comment ? , | 
 |     (Enum | Unused) * | 
 | } | 
 | # <enum> defines a single enumerant | 
 | #   value - integer (including hex) value of the enumerant | 
 | #   api - matches a <feature> api attribute, if present | 
 | #   type - "u" (unsigned), "ull" (uint64), or integer if not present | 
 | #   name - enumerant name | 
 | #   alias - another enumerant this is semantically identical to | 
 | #   comment - unused | 
 | Enum = element enum { | 
 |     ( | 
 |         attribute value { Integer } & | 
 |         attribute api { text } ? & | 
 |         attribute type { TypeSuffix } ? & | 
 |         attribute name { text } & | 
 |         attribute alias { 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 - unused | 
 | Unused = element unused { | 
 |     attribute start { Integer } , | 
 |     attribute end { Integer } ? , | 
 |     Vendor ? , | 
 |     Comment ? | 
 | } | 
 | # <commands> defines a group of commands | 
 | #   namespace - identifies a function namespace | 
 | Commands = element commands { | 
 |     attribute namespace { text } ? , | 
 |     Command * | 
 | } | 
 | # <command> defines a single command | 
 | #   <proto> is the C function prototype, including the return type | 
 | #   <param> are function parameters, in order | 
 | #     <ptype> is a <type> name, if present | 
 | #     <name> is the function / parameter name | 
 | # The textual contents of <proto> and <param> should be legal C | 
 | # for those parts of a function declaration. | 
 | #   <alias> - denotes function aliasing | 
 | #     name - name of aliased function | 
 | #   <vecequiv> - denotes scalar / vector function equivalence | 
 | #     name - name of corresponding vector form, e.g. (glColor3f -> glColor3fv) | 
 | #   <glx> - information about GLX protocol | 
 | #     type - "render", "single", or "vendor" for GLXRender, GLXSingle, GLXVendorPrivate{WithReply} | 
 | #     opcode - numeric opcode of specified type for this function | 
 | #     name - if present, protocol name (defaults to command name) | 
 | #     comment - unused | 
 | Command = element command { | 
 |     Comment ? , | 
 |     element proto { | 
 |         attribute group { text } ? , | 
 |         text , | 
 |         element ptype { TypeName } ? , | 
 |         text , | 
 |         element name { text } , | 
 |         text | 
 |     } , | 
 |     element param { | 
 |         attribute group { text } ? , | 
 |         attribute len { text } ? , | 
 |         text , | 
 |         element ptype { TypeName } ? , | 
 |         text , | 
 |         element name { text } , | 
 |         text | 
 |     } * , | 
 |     ( | 
 |         element alias { | 
 |             Name | 
 |         } ? & | 
 |         element vecequiv { | 
 |             Name | 
 |         } ? & | 
 |         element glx { | 
 |             attribute type { text } , | 
 |             attribute opcode { xsd:integer } , | 
 |             Name ? , | 
 |             Comment ? | 
 |         } * | 
 |     ) | 
 | } | 
 | # 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 | 
 | #     neccessarily 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 | 
 | #   <require> / <remove> contains features to require or remove in | 
 | #                        this version | 
 | #     profile - only require/remove when generated profile matches | 
 | #     comment - unused | 
 | Feature = element feature { | 
 |     attribute api { text } , | 
 |     Name , | 
 |     attribute number { xsd:float } , | 
 |     attribute protect { text } ?, | 
 |     Comment ? , | 
 |     ( | 
 |         element require { | 
 |             ProfileName ? , | 
 |             Comment ? , | 
 |             InterfaceElement * | 
 |         } | | 
 |         element remove { | 
 |             ProfileName ? , | 
 |             Comment ? , | 
 |             InterfaceElement * | 
 |         } | 
 |     ) * | 
 | } | 
 | Extensions = element extensions { | 
 |     Extension * | 
 | } | 
 | # Defines the interface of an API <extension>. Like a <feature> | 
 | # tag, but with a slightly different api attribute. | 
 | #   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). | 
 | # 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 protect { text } ?, | 
 |     attribute supported { StringGroup } ? , | 
 |     Comment ? , | 
 |     ( | 
 |         element require { | 
 |             attribute api { text } ? , | 
 |             ProfileName ? , | 
 |             Comment ? , | 
 |             InterfaceElement * | 
 |         } | | 
 |         element remove { | 
 |             attribute api { text } ? , | 
 |             ProfileName ? , | 
 |             Comment ? , | 
 |             InterfaceElement * | 
 |         } | 
 |     ) * | 
 | } | 
 | # 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 ? | 
 |     } | | 
 |     element enum { | 
 |         Name , | 
 |         Comment ? | 
 |     } | | 
 |     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 | 
 |  | 
 | # 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 } | 
 | Vendor = attribute vendor { text } | 
 | Comment = attribute comment { text } | 
 | Name = attribute name { text } |