15bd8deadSopenharmony_ci\documentclass{article}
25bd8deadSopenharmony_ci
35bd8deadSopenharmony_ci% Various packages of possible use. {index} creates problems for some reason.
45bd8deadSopenharmony_ci% \usepackage{index}
55bd8deadSopenharmony_ci\def\specpdftitle{The Khronos OpenGL API Registry Schema}
65bd8deadSopenharmony_ci\usepackage[pdftex,bookmarksnumbered=true,linktocpage,plainpages=false,pdftitle={\specpdftitle},colorlinks=true]{hyperref}
75bd8deadSopenharmony_ci\usepackage{amsmath,enumerate,epsfig,framed,mdframed,multicol,longtable,times,url}
85bd8deadSopenharmony_ci\usepackage[normalem]{ulem}
95bd8deadSopenharmony_ci% underscore allows use of _ instead of \_ in text. [strings] allows _ in file names
105bd8deadSopenharmony_ci\usepackage[strings]{underscore}
115bd8deadSopenharmony_ci\usepackage[breakwords,fit]{truncate}
125bd8deadSopenharmony_ci
135bd8deadSopenharmony_ci\makeatletter
145bd8deadSopenharmony_ci\makeatother
155bd8deadSopenharmony_ci\makeindex
165bd8deadSopenharmony_ci
175bd8deadSopenharmony_ci% Some commonly used abbreviations
185bd8deadSopenharmony_ci
195bd8deadSopenharmony_ci\def\code#1{{\tt #1}}
205bd8deadSopenharmony_ci\def\tag#1{{\tt <#1>\index{<#1>}}}
215bd8deadSopenharmony_ci\def\attr#1{{\tt #1\index{#1}}}
225bd8deadSopenharmony_ci
235bd8deadSopenharmony_ci\begin{document}
245bd8deadSopenharmony_ci
255bd8deadSopenharmony_ci\title{The Khronos OpenGL API Registry Schema}
265bd8deadSopenharmony_ci\author{Jon Leech}
275bd8deadSopenharmony_ci\date{Last updated 2020-10-27}
285bd8deadSopenharmony_ci\maketitle
295bd8deadSopenharmony_ci
305bd8deadSopenharmony_ci\begin{abstract}
315bd8deadSopenharmony_ci
325bd8deadSopenharmony_ciThis document describes the Khronos OpenGL API Registry XML schema, and provides
335bd8deadSopenharmony_cisome additional information about using the registry and scripts to generate
345bd8deadSopenharmony_ciC header files. The underlying XML files and scripts, as well as headers
355bd8deadSopenharmony_cigenerated from the current authoritative copy of the XML files, can be
365bd8deadSopenharmony_ciobtained from the OpenGL-Registry github repository at
375bd8deadSopenharmony_ci
385bd8deadSopenharmony_ci\begin{center}
395bd8deadSopenharmony_ci{\bf \href{https://github.com/KhronosGroup/OpenGL-Registry}
405bd8deadSopenharmony_ci          {https://github.com/KhronosGroup/OpenGL-Registry}}
415bd8deadSopenharmony_ci\end{center}
425bd8deadSopenharmony_ci
435bd8deadSopenharmony_ci\end{abstract}
445bd8deadSopenharmony_ci
455bd8deadSopenharmony_ci\tableofcontents
465bd8deadSopenharmony_ci
475bd8deadSopenharmony_ci\section{Introduction}
485bd8deadSopenharmony_ci
495bd8deadSopenharmony_ciThe registry uses an XML representation of the API and a set of Python 3
505bd8deadSopenharmony_ciscripts to manipulate the XML, based on the lxml Python bindings. It comes
515bd8deadSopenharmony_ciwith an XML schema and validator. Outside users are welcome to submit pull
525bd8deadSopenharmony_cirequests on github, although the XML schema itself is mature and unlikely to
535bd8deadSopenharmony_cichange at this point.
545bd8deadSopenharmony_ci
555bd8deadSopenharmony_ciOther APIs defined by Khronos, such as Vulkan and OpenXR, use a similar XML
565bd8deadSopenharmony_cischema originally based on the OpenGL schema to describe those APIs.
575bd8deadSopenharmony_ci
585bd8deadSopenharmony_ciSome groups outside Khronos have their own XML based API descriptions,
595bd8deadSopenharmony_cioften used for additional purposes such as library code generators or
605bd8deadSopenharmony_ciextension loaders, and it may be desirable to construct XSLT or other
615bd8deadSopenharmony_citranslators between the schema.
625bd8deadSopenharmony_ci
635bd8deadSopenharmony_ci
645bd8deadSopenharmony_ci\section{Getting Started}
655bd8deadSopenharmony_ci
665bd8deadSopenharmony_ciOnce the repository has been downloaded, if you're running
675bd8deadSopenharmony_ciin a Linux command-line environment and have Python 3, the lxml Python
685bd8deadSopenharmony_cibindings, and libxml installed, you should just be able to invoke
695bd8deadSopenharmony_ci\code{make} and generate C/C++ header files for all the following
705bd8deadSopenharmony_citargets:
715bd8deadSopenharmony_ci
725bd8deadSopenharmony_ci\begin{itemize}
735bd8deadSopenharmony_ci\item \code{GL/glext.h} - OpenGL 1.2 (and later) compatibility profile
745bd8deadSopenharmony_ci      API + extensions
755bd8deadSopenharmony_ci\item \code{GL/glcorearb.h} - OpenGL core profile API + extensions
765bd8deadSopenharmony_ci\item \code{GLES/gl.h} - OpenGL compatibility profile API
775bd8deadSopenharmony_ci\item \code{GLES/glext.h} - OpenGL ES 1.x extensions
785bd8deadSopenharmony_ci\item \code{GLES2/gl2.h} - OpenGL ES 2.x API
795bd8deadSopenharmony_ci\item \code{GLES2/gl2ext.h} - OpenGL ES 2.x extensions
805bd8deadSopenharmony_ci\item \code{GLES3/gl3.h} - OpenGL ES 3.x API
815bd8deadSopenharmony_ci\item \code{GL/glx.h} - GLX API
825bd8deadSopenharmony_ci\item \code{GL/glxext.h} - GLX 1.3 (and later) API + extensions
835bd8deadSopenharmony_ci\item \code{GL/wgl.h} - WGL API
845bd8deadSopenharmony_ci\item \code{GL/wglext.h} - WGL extensions
855bd8deadSopenharmony_ci\item \code{EGL/egl.h} - EGL (still being worked on)
865bd8deadSopenharmony_ci\end{itemize}
875bd8deadSopenharmony_ci
885bd8deadSopenharmony_ciStarting with the Makefile rules and inspecting the files \code{gl.xml},
895bd8deadSopenharmony_ci\code{genheaders.py}, and \code{reg.py} will be necessary if you want to
905bd8deadSopenharmony_cirepurpose the registry for reasons other than header file generation, or
915bd8deadSopenharmony_cito generate headers for languages other than C.
925bd8deadSopenharmony_ci
935bd8deadSopenharmony_ciIf you're running in a Microsoft Windows, MaxOS X, or other non-Linux
945bd8deadSopenharmony_cienvironment, there are equivalent versions of Python and GNU Make, although
955bd8deadSopenharmony_ciwe haven't tested this ourselves. Feedback would be helpful. If you're using
965bd8deadSopenharmony_ciWindows 10, you should probably try to build in the Ubuntu Linux subsystem
975bd8deadSopenharmony_cirather than older Unix emulation environments such as Cygwin.
985bd8deadSopenharmony_ci
995bd8deadSopenharmony_ci
1005bd8deadSopenharmony_ci\subsection{Header Generation Script - \code{genheaders.py}}
1015bd8deadSopenharmony_ci
1025bd8deadSopenharmony_ciWhen generating header files using the \code{genheaders.py} script, an
1035bd8deadSopenharmony_ciAPI name and profile name are required, as shown in the Makefile
1045bd8deadSopenharmony_ciexamples. Additionally, specific versions and extensions can be required
1055bd8deadSopenharmony_cior excluded. Based on this information, the generator script extracts
1065bd8deadSopenharmony_cithe relevant interfaces and creates a C-language header file for them.
1075bd8deadSopenharmony_ci\code{genheaders.py} contains predefined generator options for OpenGL compatibility
1085bd8deadSopenharmony_ciand core profiles, OpenGL ES 1 / 2 / 3, GLX, and WGL headers.
1095bd8deadSopenharmony_ci
1105bd8deadSopenharmony_ciThe generator script is intended to be generalizable to other languages
1115bd8deadSopenharmony_ciby writing new generator classes. Such generators would have to rewrite
1125bd8deadSopenharmony_cithe C types and definitions in the XML to something appropriate to their
1135bd8deadSopenharmony_cilanguage.
1145bd8deadSopenharmony_ci
1155bd8deadSopenharmony_ci\subsection{Registry Processing Script - \code{reg.py}}
1165bd8deadSopenharmony_ci
1175bd8deadSopenharmony_ciActual XML registry processing is done in \code{reg.py}, which contains
1185bd8deadSopenharmony_ciseveral objects and methods for loading registries and extracting
1195bd8deadSopenharmony_ciinterfaces and extensions for use in header generation. There is some
1205bd8deadSopenharmony_ciinternal documentation in the form of comments although nothing more
1215bd8deadSopenharmony_ciextensive exists yet, and it's possible the Python scripts will evolve
1225bd8deadSopenharmony_cisignificantly based on public feedback.
1235bd8deadSopenharmony_ci
1245bd8deadSopenharmony_ci
1255bd8deadSopenharmony_ci\section{XML Registry Schema}
1265bd8deadSopenharmony_ci\label{schema}
1275bd8deadSopenharmony_ci
1285bd8deadSopenharmony_ciThe format of an XML registry is a top level \tag{registry} tag
1295bd8deadSopenharmony_cicontaining \tag{types}, \tag{enums}, \tag{commands}, \tag{feature}, and
1305bd8deadSopenharmony_ci\tag{extension} tags describing the different elements of an API, as
1315bd8deadSopenharmony_ciexplained below. This description corresponds to a formal Relax NG
1325bd8deadSopenharmony_cischema file, \code{registry.rnc}, against which the XML registry files
1335bd8deadSopenharmony_cican be validated.
1345bd8deadSopenharmony_ci
1355bd8deadSopenharmony_ciAt present there are separate registries for:
1365bd8deadSopenharmony_ci
1375bd8deadSopenharmony_ci\begin{itemize}
1385bd8deadSopenharmony_ci\item OpenGL and OpenGL ES - \code{gl.xml}
1395bd8deadSopenharmony_ci\item GLX - \code{glx.xml}
1405bd8deadSopenharmony_ci\item WGL - \code{wgl.xml}
1415bd8deadSopenharmony_ci\item EGL - \code{egl.xml} (still in development)
1425bd8deadSopenharmony_ci\end{itemize}
1435bd8deadSopenharmony_ci
1445bd8deadSopenharmony_ci\subsection{Profiles}
1455bd8deadSopenharmony_ci\label{schema:profile}
1465bd8deadSopenharmony_ci
1475bd8deadSopenharmony_ciTypes and enumerants can have different definitions depending on the API
1485bd8deadSopenharmony_ciprofile requested, which allows us to accomodate minor incompatibilities
1495bd8deadSopenharmony_ciin the OpenGL and OpenGL ES APIs, for example. Features and extensions
1505bd8deadSopenharmony_cican include some elements conditionally depending on the API profile
1515bd8deadSopenharmony_cirequested.
1525bd8deadSopenharmony_ci
1535bd8deadSopenharmony_ci\subsection{API Names}
1545bd8deadSopenharmony_ci\label{schema:apiname}
1555bd8deadSopenharmony_ci
1565bd8deadSopenharmony_ciSeveral tags use a \attr{api} attribute. This is an arbitrary string,
1575bd8deadSopenharmony_cispecified at header generation time, for labelling properties of a
1585bd8deadSopenharmony_cispecific API. The string can be, but is not necessarily, an actual API
1595bd8deadSopenharmony_ciname. As used in \code{genheaders.py} and \code{gl.xml}, the API names
1605bd8deadSopenharmony_ciare \code{gl}, \code{gles1}, and \code{gles2}, corresponding to OpenGL,
1615bd8deadSopenharmony_ciOpenGL ES 1, and OpenGL ES 2/3, respectively.
1625bd8deadSopenharmony_ci
1635bd8deadSopenharmony_ci
1645bd8deadSopenharmony_ci\section{Registry Root (\tag{registry} tag)}
1655bd8deadSopenharmony_ci\label{schema:root}
1665bd8deadSopenharmony_ci
1675bd8deadSopenharmony_ciA \tag{registry} contains the entire definition of one or more related
1685bd8deadSopenharmony_ciAPIs.
1695bd8deadSopenharmony_ci
1705bd8deadSopenharmony_ci\subsection{Attributes of \tag{registry} tags}
1715bd8deadSopenharmony_ci
1725bd8deadSopenharmony_ciNone.
1735bd8deadSopenharmony_ci
1745bd8deadSopenharmony_ci\subsection{Contents of \tag{registry} tags}
1755bd8deadSopenharmony_ci
1765bd8deadSopenharmony_ciZero or more of each of the following tags, normally in this order
1775bd8deadSopenharmony_ci(although order shouldn't be important):
1785bd8deadSopenharmony_ci
1795bd8deadSopenharmony_ci\begin{itemize}
1805bd8deadSopenharmony_ci\item \tag{comment} - Contains arbitrary text, such as a copyright
1815bd8deadSopenharmony_ci      statement. Unused.
1825bd8deadSopenharmony_ci\item \tag{types} (see section~\ref{tag:types}) - defines API types.
1835bd8deadSopenharmony_ci      Usually only one tag is used.
1845bd8deadSopenharmony_ci\item \tag{kinds} (see section~\ref{tag:kinds}) - defines tags
1855bd8deadSopenharmony_ci      that can be used for parameter validation and more expressive types
1865bd8deadSopenharmony_ci       in API bindings for languages other than C. 
1875bd8deadSopenharmony_ci       One parameter can be of multiple kinds, separated by commas.
1885bd8deadSopenharmony_ci\item \tag{groups} (see section~\ref{tag:groups}) - defines named groups
1895bd8deadSopenharmony_ci      of tokens for possible parameter validation in API bindings for
1905bd8deadSopenharmony_ci      languages other than C. Usually only one tag is used.
1915bd8deadSopenharmony_ci\item \tag{enums} (see section~\ref{tag:enums}) - defines API enumerants
1925bd8deadSopenharmony_ci      (tokens). Usually multiple tags are used.
1935bd8deadSopenharmony_ci\item \tag{commands} (see section~\ref{tag:commands}) - defines API
1945bd8deadSopenharmony_ci      commands (functions). Usually only one tag is used.
1955bd8deadSopenharmony_ci\item \tag{feature} (see section~\ref{tag:feature}) - defines API
1965bd8deadSopenharmony_ci      feature interfaces (API versions, more or less). One tag per
1975bd8deadSopenharmony_ci      feature set.
1985bd8deadSopenharmony_ci\item \tag{extensions} (see section~\ref{tag:extensions}) - defines API
1995bd8deadSopenharmony_ci      extension interfaces. Usually only one tag is used, wrapping many
2005bd8deadSopenharmony_ci      extensions.
2015bd8deadSopenharmony_ci\end{itemize}
2025bd8deadSopenharmony_ci
2035bd8deadSopenharmony_ci
2045bd8deadSopenharmony_ci\section{API types (\tag{types} tag)}
2055bd8deadSopenharmony_ci\label{tag:types}
2065bd8deadSopenharmony_ci
2075bd8deadSopenharmony_ciThe \tag{types} tag contains individual \tag{type} tags describing each
2085bd8deadSopenharmony_ciof the derived types used in the API.
2095bd8deadSopenharmony_ci
2105bd8deadSopenharmony_ciEach \tag{type} tag contains legal C code, with attributes or embedded
2115bd8deadSopenharmony_citags denoting the type name.
2125bd8deadSopenharmony_ci
2135bd8deadSopenharmony_ci\subsection{Attributes of \tag{type} tags}
2145bd8deadSopenharmony_ci
2155bd8deadSopenharmony_ci\begin{itemize}
2165bd8deadSopenharmony_ci\item \attr{requires} - another type name this type requires to complete
2175bd8deadSopenharmony_ci      its definition.
2185bd8deadSopenharmony_ci\item \attr{name} - name of this type (if not defined in the tag body).
2195bd8deadSopenharmony_ci\item \attr{api} - an API name (see \tag{feature} below) which
2205bd8deadSopenharmony_ci      specializes this definition of the named type, so that the same
2215bd8deadSopenharmony_ci      API types may have different definitions for e.g. GL ES and GL.
2225bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused).
2235bd8deadSopenharmony_ci\end{itemize}
2245bd8deadSopenharmony_ci
2255bd8deadSopenharmony_ci\subsection{Contents of \tag{type} tags}
2265bd8deadSopenharmony_ci
2275bd8deadSopenharmony_ci\tag{type} contains text which is legal C code for a type declaration.
2285bd8deadSopenharmony_ciIt may also contain embedded tags:
2295bd8deadSopenharmony_ci
2305bd8deadSopenharmony_ci\begin{itemize}
2315bd8deadSopenharmony_ci\item \tag{apientry/} - insert a platform calling convention macro here
2325bd8deadSopenharmony_ci      during header generation, used mostly for function pointer types.
2335bd8deadSopenharmony_ci\item \tag{name} - contains the name of this type (if not defined in the
2345bd8deadSopenharmony_ci      tag attributes).
2355bd8deadSopenharmony_ci\end{itemize}
2365bd8deadSopenharmony_ci
2375bd8deadSopenharmony_ci\subsection{Example of a \tag{types} tag}
2385bd8deadSopenharmony_ci
2395bd8deadSopenharmony_ci\begin{verbatim}
2405bd8deadSopenharmony_ci<types>
2415bd8deadSopenharmony_ci    <type name="stddef"><![CDATA[#include <stddef.h>]]></type>
2425bd8deadSopenharmony_ci    <type requires="stddef">typedef ptrdiff_t <name>GLintptr</name>;</type>
2435bd8deadSopenharmony_ci</types>
2445bd8deadSopenharmony_ci\end{verbatim}
2455bd8deadSopenharmony_ci
2465bd8deadSopenharmony_ciIf the {\tt GLint64} type is required by a command, this will result in
2475bd8deadSopenharmony_cithe following declarations:
2485bd8deadSopenharmony_ci
2495bd8deadSopenharmony_ci\begin{verbatim}
2505bd8deadSopenharmony_ci#include <stddef.h>
2515bd8deadSopenharmony_citypedef ptrdiff_t GLintptr;
2525bd8deadSopenharmony_ci\end{verbatim}
2535bd8deadSopenharmony_ci
2545bd8deadSopenharmony_ci\section{Kinds (\tag{kinds} tag)}
2555bd8deadSopenharmony_ci\label{tag:kinds}
2565bd8deadSopenharmony_ci
2575bd8deadSopenharmony_ciThe \tag{kinds} tag contain individual \tag{kind} tags describing
2585bd8deadSopenharmony_cisome metadata not captured by the \tag{types} tag (see section~\ref{tag:types}) 
2595bd8deadSopenharmony_cior \tag{enums} tag (see section~\ref{tag:groups}).
2605bd8deadSopenharmony_ci
2615bd8deadSopenharmony_ci\subsection{Attributes of (\tag{kinds} tag)}
2625bd8deadSopenharmony_ci
2635bd8deadSopenharmony_ci\begin{itemize}
2645bd8deadSopenharmony_ci\item \attr{name} - the name of the kind.
2655bd8deadSopenharmony_ci\item \attr{desc} - a description of what the kind indicates.
2665bd8deadSopenharmony_ci\end{itemize}
2675bd8deadSopenharmony_ci
2685bd8deadSopenharmony_ci\subsection{Contents of \tag{kinds} tags}
2695bd8deadSopenharmony_ci
2705bd8deadSopenharmony_ciEach \tag{kinds} block contains zero or more \tag{kind} tags, in
2715bd8deadSopenharmony_ciarbitrary order.
2725bd8deadSopenharmony_ci
2735bd8deadSopenharmony_ci\subsection{Example of a \tag{kinds} tag}
2745bd8deadSopenharmony_ci
2755bd8deadSopenharmony_ci\begin{verbatim}
2765bd8deadSopenharmony_ci<kinds>
2775bd8deadSopenharmony_ci    <kind name="Color" desc="This parameter represents part of or a complete color." />
2785bd8deadSopenharmony_ci    <kind name="Clamped[0; 1]" desc="This parameter will get clamped to the 0 to 1 range." />
2795bd8deadSopenharmony_ci</kinds>
2805bd8deadSopenharmony_ci\end{verbatim}
2815bd8deadSopenharmony_ci
2825bd8deadSopenharmony_ci\section{Kind (\tag{kind} tag)}
2835bd8deadSopenharmony_ci\label{tag:kind}
2845bd8deadSopenharmony_ci
2855bd8deadSopenharmony_ciEach \{kind} tag defines a single kind annotation.
2865bd8deadSopenharmony_ci
2875bd8deadSopenharmony_ci\subsection{Attributes of \tag{kind} tag}
2885bd8deadSopenharmony_ci
2895bd8deadSopenharmony_ci\begin{itemize}
2905bd8deadSopenharmony_ci\item \attr{name} - kind name, an arbitrary string without commas (',') used
2915bd8deadSopenharmony_ci      to identify this kind.
2925bd8deadSopenharmony_ci\item \attr{desc} - kind description, a description of what it
2935bd8deadSopenharmony_ci      means for a parameter or return value to be annotated with this kind.
2945bd8deadSopenharmony_ci\end{itemize}
2955bd8deadSopenharmony_ci
2965bd8deadSopenharmony_ci\subsection{Contents of \tag{kind} tag}
2975bd8deadSopenharmony_ci
2985bd8deadSopenharmony_ciNone.
2995bd8deadSopenharmony_ci
3005bd8deadSopenharmony_ci\subsection{Meaning of \tag{kind} tags}
3015bd8deadSopenharmony_ci\label{tag:kind:meaning}
3025bd8deadSopenharmony_ci
3035bd8deadSopenharmony_ciIf a \tag{proto} or \tag{param} tag of a \tag{command} has a
3045bd8deadSopenharmony_ci\attr{kind} attribute defined, and and the comma separated elemenst
3055bd8deadSopenharmony_ciif the attribute matches a \tag{kind} name, 
3065bd8deadSopenharmony_cithen the return type or parameter type is considered to be
3075bd8deadSopenharmony_cifurther defined by the description provided by the \tag{kind} tags
3085bd8deadSopenharmony_ciwith the matching names. C language bindings do not attempt to
3095bd8deadSopenharmony_cienforce this constraint in any way, but other language bindings 
3105bd8deadSopenharmony_cimay try to do so.
3115bd8deadSopenharmony_ci
3125bd8deadSopenharmony_ci\section{Enumerant Groups (\tag{groups} tag)}
3135bd8deadSopenharmony_ci\label{tag:groups}
3145bd8deadSopenharmony_ci
3155bd8deadSopenharmony_ciThe \tag{groups} tags contain individual \tag{group} tags describing
3165bd8deadSopenharmony_cisome of the group annotations used for return and parameter types.
3175bd8deadSopenharmony_ci
3185bd8deadSopenharmony_ci\subsection{Attributes of \tag{groups} tags}
3195bd8deadSopenharmony_ci
3205bd8deadSopenharmony_ciNone.
3215bd8deadSopenharmony_ci
3225bd8deadSopenharmony_ci\subsection{Contents of \tag{groups} tags}
3235bd8deadSopenharmony_ci
3245bd8deadSopenharmony_ciEach \tag{groups} block contains zero or more \tag{group} tags, in
3255bd8deadSopenharmony_ciarbitrary order (although they are typically ordered by group name, to
3265bd8deadSopenharmony_ciimprove human readability).
3275bd8deadSopenharmony_ci
3285bd8deadSopenharmony_ci\subsection{Example of \tag{groups} tags}
3295bd8deadSopenharmony_ci
3305bd8deadSopenharmony_ci\begin{verbatim}
3315bd8deadSopenharmony_ci<groups>
3325bd8deadSopenharmony_ci    <group name="AccumOp">
3335bd8deadSopenharmony_ci        <enum name="GL_ACCUM"/>
3345bd8deadSopenharmony_ci    </group>
3355bd8deadSopenharmony_ci
3365bd8deadSopenharmony_ci    <group name="AttribMask">
3375bd8deadSopenharmony_ci        <enum name="GL_ACCUM_BUFFER_BIT"/>
3385bd8deadSopenharmony_ci        <enum name="GL_ALL_ATTRIB_BITS"/>
3395bd8deadSopenharmony_ci    </group>
3405bd8deadSopenharmony_ci</groups>
3415bd8deadSopenharmony_ci\end{verbatim}
3425bd8deadSopenharmony_ci
3435bd8deadSopenharmony_ci
3445bd8deadSopenharmony_ci\section{Enumerant Group (\tag{group} tag)}
3455bd8deadSopenharmony_ci\label{tag:group}
3465bd8deadSopenharmony_ci
3475bd8deadSopenharmony_ciEach \tag{group} tag defines a single group annotation.
3485bd8deadSopenharmony_ci
3495bd8deadSopenharmony_ci\subsection{Attributes of \tag{group} tags}
3505bd8deadSopenharmony_ci
3515bd8deadSopenharmony_ci\begin{itemize}
3525bd8deadSopenharmony_ci\item \attr{name} - group name, an arbitrary string for grouping a set
3535bd8deadSopenharmony_ci      of enums together within a broader namespace.
3545bd8deadSopenharmony_ci\end{itemize}
3555bd8deadSopenharmony_ci
3565bd8deadSopenharmony_ci\subsection{Contents of \tag{group} tags}
3575bd8deadSopenharmony_ci
3585bd8deadSopenharmony_ci\tag{group} tags may contain zero or more \tag{enum} tags. Each
3595bd8deadSopenharmony_ci\tag{enum} tag may contain only a \attr{name} attribute, which should
3605bd8deadSopenharmony_cicorrespond to a \tag{enum} definition in an \tag{enums} block.
3615bd8deadSopenharmony_ci
3625bd8deadSopenharmony_ci\subsection{Meaning of \tag{group} tags}
3635bd8deadSopenharmony_ci\label{tag:group:meaning}
3645bd8deadSopenharmony_ci
3655bd8deadSopenharmony_ciIf a \tag{proto} or \tag{param} tag of a \tag{command} has a
3665bd8deadSopenharmony_ci\attr{group} attribute defined, and that attribute matches a \tag{group}
3675bd8deadSopenharmony_ciname, then the return type or parameter type is considered to be
3685bd8deadSopenharmony_ciconstrained to values defined by the corresponding \tag{group}. C
3695bd8deadSopenharmony_cilanguage bindings do not attempt to enforce this constraint in any way,
3705bd8deadSopenharmony_cibut other language bindings may try to do so.
3715bd8deadSopenharmony_ci
3725bd8deadSopenharmony_ci
3735bd8deadSopenharmony_ci\section{Enumerant Blocks (\tag{enums} tag)}
3745bd8deadSopenharmony_ci\label{tag:enums}
3755bd8deadSopenharmony_ci
3765bd8deadSopenharmony_ciThe \tag{enums} tags contain individual \tag{enum} tags describing each of the
3775bd8deadSopenharmony_citoken (enumerant) names used in the API.
3785bd8deadSopenharmony_ci
3795bd8deadSopenharmony_ci\subsection{Attributes of \tag{enums} tags}
3805bd8deadSopenharmony_ci
3815bd8deadSopenharmony_ci\begin{itemize}
3825bd8deadSopenharmony_ci\item \attr{namespace} - a string for grouping many different enums
3835bd8deadSopenharmony_ci      together, currently unused but typically something like \code{GL}
3845bd8deadSopenharmony_ci      for all enums in the OpenGL / OpenGL ES shared namespace. Multiple
3855bd8deadSopenharmony_ci      \tag{enums} tags can share the same namespace.
3865bd8deadSopenharmony_ci\item \attr{type} - a string describing the data type of the values of
3875bd8deadSopenharmony_ci      this group of enums, currently unused. The only string used at
3885bd8deadSopenharmony_ci      present in the is \code{bitmask}.
3895bd8deadSopenharmony_ci\item \attr{start}, \attr{end} - integers defining the start and end of
3905bd8deadSopenharmony_ci      a reserved range of enumerants for a particular vendor or purpose.
3915bd8deadSopenharmony_ci      \attr{start} must be $\leq$ \attr{end}. These fields define formal
3925bd8deadSopenharmony_ci      enumerant allocations within a namespace, and are made by the
3935bd8deadSopenharmony_ci      Khronos Registrar on request from implementers following the enum
3945bd8deadSopenharmony_ci      allocation policy.
3955bd8deadSopenharmony_ci\item \attr{vendor} - string describing the vendor or purposes to whom a
3965bd8deadSopenharmony_ci      reserved range of enumerants is allocated.
3975bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused)
3985bd8deadSopenharmony_ci\end{itemize}
3995bd8deadSopenharmony_ci
4005bd8deadSopenharmony_ci\subsection{Contents of \tag{enums} tags}
4015bd8deadSopenharmony_ci
4025bd8deadSopenharmony_ciEach \tag{enums} block contains zero or more \tag{enum} and \tag{unused}
4035bd8deadSopenharmony_citags, in arbitrary order (although they are typically ordered by sorting
4045bd8deadSopenharmony_cion enumerant values, to improve human readability).
4055bd8deadSopenharmony_ci
4065bd8deadSopenharmony_ci\subsection{Example of \tag{enums} tags}
4075bd8deadSopenharmony_ci
4085bd8deadSopenharmony_ci\begin{verbatim}
4095bd8deadSopenharmony_ci<enums namespace="AttribMask" type="bitmask">
4105bd8deadSopenharmony_ci    <enum value="0x00000001"  name="GL_CURRENT_BIT" />
4115bd8deadSopenharmony_ci    <enum value="0x00000002"  name="GL_POINT_BIT" />
4125bd8deadSopenharmony_ci</enums>
4135bd8deadSopenharmony_ci<enums namespace="GL" start="0x80E0" end="0x810F" vendor="MS">
4145bd8deadSopenharmony_ci    <enum value="0x80E0"      name="GL_BGR" />
4155bd8deadSopenharmony_ci        <unused start="0x80E1" end="0x810F" />
4165bd8deadSopenharmony_ci</enums>
4175bd8deadSopenharmony_ci\end{verbatim}
4185bd8deadSopenharmony_ci
4195bd8deadSopenharmony_ciWhen processed into a C header, and assuming all these tokens were
4205bd8deadSopenharmony_cirequired, this results in
4215bd8deadSopenharmony_ci
4225bd8deadSopenharmony_ci\begin{verbatim}
4235bd8deadSopenharmony_ci#define GL_CURRENT_BIT 0x00000001
4245bd8deadSopenharmony_ci#define GL_POINT_BIT   0x00000001
4255bd8deadSopenharmony_ci#define GL_BGR         0x80E0
4265bd8deadSopenharmony_ci\end{verbatim}
4275bd8deadSopenharmony_ci
4285bd8deadSopenharmony_ci
4295bd8deadSopenharmony_ci\section{Enumerants (\tag{enum} tag)}
4305bd8deadSopenharmony_ci\label{tag:enum}
4315bd8deadSopenharmony_ci
4325bd8deadSopenharmony_ciEach \tag{enum} tag defines a single GL (or other API) token.
4335bd8deadSopenharmony_ci
4345bd8deadSopenharmony_ci\subsection{Attributes of \tag{enum} tags}
4355bd8deadSopenharmony_ci
4365bd8deadSopenharmony_ci\begin{itemize}
4375bd8deadSopenharmony_ci\item \attr{value} - enumerant value, a legal C constant (usually a
4385bd8deadSopenharmony_ci      hexadecimal integer).
4395bd8deadSopenharmony_ci\item \attr{name} - enumerant name, a legal C preprocessor token name.
4405bd8deadSopenharmony_ci\item \attr{api} - an API name which specializes this definition of the
4415bd8deadSopenharmony_ci      named enum, so that different APIs may have different values for
4425bd8deadSopenharmony_ci      the same token (used to address a few accidental incompatibilities
4435bd8deadSopenharmony_ci      between GL and GL ES).
4445bd8deadSopenharmony_ci\item \attr{type} - legal C suffix for the value to force it to a
4455bd8deadSopenharmony_ci      specific type. Currently only \code{u} and \code{ull} are used,
4465bd8deadSopenharmony_ci      for \code{unsigned} 32- and 64-bit integer values, respectively.
4475bd8deadSopenharmony_ci      Separated from the \attr{value} field since this eases parsing and
4485bd8deadSopenharmony_ci      sorting of values, and is rarely used.
4495bd8deadSopenharmony_ci\item \attr{group} - group name, an arbitrary string for grouping a set of
4505bd8deadSopenharmony_ci      enums together within a broader namespace.
4515bd8deadSopenharmony_ci      \par {\bf Note:} the \tag{group} tag (see section~\ref{tag:group})
4525bd8deadSopenharmony_ci      serves the same purpose, but is deprecated in favor of this attribute.
4535bd8deadSopenharmony_ci      Eventually all \tag{group} tags will be removed from the XML
4545bd8deadSopenharmony_ci      registries.
4555bd8deadSopenharmony_ci\item \attr{alias} - name of another enumerant this is an alias of, used
4565bd8deadSopenharmony_ci      where token names have been changed as a result of profile changes
4575bd8deadSopenharmony_ci      or for consistency purposes. An enumerant alias is simply a
4585bd8deadSopenharmony_ci      different \attr{name} for the exact same \attr{value}. At present,
4595bd8deadSopenharmony_ci      enumerants which are promoted from extension to core API status
4605bd8deadSopenharmony_ci      are not tagged as aliases - just enumerants tagged as aliases in
4615bd8deadSopenharmony_ci      the {\em Changed Tokens} sections of appendices to the OpenGL
4625bd8deadSopenharmony_ci      Specification. This might change in the future.
4635bd8deadSopenharmony_ci\end{itemize}
4645bd8deadSopenharmony_ci
4655bd8deadSopenharmony_ci\subsection{Contents of \tag{enum} tags}
4665bd8deadSopenharmony_ci
4675bd8deadSopenharmony_ci\tag{enum} tags have no allowed contents. All information is contained
4685bd8deadSopenharmony_ciin the attributes.
4695bd8deadSopenharmony_ci
4705bd8deadSopenharmony_ci
4715bd8deadSopenharmony_ci\section{Unused Enumerants (\tag{unused} tag)}
4725bd8deadSopenharmony_ci\label{tag:unused}
4735bd8deadSopenharmony_ci
4745bd8deadSopenharmony_ciEach \tag{unused} tag defines a range of enumerants which is allocated,
4755bd8deadSopenharmony_cibut not yet assigned to specific enums. This just tracks the unused
4765bd8deadSopenharmony_civalues and is not needed for header generation.
4775bd8deadSopenharmony_ci
4785bd8deadSopenharmony_ci\subsection{Attributes of \tag{unused} tags}
4795bd8deadSopenharmony_ci
4805bd8deadSopenharmony_ci\begin{itemize}
4815bd8deadSopenharmony_ci\item \attr{start}, \attr{end} - integers defining the start and end of
4825bd8deadSopenharmony_ci      an unused range of enumerants. \attr{start} must be $\leq$
4835bd8deadSopenharmony_ci      \attr{end}. This range should not exceed the range reserved by the
4845bd8deadSopenharmony_ci      surrounding \tag{enums} tag.
4855bd8deadSopenharmony_ci\item \attr{vendor} - string describing the vendor or purposes to whom a
4865bd8deadSopenharmony_ci      reserved range of enumerants is allocated. Usually identical to
4875bd8deadSopenharmony_ci      the \attr{vendor} attribute of the surrounding \attr{enums} block.
4885bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused)
4895bd8deadSopenharmony_ci\end{itemize}
4905bd8deadSopenharmony_ci
4915bd8deadSopenharmony_ci\subsection{Contents of \tag{unused} tags}
4925bd8deadSopenharmony_ci
4935bd8deadSopenharmony_ciNone.
4945bd8deadSopenharmony_ci
4955bd8deadSopenharmony_ci
4965bd8deadSopenharmony_ci\section{Command Blocks (\tag{commands} tag)}
4975bd8deadSopenharmony_ci\label{tag:commands}
4985bd8deadSopenharmony_ci
4995bd8deadSopenharmony_ciThe \tag{commands} tag contains definitions of each of the functions
5005bd8deadSopenharmony_ci(commands) used in the API.
5015bd8deadSopenharmony_ci
5025bd8deadSopenharmony_ci\subsection{Attributes of \tag{commands} tags}
5035bd8deadSopenharmony_ci
5045bd8deadSopenharmony_ci\begin{itemize}
5055bd8deadSopenharmony_ci\item \attr{namespace} - a string defining the namespace in which
5065bd8deadSopenharmony_ci      commands live, currently unused but typically something like
5075bd8deadSopenharmony_ci      \code{GL}.
5085bd8deadSopenharmony_ci\end{itemize}
5095bd8deadSopenharmony_ci
5105bd8deadSopenharmony_ci\subsection{Contents of \tag{commands} tags}
5115bd8deadSopenharmony_ci
5125bd8deadSopenharmony_ciEach \tag{commands} block contains zero or more \tag{command} tags, in
5135bd8deadSopenharmony_ciarbitrary order (although they are typically ordered by sorting on the
5145bd8deadSopenharmony_cicommand name, to improve human readability).
5155bd8deadSopenharmony_ci
5165bd8deadSopenharmony_ci
5175bd8deadSopenharmony_ci\section{Commands (\tag{command} tag)}
5185bd8deadSopenharmony_ci\label{tag:command}
5195bd8deadSopenharmony_ci
5205bd8deadSopenharmony_ciThe \tag{command} tag contains a structured definition of a single API
5215bd8deadSopenharmony_cicommand (function).
5225bd8deadSopenharmony_ci
5235bd8deadSopenharmony_ci\subsection{Attributes of \tag{command} tags}
5245bd8deadSopenharmony_ci
5255bd8deadSopenharmony_ci\begin{itemize}
5265bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused).
5275bd8deadSopenharmony_ci\end{itemize}
5285bd8deadSopenharmony_ci
5295bd8deadSopenharmony_ci\subsection{Contents of \tag{command} tags}
5305bd8deadSopenharmony_ci
5315bd8deadSopenharmony_ci\begin{itemize}
5325bd8deadSopenharmony_ci\item \tag{proto} must be the first element, and is a tag defining the C
5335bd8deadSopenharmony_ci      function prototype of a command as described below, up to the
5345bd8deadSopenharmony_ci      function name but not including function parameters.
5355bd8deadSopenharmony_ci\item \tag{param} elements for each command parameter follow, defining
5365bd8deadSopenharmony_ci      its name and type, as described below. If a command takes no
5375bd8deadSopenharmony_ci      arguments, it has no \tag{param} tags.
5385bd8deadSopenharmony_ci\end{itemize}
5395bd8deadSopenharmony_ci
5405bd8deadSopenharmony_ciFollowing these elements, the remaining elements in a \tag{command}
5415bd8deadSopenharmony_citag are optional and may be in any order:
5425bd8deadSopenharmony_ci
5435bd8deadSopenharmony_ci\begin{itemize}
5445bd8deadSopenharmony_ci\item \tag{alias} has one attribute, \attr{name}, containing a string which is the
5455bd8deadSopenharmony_ci      name of another command this command is an alias of, used when
5465bd8deadSopenharmony_ci      promoting a function from extension to ARB or ARB to API status. A
5475bd8deadSopenharmony_ci      command alias describes the case where there are two function
5485bd8deadSopenharmony_ci      names which resolve to the {\bf same} client library code, so (for
5495bd8deadSopenharmony_ci      example) the case where a command is promoted but is also given
5505bd8deadSopenharmony_ci      different GLX protocol would {\bf not} be an alias in this sense.
5515bd8deadSopenharmony_ci\item \tag{vecequiv} has one attribute, \attr{name}, containing a string which is
5525bd8deadSopenharmony_ci      the name of another command which is the {\em vector equivalent}
5535bd8deadSopenharmony_ci      of this command. For example, the vector equivalent of
5545bd8deadSopenharmony_ci      \code{glVertex3f} is \code{glVertex3fv}.
5555bd8deadSopenharmony_ci\item \tag{glx} defines GLX protocol information for this command, as
5565bd8deadSopenharmony_ci      described below. Many GL commands don't have GLX protocol defined,
5575bd8deadSopenharmony_ci      and other APIs such as EGL and WGL don't use GLX at all.
5585bd8deadSopenharmony_ci\end{itemize}
5595bd8deadSopenharmony_ci
5605bd8deadSopenharmony_ci
5615bd8deadSopenharmony_ci\subsection{Command prototype (\tag{proto} tags)}
5625bd8deadSopenharmony_ci\label{tag:command:proto}
5635bd8deadSopenharmony_ci
5645bd8deadSopenharmony_ciThe \tag{proto} tag defines the return type and name of a command.
5655bd8deadSopenharmony_ci
5665bd8deadSopenharmony_ci\subsubsection{Attributes of \tag{proto} tags}
5675bd8deadSopenharmony_ci
5685bd8deadSopenharmony_ci\begin{itemize}
5695bd8deadSopenharmony_ci\item \attr{group} - group name, an arbitrary string.
5705bd8deadSopenharmony_ci\item \attr{kind} - kind list, a comma separated list of names of
5715bd8deadSopenharmony_ci      previously defined \tag{kind} tags.
5725bd8deadSopenharmony_ci\end{itemize}
5735bd8deadSopenharmony_ci
5745bd8deadSopenharmony_ciIf the group name is defined, it may be interpreted as described in
5755bd8deadSopenharmony_cisection~\ref{tag:group:meaning}.
5765bd8deadSopenharmony_ci
5775bd8deadSopenharmony_ci\subsubsection{Contents of \tag{proto} tags}
5785bd8deadSopenharmony_ci
5795bd8deadSopenharmony_ciThe text elements of a \tag{proto} tag, with all other tags removed, is
5805bd8deadSopenharmony_cilegal C code describing the return type and name of a command. In addition
5815bd8deadSopenharmony_ciit may contain two semantic tags:
5825bd8deadSopenharmony_ci
5835bd8deadSopenharmony_ci\begin{itemize}
5845bd8deadSopenharmony_ci\item The \tag{ptype} tag is optional, and contains text which is a
5855bd8deadSopenharmony_ci      valid type name found in \tag{type} tag, and indicates that this
5865bd8deadSopenharmony_ci      type must be previously defined for the definition of the command
5875bd8deadSopenharmony_ci      to succeed. Builtin C types, and any derived types which are
5885bd8deadSopenharmony_ci      expected to be found in other header files, should not be wrapped
5895bd8deadSopenharmony_ci      in \tag{ptype} tags.
5905bd8deadSopenharmony_ci\item The \tag{name} tag is required, and contains the command name
5915bd8deadSopenharmony_ci      being described.
5925bd8deadSopenharmony_ci\end{itemize}
5935bd8deadSopenharmony_ci
5945bd8deadSopenharmony_ci\subsection{Command parameter (\tag{param} tags)}
5955bd8deadSopenharmony_ci\label{tag:command:param}
5965bd8deadSopenharmony_ci
5975bd8deadSopenharmony_ciThe \tag{param} tag defines the type and name of a parameter.
5985bd8deadSopenharmony_ci
5995bd8deadSopenharmony_ci\subsubsection{Attributes of \tag{param} tags}
6005bd8deadSopenharmony_ci
6015bd8deadSopenharmony_ci\begin{itemize}
6025bd8deadSopenharmony_ci\item \attr{group} - group name, an arbitrary string.
6035bd8deadSopenharmony_ci\item \attr{kind} - kind list, a comma separated list of names of
6045bd8deadSopenharmony_ci      previously defined \tag{kind} tags.
6055bd8deadSopenharmony_ci\item \attr{len} - parameter length, either an integer specifying the
6065bd8deadSopenharmony_ci      number of elements of the parameter \tag{ptype}, or a complex
6075bd8deadSopenharmony_ci      string expression with poorly defined syntax, usually representing
6085bd8deadSopenharmony_ci      a length that is computed as a combination of other command
6095bd8deadSopenharmony_ci      parameter values, and possibly current GL state as well.
6105bd8deadSopenharmony_ci\item \attr{class} - an arbitrary string defining the type of object handles
6115bd8deadSopenharmony_ci      passed in this parameter. Handles with different types are not
6125bd8deadSopenharmony_ci      compatible; for example, handles created with
6135bd8deadSopenharmony_ci      \attr{class}{\tt="buffer"} can not be passed to a parameter with
6145bd8deadSopenharmony_ci      \attr{class}{\tt="shader"}.
6155bd8deadSopenharmony_ci\end{itemize}
6165bd8deadSopenharmony_ci
6175bd8deadSopenharmony_ciIf the group name is defined, it may be interpreted as described in
6185bd8deadSopenharmony_cisection~\ref{tag:group:meaning}.
6195bd8deadSopenharmony_ci
6205bd8deadSopenharmony_ci\subsubsection{Contents of \tag{param} tags}
6215bd8deadSopenharmony_ci
6225bd8deadSopenharmony_ciThe text elements of a \tag{param} tag, with all other tags removed, is
6235bd8deadSopenharmony_cilegal C code describing the type and name of a function parameter. In
6245bd8deadSopenharmony_ciaddition it may contain two semantic tags:
6255bd8deadSopenharmony_ci
6265bd8deadSopenharmony_ci\begin{itemize}
6275bd8deadSopenharmony_ci\item The \tag{ptype} tag is optional, and contains text which is a
6285bd8deadSopenharmony_ci      valid type name found in \tag{type} tag, and indicates that this
6295bd8deadSopenharmony_ci      type must be previously defined for the definition of the command
6305bd8deadSopenharmony_ci      to succeed. Builtin C types, and any derived types which are
6315bd8deadSopenharmony_ci      expected to be found in other header files, should not be wrapped
6325bd8deadSopenharmony_ci      in \tag{ptype} tags.
6335bd8deadSopenharmony_ci\item The \tag{name} tag is required, and contains the command name
6345bd8deadSopenharmony_ci      being described.
6355bd8deadSopenharmony_ci\end{itemize}
6365bd8deadSopenharmony_ci
6375bd8deadSopenharmony_ci\subsection{Example of a \tag{commands} tag}
6385bd8deadSopenharmony_ci
6395bd8deadSopenharmony_ci\begin{verbatim}
6405bd8deadSopenharmony_ci<commands>
6415bd8deadSopenharmony_ci    <command>
6425bd8deadSopenharmony_ci        <proto>void <name>glBeginConditionalRenderNV</name></proto>
6435bd8deadSopenharmony_ci        <param><ptype>GLuint</ptype> <name>id</name></param>
6445bd8deadSopenharmony_ci        <param><ptype>GLenum</ptype> <name>mode</name></param>
6455bd8deadSopenharmony_ci        <alias name="glBeginConditionalRender" />
6465bd8deadSopenharmony_ci        <glx type="render" opcode="348" />
6475bd8deadSopenharmony_ci    </command>
6485bd8deadSopenharmony_ci</commands>
6495bd8deadSopenharmony_ci\end{verbatim}
6505bd8deadSopenharmony_ci
6515bd8deadSopenharmony_ciWhen processed into a C header, this results in
6525bd8deadSopenharmony_ci
6535bd8deadSopenharmony_ci\begin{verbatim}
6545bd8deadSopenharmony_civoid glBeginConditionalRenderNV(GLuint id, GLenum mode);
6555bd8deadSopenharmony_ci\end{verbatim}
6565bd8deadSopenharmony_ci
6575bd8deadSopenharmony_ci
6585bd8deadSopenharmony_ci\section{API Features / Versions (\tag{feature} tag)}
6595bd8deadSopenharmony_ci\label{tag:feature}
6605bd8deadSopenharmony_ci
6615bd8deadSopenharmony_ciAPI features are described in individual \tag{feature} tags. A feature
6625bd8deadSopenharmony_ciis the set of interfaces (enumerants and commands) defined by a
6635bd8deadSopenharmony_ciparticular API and version, such as OpenGL 4.0 or OpenGL ES 3.0, and
6645bd8deadSopenharmony_ciincludes all API profiles of that version.
6655bd8deadSopenharmony_ci
6665bd8deadSopenharmony_ci\subsection{Attributes of \tag{feature} tags}
6675bd8deadSopenharmony_ci
6685bd8deadSopenharmony_ci\begin{itemize}
6695bd8deadSopenharmony_ci\item \attr{api} - API name this feature is for (see
6705bd8deadSopenharmony_ci      section~\ref{schema:apiname}), such as \code{gl} or \code{gles2}.
6715bd8deadSopenharmony_ci\item \attr{name} - version name, used as the C preprocessor token under
6725bd8deadSopenharmony_ci      which the version's interfaces are protected against multiple
6735bd8deadSopenharmony_ci      inclusion. Example: \code{GL\_VERSION\_4\_2}.
6745bd8deadSopenharmony_ci\item \attr{protect} - an additional preprocessor token used to protect
6755bd8deadSopenharmony_ci      a feature definition. Usually another feature or extension
6765bd8deadSopenharmony_ci      \attr{name}. Rarely used, for odd circumstances where the
6775bd8deadSopenharmony_ci      definition of a feature or extension requires another to be
6785bd8deadSopenharmony_ci      defined first.
6795bd8deadSopenharmony_ci\item \attr{number} - feature version number, usually a string
6805bd8deadSopenharmony_ci      interpreted as $majorNumber.minorNumber$. Example: \code{4.2}.
6815bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused)
6825bd8deadSopenharmony_ci\end{itemize}
6835bd8deadSopenharmony_ci
6845bd8deadSopenharmony_ci\subsection{Contents of \tag{feature} tags}
6855bd8deadSopenharmony_ci
6865bd8deadSopenharmony_ciZero or more \tag{require} and \tag{remove} tags (see
6875bd8deadSopenharmony_cisection~\ref{tag:required}), in arbitrary order. Each tag describes a
6885bd8deadSopenharmony_ciset of interfaces that is respectively required for, or removed from,
6895bd8deadSopenharmony_cithis feature, as described below.
6905bd8deadSopenharmony_ci
6915bd8deadSopenharmony_ci\subsection{Example of a \tag{feature} tag}
6925bd8deadSopenharmony_ci
6935bd8deadSopenharmony_ci\begin{verbatim}
6945bd8deadSopenharmony_ci<feature api="gl" name="GL_VERSION_3_0" number="3.0">
6955bd8deadSopenharmony_ci    <require>
6965bd8deadSopenharmony_ci        <enum name="GL_COMPARE_REF_TO_TEXTURE" />
6975bd8deadSopenharmony_ci        <enum name="GL_CLIP_DISTANCE0" />
6985bd8deadSopenharmony_ci        <command name="glEndTransformFeedback" />
6995bd8deadSopenharmony_ci    </require>
7005bd8deadSopenharmony_ci    <require profile="compatibility">
7015bd8deadSopenharmony_ci        <enum name="GL_INDEX" />
7025bd8deadSopenharmony_ci    </require>
7035bd8deadSopenharmony_ci</feature>
7045bd8deadSopenharmony_ci\end{verbatim}
7055bd8deadSopenharmony_ci
7065bd8deadSopenharmony_ciWhen processed into a C header for the \code{compatibility} profile of
7075bd8deadSopenharmony_ciOpenGL, this results in (assuming the usual definitions of these GL
7085bd8deadSopenharmony_ciinterfaces):
7095bd8deadSopenharmony_ci
7105bd8deadSopenharmony_ci\begin{verbatim}
7115bd8deadSopenharmony_ci#ifndef GL_VERSION_3_0
7125bd8deadSopenharmony_ci#define GL_VERSION_3_0 1
7135bd8deadSopenharmony_ci#define GL_COMPARE_REF_TO_TEXTURE         0x884E
7145bd8deadSopenharmony_ci#define GL_CLIP_DISTANCE0                 0x3000
7155bd8deadSopenharmony_ci#define GL_INDEX                          0x8222
7165bd8deadSopenharmony_citypedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
7175bd8deadSopenharmony_ci#ifdef GL_GLEXT_PROTOTYPES
7185bd8deadSopenharmony_ciGLAPI void APIENTRY glEndTransformFeedback (void);
7195bd8deadSopenharmony_ci#endif
7205bd8deadSopenharmony_ci#endif /* GL_VERSION_3_0 */
7215bd8deadSopenharmony_ci\end{verbatim}
7225bd8deadSopenharmony_ci
7235bd8deadSopenharmony_ciIf processed into a header for the \code{core} profile, the definition of
7245bd8deadSopenharmony_ci\code{GL\_INDEX} would not appear.
7255bd8deadSopenharmony_ci
7265bd8deadSopenharmony_ci
7275bd8deadSopenharmony_ci\section{Extension Blocks (\tag{extensions} tag)}
7285bd8deadSopenharmony_ci\label{tag:extensions}
7295bd8deadSopenharmony_ci
7305bd8deadSopenharmony_ciThe \tag{extensions} tag contains definitions of each of the extenions
7315bd8deadSopenharmony_ciwhich are defined for the API.
7325bd8deadSopenharmony_ci
7335bd8deadSopenharmony_ci\subsection{Attributes of \tag{extensions} tags}
7345bd8deadSopenharmony_ci
7355bd8deadSopenharmony_ciNone.
7365bd8deadSopenharmony_ci
7375bd8deadSopenharmony_ci\subsection{Contents of \tag{extensions} tags}
7385bd8deadSopenharmony_ci
7395bd8deadSopenharmony_ciEach \tag{extensions} block contains zero or more \tag{extension} tags,
7405bd8deadSopenharmony_cieach describing an API extension, in arbitrary order (although they are
7415bd8deadSopenharmony_citypically ordered by sorting on the extension name, to improve human
7425bd8deadSopenharmony_cireadability).
7435bd8deadSopenharmony_ci
7445bd8deadSopenharmony_ci
7455bd8deadSopenharmony_ci\section{API Extensions (\tag{extension} tag)}
7465bd8deadSopenharmony_ci\label{tag:extension}
7475bd8deadSopenharmony_ci
7485bd8deadSopenharmony_ciAPI extensions are described in individual \tag{extension} tags. An
7495bd8deadSopenharmony_ciextension is the set of interfaces defined by a particular API extension
7505bd8deadSopenharmony_cispecification, such as \code{ARB\_multitexture}. \tag{extension} is
7515bd8deadSopenharmony_cisimilar to \tag{feature}, but instead of having \attr{version} and
7525bd8deadSopenharmony_ci\attr{profile} attributes, instead has a \attr{supported} attribute,
7535bd8deadSopenharmony_ciwhich describes the set of API names which the extension can potentially
7545bd8deadSopenharmony_cibe implemented against.
7555bd8deadSopenharmony_ci
7565bd8deadSopenharmony_ci\subsection{Attributes of \tag{extension} tags}
7575bd8deadSopenharmony_ci
7585bd8deadSopenharmony_ci\begin{itemize}
7595bd8deadSopenharmony_ci\item \attr{supported} - a regular expression, with an implicit
7605bd8deadSopenharmony_ci      \code{\^{}} and \code{\$} bracketing it, which should match the
7615bd8deadSopenharmony_ci      \attr{api} tag of a set of \tag{feature} tags.
7625bd8deadSopenharmony_ci\item \attr{protect} - an additional preprocessor token used to protect
7635bd8deadSopenharmony_ci      an extension definition. Usually another feature or extension
7645bd8deadSopenharmony_ci      \attr{name}. Rarely used, for odd circumstances where the
7655bd8deadSopenharmony_ci      definition of an extension requires another to be defined first.
7665bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused)
7675bd8deadSopenharmony_ci\end{itemize}
7685bd8deadSopenharmony_ci
7695bd8deadSopenharmony_ci\subsection{Contents of \tag{extension} tags}
7705bd8deadSopenharmony_ci
7715bd8deadSopenharmony_ciZero or more \tag{require} and \tag{remove} tags (see
7725bd8deadSopenharmony_cisection~\ref{tag:required}), in arbitrary order. Each tag describes a
7735bd8deadSopenharmony_ciset of interfaces that is respectively required for, or removed from,
7745bd8deadSopenharmony_cithis extension, as described below.
7755bd8deadSopenharmony_ci
7765bd8deadSopenharmony_ci\subsection{Example of an \tag{extensions} tag}
7775bd8deadSopenharmony_ci
7785bd8deadSopenharmony_ci\begin{verbatim}
7795bd8deadSopenharmony_ci<extensions>
7805bd8deadSopenharmony_ci    <extension name="GL_ARB_robustness" supported="gl|glcore" >
7815bd8deadSopenharmony_ci        <require>
7825bd8deadSopenharmony_ci            <enum name="GL_NO_ERROR" />
7835bd8deadSopenharmony_ci            <command name="glGetGraphicsResetStatusARB" />
7845bd8deadSopenharmony_ci        </require>
7855bd8deadSopenharmony_ci        <require api="gl" profile="compatibility">
7865bd8deadSopenharmony_ci            <command name="glGetnMapdvARB" />
7875bd8deadSopenharmony_ci        </require>
7885bd8deadSopenharmony_ci    </extension>
7895bd8deadSopenharmony_ci</extensions>
7905bd8deadSopenharmony_ci\end{verbatim}
7915bd8deadSopenharmony_ci
7925bd8deadSopenharmony_ciThe \attr{supported} attribute says that the extension can be supported for
7935bd8deadSopenharmony_cieither the GL compatibility (\code{gl}) or GL core (\code{glcore}) API
7945bd8deadSopenharmony_ciprofiles, but not for other APIs. When processed into a C header for the
7955bd8deadSopenharmony_ci\code{core} profile of OpenGL, this results in (assuming the usual
7965bd8deadSopenharmony_cidefinitions of these GL interfaces):
7975bd8deadSopenharmony_ci
7985bd8deadSopenharmony_ci\begin{verbatim}
7995bd8deadSopenharmony_ci#ifndef GL_ARB_robustness
8005bd8deadSopenharmony_ci#define GL_ARB_robustness 1
8015bd8deadSopenharmony_ci#define GL_NO_ERROR                       0
8025bd8deadSopenharmony_citypedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);
8035bd8deadSopenharmony_ci#ifdef GL_GLEXT_PROTOTYPES
8045bd8deadSopenharmony_ciGLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void);
8055bd8deadSopenharmony_ci#endif
8065bd8deadSopenharmony_ci#endif /* GL_ARB_robustness */
8075bd8deadSopenharmony_ci\end{verbatim}
8085bd8deadSopenharmony_ci
8095bd8deadSopenharmony_ci
8105bd8deadSopenharmony_ci\section{Required and Removed Interfaces (\tag{require} and \tag{remove} tags)}
8115bd8deadSopenharmony_ci\label{tag:required}
8125bd8deadSopenharmony_ci
8135bd8deadSopenharmony_ciA \tag{require} block defines a set of interfaces (types, enumerants and
8145bd8deadSopenharmony_cicommands) {\em required} by a \tag{feature} or \tag{extension}. A
8155bd8deadSopenharmony_ci\tag{remove} block defines a set of interfaces {\em removed} by a
8165bd8deadSopenharmony_ci\tag{feature} (this is primarily useful for the OpenGL core profile,
8175bd8deadSopenharmony_ciwhich removed many interfaces - extensions should never remove
8185bd8deadSopenharmony_ciinterfaces, although this usage is allowed by the schema). Except for
8195bd8deadSopenharmony_cithe tag name and behavior, the contents of \tag{require} and
8205bd8deadSopenharmony_ci\tag{remove} tags are identical.
8215bd8deadSopenharmony_ci
8225bd8deadSopenharmony_ci\subsection{Attributes of \tag{require} and \tag{remove} tags}
8235bd8deadSopenharmony_ci
8245bd8deadSopenharmony_ci\begin{itemize}
8255bd8deadSopenharmony_ci\item \attr{profile} - string name of an API profile. Interfaces in the
8265bd8deadSopenharmony_ci      tag are only required (or removed) if the specified profile is
8275bd8deadSopenharmony_ci      being generated. If not specified, interfaces are required (or
8285bd8deadSopenharmony_ci      removed) for all API profiles.
8295bd8deadSopenharmony_ci\item \attr{comment} - arbitrary string (unused)
8305bd8deadSopenharmony_ci\item \attr{api} - an API name (see section~\ref{schema:apiname}). Interfaces
8315bd8deadSopenharmony_ci      in the tag are only required (or removed) if the specified API is
8325bd8deadSopenharmony_ci      being generated. If not specified, interfaces are required (or
8335bd8deadSopenharmony_ci      removed) for all APIs.
8345bd8deadSopenharmony_ci
8355bd8deadSopenharmony_ci      {\bf The \attr{api} attribute is only supported inside
8365bd8deadSopenharmony_ci      \tag{extension} tags,} since \tag{feature} tags already define a
8375bd8deadSopenharmony_ci      specific API.
8385bd8deadSopenharmony_ci\end{itemize}
8395bd8deadSopenharmony_ci
8405bd8deadSopenharmony_ci\subsection{Contents of \tag{require} and \tag{remove} tags}
8415bd8deadSopenharmony_ci
8425bd8deadSopenharmony_ciZero or more of the following tags, in any order:
8435bd8deadSopenharmony_ci
8445bd8deadSopenharmony_ci\begin{itemize}
8455bd8deadSopenharmony_ci\item \tag{command} specifies an required (or removed) command defined
8465bd8deadSopenharmony_ci      in a \tag{commands} block. The tag has no content, but contains
8475bd8deadSopenharmony_ci      elements:
8485bd8deadSopenharmony_ci
8495bd8deadSopenharmony_ci      \begin{itemize}
8505bd8deadSopenharmony_ci      \item \attr{name} - name of the command (required).
8515bd8deadSopenharmony_ci      \item \attr{comment} - arbitrary string (optional and unused).
8525bd8deadSopenharmony_ci      \end{itemize}
8535bd8deadSopenharmony_ci\item \tag{enum} specifies an required (or removed) enumerant defined in
8545bd8deadSopenharmony_ci      a \tag{enums} block. The tag has no content, but contains
8555bd8deadSopenharmony_ci      elements:
8565bd8deadSopenharmony_ci
8575bd8deadSopenharmony_ci      \begin{itemize}
8585bd8deadSopenharmony_ci      \item \attr{name} - name of the enumerant (required).
8595bd8deadSopenharmony_ci      \item \attr{comment} - arbitrary string (optional and unused).
8605bd8deadSopenharmony_ci      \end{itemize}
8615bd8deadSopenharmony_ci\item \tag{type} specifies a required (or removed) type defined in a
8625bd8deadSopenharmony_ci      \tag{types} block. Most types are picked up implicitly by using
8635bd8deadSopenharmony_ci      the \tag{ptype} tags of commands, but in a few cases, additional
8645bd8deadSopenharmony_ci      types need to be specified explicitly (it is unlikely that a type
8655bd8deadSopenharmony_ci      would ever be removed, although this usage is allowed by the
8665bd8deadSopenharmony_ci      schema). The tag has no content, but contains elements:
8675bd8deadSopenharmony_ci
8685bd8deadSopenharmony_ci      \begin{itemize}
8695bd8deadSopenharmony_ci      \item \attr{name} - name of the type (required).
8705bd8deadSopenharmony_ci      \item \attr{comment} - arbitrary string (optional and unused).
8715bd8deadSopenharmony_ci      \end{itemize}
8725bd8deadSopenharmony_ci\end{itemize}
8735bd8deadSopenharmony_ci
8745bd8deadSopenharmony_ci
8755bd8deadSopenharmony_ci\section{General Discussion}
8765bd8deadSopenharmony_ci\label{general}
8775bd8deadSopenharmony_ci
8785bd8deadSopenharmony_ci
8795bd8deadSopenharmony_ci\subsection{Stability of the XML Database and Schema}
8805bd8deadSopenharmony_ci\label{general:stability}
8815bd8deadSopenharmony_ci
8825bd8deadSopenharmony_ciThe new registry schema, scripts, and databases are evolving in response
8835bd8deadSopenharmony_cito feedback and to Khronos' own wishlist. This means the XML schema is
8845bd8deadSopenharmony_cisubject to change, although most such change will probably be confined
8855bd8deadSopenharmony_cito adding attributes to existing tags. The XML databases such as
8865bd8deadSopenharmony_ci\code{gl.xml} will evolve in response to schema changes, to new
8875bd8deadSopenharmony_ciextensions and API versions, and to general cleanup, such as
8885bd8deadSopenharmony_cicanonicalization of the XML or sorting of \tag{command} and
8895bd8deadSopenharmony_ci\tag{extension} tags by name. Changes to the schema will be described in
8905bd8deadSopenharmony_cithe change log of this document (see section~\ref{changelog}). Changes
8915bd8deadSopenharmony_cito the \code{.xml} files will be described in Github revision history.
8925bd8deadSopenharmony_ci
8935bd8deadSopenharmony_ci
8945bd8deadSopenharmony_ci\subsection{Feature Enhancements to the Registry}
8955bd8deadSopenharmony_ci\label{general:enhancements}
8965bd8deadSopenharmony_ci
8975bd8deadSopenharmony_ciThere are lots of tools and additional tags that would make the XML format
8985bd8deadSopenharmony_cimore expressive and the tools more capable. Khronos is open to hosting
8995bd8deadSopenharmony_ciadditional processing scripts for other purposes related to the definition
9005bd8deadSopenharmony_ciof the API and bindings to it.
9015bd8deadSopenharmony_ci
9025bd8deadSopenharmony_ciA partial wishlist follows:
9035bd8deadSopenharmony_ci
9045bd8deadSopenharmony_ci\begin{itemize}
9055bd8deadSopenharmony_ci\item Enhance \tag{command} \tag{alias} tags to describe more relaxed
9065bd8deadSopenharmony_ci      sorts of aliases, such as commands equivalent in behavior and
9075bd8deadSopenharmony_ci      interface, but using different GLX protocol (this might be called
9085bd8deadSopenharmony_ci      a {\em client-side alias} or something of the sort).
9095bd8deadSopenharmony_ci\end{itemize}
9105bd8deadSopenharmony_ci
9115bd8deadSopenharmony_ci\subsection{Type Annotations and Relationship to \code{.spec} Files}
9125bd8deadSopenharmony_ci\label{general:annotations}
9135bd8deadSopenharmony_ci
9145bd8deadSopenharmony_ciThe initial releases of the XML Registry did not include type annotation
9155bd8deadSopenharmony_ciand array length information from the old \code{.spec} files, which
9165bd8deadSopenharmony_cigenerated a number of complaints from people writing bindings of OpenGL
9175bd8deadSopenharmony_cito languages other than C. The majority of these annotations have now
9185bd8deadSopenharmony_cibeen added to the XML, in the form of \tag{group} tags (see
9195bd8deadSopenharmony_cisection~\ref{tag:group}) defining groups of related enumerants,
9205bd8deadSopenharmony_ci\attr{group} attributes on \tag{proto} and \tag{param} tags specifying
9215bd8deadSopenharmony_cithat the corresponding return type belongs to a group, and \attr{len}
9225bd8deadSopenharmony_ciattributes on \tag{param} tags specifying the array length of the
9235bd8deadSopenharmony_cicorresponding parameter.
9245bd8deadSopenharmony_ci
9255bd8deadSopenharmony_ciThere are many caveats regarding these annotations. For the most part
9265bd8deadSopenharmony_cithey date from SGI's OpenGL 1.1 implementation, and have not been
9275bd8deadSopenharmony_ciupdated. The defined \tag{group}s therefore do not cover many API
9285bd8deadSopenharmony_ciparameters which {\bf could} be given a group, and in many cases, the
9295bd8deadSopenharmony_cidefined \tag{group}s have not been updated to add new enumerants from
9305bd8deadSopenharmony_cilater versions of OpenGL and OpenGL extensions. The group names are
9315bd8deadSopenharmony_cioften somewhat misleading (with imbedded vendor extension tags, while
9325bd8deadSopenharmony_cithe corresponding features have been promoted).
9335bd8deadSopenharmony_ci
9345bd8deadSopenharmony_ciThe \tag{group}s added to \code{gl.xml} are the enumerant groups defined
9355bd8deadSopenharmony_ciin \code{enum.spec}, and \code{enumext.spec}. Many additional group
9365bd8deadSopenharmony_cinames were used in the annotations in \code{gl.spec}, and they
9375bd8deadSopenharmony_cifall in several categories discussed below.
9385bd8deadSopenharmony_ci
9395bd8deadSopenharmony_ci
9405bd8deadSopenharmony_ci\subsubsection{Simple API Type Aliases}
9415bd8deadSopenharmony_ci
9425bd8deadSopenharmony_ciGroup names that were simply an alias for a GL type have been left
9435bd8deadSopenharmony_cientirely out of \code{gl.xml}, since they offer no useful additional
9445bd8deadSopenharmony_ciinformation.
9455bd8deadSopenharmony_ci
9465bd8deadSopenharmony_ciFor example, a parameter described as \code{UInt32} in \code{gl.spec} is
9475bd8deadSopenharmony_cinot annotated with \code{group="UInt32"} in \code{gl.xml}, because this
9485bd8deadSopenharmony_cioffers no information about the parameter not already present in its
9495bd8deadSopenharmony_cideclaration as \code{<ptype>GLuint</ptype>}.
9505bd8deadSopenharmony_ci
9515bd8deadSopenharmony_ciA few examples of such groups are \code{cl\_context},
9525bd8deadSopenharmony_ci\code{handleARB}, \code{Int32}, and \code{sync}.
9535bd8deadSopenharmony_ci
9545bd8deadSopenharmony_ci
9555bd8deadSopenharmony_ci\subsubsection{Numeric Constraints}
9565bd8deadSopenharmony_ci
9575bd8deadSopenharmony_ciGroup names representing some type of numerical constraint on a value
9585bd8deadSopenharmony_ciare retained in \tag{proto} and \tag{param} \attr{group} attributes, but
9595bd8deadSopenharmony_cino definition exists. This is because the existing \tag{group} mechanism
9605bd8deadSopenharmony_cican only describe constraints to specific enumerant names.
9615bd8deadSopenharmony_ci
9625bd8deadSopenharmony_ciThis is not a regression relative to the \code{.spec} files, which also
9635bd8deadSopenharmony_cidid not describe the meaning of these groups.
9645bd8deadSopenharmony_ci
9655bd8deadSopenharmony_ciA few examples of such groups are \code{CheckedFloat32},
9665bd8deadSopenharmony_ci\code{ClampedFixed}, and \code{CoordD}.
9675bd8deadSopenharmony_ci
9685bd8deadSopenharmony_ci
9695bd8deadSopenharmony_ci\subsubsection{GL Object Names}
9705bd8deadSopenharmony_ci
9715bd8deadSopenharmony_ciGroup names representing an object name obtained from e.g. a
9725bd8deadSopenharmony_ci\code{glGen*} command, such as a display list name, are retained in in
9735bd8deadSopenharmony_ci\tag{proto} and \tag{param} \attr{group} attributes, but no definition
9745bd8deadSopenharmony_ciexists. This is because the existing \tag{group} mechanism can only
9755bd8deadSopenharmony_cidescribe constraints to specific enumerant names.
9765bd8deadSopenharmony_ci
9775bd8deadSopenharmony_ciThis is not a regression relative to the \code{.spec} files, which also
9785bd8deadSopenharmony_cidid not describe the meaning of these groups.
9795bd8deadSopenharmony_ci
9805bd8deadSopenharmony_ciA few examples of such groups are \code{List} and \code{Path}.
9815bd8deadSopenharmony_ci
9825bd8deadSopenharmony_ci
9835bd8deadSopenharmony_ci\subsubsection{Groups Not Defined Yet}
9845bd8deadSopenharmony_ci
9855bd8deadSopenharmony_ciGroup names representing enumerant groups which were not defined in
9865bd8deadSopenharmony_ci\code{enum.spec} and \code{enumext.spec} are retained in \tag{proto} and
9875bd8deadSopenharmony_ci\tag{param} \attr{group} attributes, but no definition exists. Such
9885bd8deadSopenharmony_cigroups usually are a result of vendors contributing \code{gl.spec}
9895bd8deadSopenharmony_cientries for an extension without contributing corresponding
9905bd8deadSopenharmony_ci\code{enum.spec} entries.
9915bd8deadSopenharmony_ci
9925bd8deadSopenharmony_ciThis is not a regression relative to the \code{.spec} files, which also
9935bd8deadSopenharmony_cidid not describe the meaning of these groups.
9945bd8deadSopenharmony_ci
9955bd8deadSopenharmony_ciA few examples of such groups are \code{ArrayObjectPNameATI},
9965bd8deadSopenharmony_ci\code{BinormalPointerTypeEXT}, and \code{SpriteParameterNameSGIX}.
9975bd8deadSopenharmony_ci
9985bd8deadSopenharmony_ci
9995bd8deadSopenharmony_ci\subsubsection{Other Groups}
10005bd8deadSopenharmony_ci
10015bd8deadSopenharmony_ciThere are probably a few groups which are present in \code{gl.xml} but
10025bd8deadSopenharmony_cishould not be. These can be gradually cleaned up over time.
10035bd8deadSopenharmony_ci
10045bd8deadSopenharmony_ci
10055bd8deadSopenharmony_ci\subsubsection{Validating Groups}
10065bd8deadSopenharmony_ci
10075bd8deadSopenharmony_ciThe \code{genheaders.py} script has been enhanced to allow validating
10085bd8deadSopenharmony_cigroups during header generation. Invoking it with the
10095bd8deadSopenharmony_ci\code{-validate} option, for example via:
10105bd8deadSopenharmony_ci
10115bd8deadSopenharmony_ci\code{\$ genheaders.py -validate -registry gl.xml}
10125bd8deadSopenharmony_ci
10135bd8deadSopenharmony_ci\noindent will generate a text dump on standard output showing all
10145bd8deadSopenharmony_ciparameter type \attr{group} attributes which do {\bf not} have
10155bd8deadSopenharmony_cicorresponding \tag{group} tags.
10165bd8deadSopenharmony_ci
10175bd8deadSopenharmony_ci
10185bd8deadSopenharmony_ci\section{Change Log}
10195bd8deadSopenharmony_ci\label{changelog}
10205bd8deadSopenharmony_ci
10215bd8deadSopenharmony_ci\begin{itemize}
10225bd8deadSopenharmony_ci\item 2020-10-27 - Add \attr{class} attribute to \tag{param} tags (github
10235bd8deadSopenharmony_ci      pull request 428), update document title and make minor tweaks to
10245bd8deadSopenharmony_ci      reflect this not being the only Khronos XML API schema in use, and
10255bd8deadSopenharmony_ci      having migrated from Subversion to Github.
10265bd8deadSopenharmony_ci\item 2020-01-11 - Add \attr{group} attribute to \tag{enum} tags, and
10275bd8deadSopenharmony_ci      deprecate \tag{group} tags (github issue 335).
10285bd8deadSopenharmony_ci\item 2017-01-20 - Update for the move to the new github repository.
10295bd8deadSopenharmony_ci\item 2014-06-16 - Add \tag{vendor} attribute to \tag{unused} tags.
10305bd8deadSopenharmony_ci\item 2013-09-17 - Add \tag{comment} attribute to \tag{command} tags
10315bd8deadSopenharmony_ci      within \tag{commands}.
10325bd8deadSopenharmony_ci\item 2013-06-24 - Add \tag{groups} and \tag{group} tags, renamed
10335bd8deadSopenharmony_ci      \tag{enums} attribute \attr{class} to \attr{group}, and add
10345bd8deadSopenharmony_ci      parameter type annotation attributes \attr{group} and \attr{len}
10355bd8deadSopenharmony_ci      to both \tag{proto} and \tag{param}. Add
10365bd8deadSopenharmony_ci      section~\ref{general:annotations} discussing limitations of these
10375bd8deadSopenharmony_ci      annotations. Still need to add examples of the annotation
10385bd8deadSopenharmony_ci      attributes.
10395bd8deadSopenharmony_ci\item 2013-06-19 - Added \tag{extensions} tag block as a wrapper around
10405bd8deadSopenharmony_ci      groups of \tag{extension} tags, to ease XML transformations such
10415bd8deadSopenharmony_ci      as sorting extensions by name.
10425bd8deadSopenharmony_ci\item 2013-06-14 - Expanded description of tags, better formatting
10435bd8deadSopenharmony_ci\item 2013-06-12 - First release, text file format
10445bd8deadSopenharmony_ci\end{itemize}
10455bd8deadSopenharmony_ci
10465bd8deadSopenharmony_ci\input{readme.ind}
10475bd8deadSopenharmony_ci
10485bd8deadSopenharmony_ci% \printindex
10495bd8deadSopenharmony_ci
10505bd8deadSopenharmony_ci\end{document}
1051