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