1051 lines
40 KiB
TeX
1051 lines
40 KiB
TeX
\documentclass{article}
|
|
|
|
% Various packages of possible use. {index} creates problems for some reason.
|
|
% \usepackage{index}
|
|
\def\specpdftitle{The Khronos OpenGL API Registry Schema}
|
|
\usepackage[pdftex,bookmarksnumbered=true,linktocpage,plainpages=false,pdftitle={\specpdftitle},colorlinks=true]{hyperref}
|
|
\usepackage{amsmath,enumerate,epsfig,framed,mdframed,multicol,longtable,times,url}
|
|
\usepackage[normalem]{ulem}
|
|
% underscore allows use of _ instead of \_ in text. [strings] allows _ in file names
|
|
\usepackage[strings]{underscore}
|
|
\usepackage[breakwords,fit]{truncate}
|
|
|
|
\makeatletter
|
|
\makeatother
|
|
\makeindex
|
|
|
|
% Some commonly used abbreviations
|
|
|
|
\def\code#1{{\tt #1}}
|
|
\def\tag#1{{\tt <#1>\index{<#1>}}}
|
|
\def\attr#1{{\tt #1\index{#1}}}
|
|
|
|
\begin{document}
|
|
|
|
\title{The Khronos OpenGL API Registry Schema}
|
|
\author{Jon Leech}
|
|
\date{Last updated 2020-10-27}
|
|
\maketitle
|
|
|
|
\begin{abstract}
|
|
|
|
This document describes the Khronos OpenGL API Registry XML schema, and provides
|
|
some additional information about using the registry and scripts to generate
|
|
C header files. The underlying XML files and scripts, as well as headers
|
|
generated from the current authoritative copy of the XML files, can be
|
|
obtained from the OpenGL-Registry github repository at
|
|
|
|
\begin{center}
|
|
{\bf \href{https://github.com/KhronosGroup/OpenGL-Registry}
|
|
{https://github.com/KhronosGroup/OpenGL-Registry}}
|
|
\end{center}
|
|
|
|
\end{abstract}
|
|
|
|
\tableofcontents
|
|
|
|
\section{Introduction}
|
|
|
|
The registry uses an XML representation of the API and a set of Python 3
|
|
scripts to manipulate the XML, based on the lxml Python bindings. It comes
|
|
with an XML schema and validator. Outside users are welcome to submit pull
|
|
requests on github, although the XML schema itself is mature and unlikely to
|
|
change at this point.
|
|
|
|
Other APIs defined by Khronos, such as Vulkan and OpenXR, use a similar XML
|
|
schema originally based on the OpenGL schema to describe those APIs.
|
|
|
|
Some groups outside Khronos have their own XML based API descriptions,
|
|
often used for additional purposes such as library code generators or
|
|
extension loaders, and it may be desirable to construct XSLT or other
|
|
translators between the schema.
|
|
|
|
|
|
\section{Getting Started}
|
|
|
|
Once the repository has been downloaded, if you're running
|
|
in a Linux command-line environment and have Python 3, the lxml Python
|
|
bindings, and libxml installed, you should just be able to invoke
|
|
\code{make} and generate C/C++ header files for all the following
|
|
targets:
|
|
|
|
\begin{itemize}
|
|
\item \code{GL/glext.h} - OpenGL 1.2 (and later) compatibility profile
|
|
API + extensions
|
|
\item \code{GL/glcorearb.h} - OpenGL core profile API + extensions
|
|
\item \code{GLES/gl.h} - OpenGL compatibility profile API
|
|
\item \code{GLES/glext.h} - OpenGL ES 1.x extensions
|
|
\item \code{GLES2/gl2.h} - OpenGL ES 2.x API
|
|
\item \code{GLES2/gl2ext.h} - OpenGL ES 2.x extensions
|
|
\item \code{GLES3/gl3.h} - OpenGL ES 3.x API
|
|
\item \code{GL/glx.h} - GLX API
|
|
\item \code{GL/glxext.h} - GLX 1.3 (and later) API + extensions
|
|
\item \code{GL/wgl.h} - WGL API
|
|
\item \code{GL/wglext.h} - WGL extensions
|
|
\item \code{EGL/egl.h} - EGL (still being worked on)
|
|
\end{itemize}
|
|
|
|
Starting with the Makefile rules and inspecting the files \code{gl.xml},
|
|
\code{genheaders.py}, and \code{reg.py} will be necessary if you want to
|
|
repurpose the registry for reasons other than header file generation, or
|
|
to generate headers for languages other than C.
|
|
|
|
If you're running in a Microsoft Windows, MaxOS X, or other non-Linux
|
|
environment, there are equivalent versions of Python and GNU Make, although
|
|
we haven't tested this ourselves. Feedback would be helpful. If you're using
|
|
Windows 10, you should probably try to build in the Ubuntu Linux subsystem
|
|
rather than older Unix emulation environments such as Cygwin.
|
|
|
|
|
|
\subsection{Header Generation Script - \code{genheaders.py}}
|
|
|
|
When generating header files using the \code{genheaders.py} script, an
|
|
API name and profile name are required, as shown in the Makefile
|
|
examples. Additionally, specific versions and extensions can be required
|
|
or excluded. Based on this information, the generator script extracts
|
|
the relevant interfaces and creates a C-language header file for them.
|
|
\code{genheaders.py} contains predefined generator options for OpenGL compatibility
|
|
and core profiles, OpenGL ES 1 / 2 / 3, GLX, and WGL headers.
|
|
|
|
The generator script is intended to be generalizable to other languages
|
|
by writing new generator classes. Such generators would have to rewrite
|
|
the C types and definitions in the XML to something appropriate to their
|
|
language.
|
|
|
|
\subsection{Registry Processing Script - \code{reg.py}}
|
|
|
|
Actual XML registry processing is done in \code{reg.py}, which contains
|
|
several objects and methods for loading registries and extracting
|
|
interfaces and extensions for use in header generation. There is some
|
|
internal documentation in the form of comments although nothing more
|
|
extensive exists yet, and it's possible the Python scripts will evolve
|
|
significantly based on public feedback.
|
|
|
|
|
|
\section{XML Registry Schema}
|
|
\label{schema}
|
|
|
|
The format of an XML registry is a top level \tag{registry} tag
|
|
containing \tag{types}, \tag{enums}, \tag{commands}, \tag{feature}, and
|
|
\tag{extension} tags describing the different elements of an API, as
|
|
explained below. This description corresponds to a formal Relax NG
|
|
schema file, \code{registry.rnc}, against which the XML registry files
|
|
can be validated.
|
|
|
|
At present there are separate registries for:
|
|
|
|
\begin{itemize}
|
|
\item OpenGL and OpenGL ES - \code{gl.xml}
|
|
\item GLX - \code{glx.xml}
|
|
\item WGL - \code{wgl.xml}
|
|
\item EGL - \code{egl.xml} (still in development)
|
|
\end{itemize}
|
|
|
|
\subsection{Profiles}
|
|
\label{schema:profile}
|
|
|
|
Types and enumerants can have different definitions depending on the API
|
|
profile requested, which allows us to accomodate minor incompatibilities
|
|
in the OpenGL and OpenGL ES APIs, for example. Features and extensions
|
|
can include some elements conditionally depending on the API profile
|
|
requested.
|
|
|
|
\subsection{API Names}
|
|
\label{schema:apiname}
|
|
|
|
Several tags use a \attr{api} attribute. This is an arbitrary string,
|
|
specified at header generation time, for labelling properties of a
|
|
specific API. The string can be, but is not necessarily, an actual API
|
|
name. As used in \code{genheaders.py} and \code{gl.xml}, the API names
|
|
are \code{gl}, \code{gles1}, and \code{gles2}, corresponding to OpenGL,
|
|
OpenGL ES 1, and OpenGL ES 2/3, respectively.
|
|
|
|
|
|
\section{Registry Root (\tag{registry} tag)}
|
|
\label{schema:root}
|
|
|
|
A \tag{registry} contains the entire definition of one or more related
|
|
APIs.
|
|
|
|
\subsection{Attributes of \tag{registry} tags}
|
|
|
|
None.
|
|
|
|
\subsection{Contents of \tag{registry} tags}
|
|
|
|
Zero or more of each of the following tags, normally in this order
|
|
(although order shouldn't be important):
|
|
|
|
\begin{itemize}
|
|
\item \tag{comment} - Contains arbitrary text, such as a copyright
|
|
statement. Unused.
|
|
\item \tag{types} (see section~\ref{tag:types}) - defines API types.
|
|
Usually only one tag is used.
|
|
\item \tag{kinds} (see section~\ref{tag:kinds}) - defines tags
|
|
that can be used for parameter validation and more expressive types
|
|
in API bindings for languages other than C.
|
|
One parameter can be of multiple kinds, separated by commas.
|
|
\item \tag{groups} (see section~\ref{tag:groups}) - defines named groups
|
|
of tokens for possible parameter validation in API bindings for
|
|
languages other than C. Usually only one tag is used.
|
|
\item \tag{enums} (see section~\ref{tag:enums}) - defines API enumerants
|
|
(tokens). Usually multiple tags are used.
|
|
\item \tag{commands} (see section~\ref{tag:commands}) - defines API
|
|
commands (functions). Usually only one tag is used.
|
|
\item \tag{feature} (see section~\ref{tag:feature}) - defines API
|
|
feature interfaces (API versions, more or less). One tag per
|
|
feature set.
|
|
\item \tag{extensions} (see section~\ref{tag:extensions}) - defines API
|
|
extension interfaces. Usually only one tag is used, wrapping many
|
|
extensions.
|
|
\end{itemize}
|
|
|
|
|
|
\section{API types (\tag{types} tag)}
|
|
\label{tag:types}
|
|
|
|
The \tag{types} tag contains individual \tag{type} tags describing each
|
|
of the derived types used in the API.
|
|
|
|
Each \tag{type} tag contains legal C code, with attributes or embedded
|
|
tags denoting the type name.
|
|
|
|
\subsection{Attributes of \tag{type} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{requires} - another type name this type requires to complete
|
|
its definition.
|
|
\item \attr{name} - name of this type (if not defined in the tag body).
|
|
\item \attr{api} - an API name (see \tag{feature} below) which
|
|
specializes this definition of the named type, so that the same
|
|
API types may have different definitions for e.g. GL ES and GL.
|
|
\item \attr{comment} - arbitrary string (unused).
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{type} tags}
|
|
|
|
\tag{type} contains text which is legal C code for a type declaration.
|
|
It may also contain embedded tags:
|
|
|
|
\begin{itemize}
|
|
\item \tag{apientry/} - insert a platform calling convention macro here
|
|
during header generation, used mostly for function pointer types.
|
|
\item \tag{name} - contains the name of this type (if not defined in the
|
|
tag attributes).
|
|
\end{itemize}
|
|
|
|
\subsection{Example of a \tag{types} tag}
|
|
|
|
\begin{verbatim}
|
|
<types>
|
|
<type name="stddef"><![CDATA[#include <stddef.h>]]></type>
|
|
<type requires="stddef">typedef ptrdiff_t <name>GLintptr</name>;</type>
|
|
</types>
|
|
\end{verbatim}
|
|
|
|
If the {\tt GLint64} type is required by a command, this will result in
|
|
the following declarations:
|
|
|
|
\begin{verbatim}
|
|
#include <stddef.h>
|
|
typedef ptrdiff_t GLintptr;
|
|
\end{verbatim}
|
|
|
|
\section{Kinds (\tag{kinds} tag)}
|
|
\label{tag:kinds}
|
|
|
|
The \tag{kinds} tag contain individual \tag{kind} tags describing
|
|
some metadata not captured by the \tag{types} tag (see section~\ref{tag:types})
|
|
or \tag{enums} tag (see section~\ref{tag:groups}).
|
|
|
|
\subsection{Attributes of (\tag{kinds} tag)}
|
|
|
|
\begin{itemize}
|
|
\item \attr{name} - the name of the kind.
|
|
\item \attr{desc} - a description of what the kind indicates.
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{kinds} tags}
|
|
|
|
Each \tag{kinds} block contains zero or more \tag{kind} tags, in
|
|
arbitrary order.
|
|
|
|
\subsection{Example of a \tag{kinds} tag}
|
|
|
|
\begin{verbatim}
|
|
<kinds>
|
|
<kind name="Color" desc="This parameter represents part of or a complete color." />
|
|
<kind name="Clamped[0; 1]" desc="This parameter will get clamped to the 0 to 1 range." />
|
|
</kinds>
|
|
\end{verbatim}
|
|
|
|
\section{Kind (\tag{kind} tag)}
|
|
\label{tag:kind}
|
|
|
|
Each \{kind} tag defines a single kind annotation.
|
|
|
|
\subsection{Attributes of \tag{kind} tag}
|
|
|
|
\begin{itemize}
|
|
\item \attr{name} - kind name, an arbitrary string without commas (',') used
|
|
to identify this kind.
|
|
\item \attr{desc} - kind description, a description of what it
|
|
means for a parameter or return value to be annotated with this kind.
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{kind} tag}
|
|
|
|
None.
|
|
|
|
\subsection{Meaning of \tag{kind} tags}
|
|
\label{tag:kind:meaning}
|
|
|
|
If a \tag{proto} or \tag{param} tag of a \tag{command} has a
|
|
\attr{kind} attribute defined, and and the comma separated elemenst
|
|
if the attribute matches a \tag{kind} name,
|
|
then the return type or parameter type is considered to be
|
|
further defined by the description provided by the \tag{kind} tags
|
|
with the matching names. C language bindings do not attempt to
|
|
enforce this constraint in any way, but other language bindings
|
|
may try to do so.
|
|
|
|
\section{Enumerant Groups (\tag{groups} tag)}
|
|
\label{tag:groups}
|
|
|
|
The \tag{groups} tags contain individual \tag{group} tags describing
|
|
some of the group annotations used for return and parameter types.
|
|
|
|
\subsection{Attributes of \tag{groups} tags}
|
|
|
|
None.
|
|
|
|
\subsection{Contents of \tag{groups} tags}
|
|
|
|
Each \tag{groups} block contains zero or more \tag{group} tags, in
|
|
arbitrary order (although they are typically ordered by group name, to
|
|
improve human readability).
|
|
|
|
\subsection{Example of \tag{groups} tags}
|
|
|
|
\begin{verbatim}
|
|
<groups>
|
|
<group name="AccumOp">
|
|
<enum name="GL_ACCUM"/>
|
|
</group>
|
|
|
|
<group name="AttribMask">
|
|
<enum name="GL_ACCUM_BUFFER_BIT"/>
|
|
<enum name="GL_ALL_ATTRIB_BITS"/>
|
|
</group>
|
|
</groups>
|
|
\end{verbatim}
|
|
|
|
|
|
\section{Enumerant Group (\tag{group} tag)}
|
|
\label{tag:group}
|
|
|
|
Each \tag{group} tag defines a single group annotation.
|
|
|
|
\subsection{Attributes of \tag{group} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{name} - group name, an arbitrary string for grouping a set
|
|
of enums together within a broader namespace.
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{group} tags}
|
|
|
|
\tag{group} tags may contain zero or more \tag{enum} tags. Each
|
|
\tag{enum} tag may contain only a \attr{name} attribute, which should
|
|
correspond to a \tag{enum} definition in an \tag{enums} block.
|
|
|
|
\subsection{Meaning of \tag{group} tags}
|
|
\label{tag:group:meaning}
|
|
|
|
If a \tag{proto} or \tag{param} tag of a \tag{command} has a
|
|
\attr{group} attribute defined, and that attribute matches a \tag{group}
|
|
name, then the return type or parameter type is considered to be
|
|
constrained to values defined by the corresponding \tag{group}. C
|
|
language bindings do not attempt to enforce this constraint in any way,
|
|
but other language bindings may try to do so.
|
|
|
|
|
|
\section{Enumerant Blocks (\tag{enums} tag)}
|
|
\label{tag:enums}
|
|
|
|
The \tag{enums} tags contain individual \tag{enum} tags describing each of the
|
|
token (enumerant) names used in the API.
|
|
|
|
\subsection{Attributes of \tag{enums} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{namespace} - a string for grouping many different enums
|
|
together, currently unused but typically something like \code{GL}
|
|
for all enums in the OpenGL / OpenGL ES shared namespace. Multiple
|
|
\tag{enums} tags can share the same namespace.
|
|
\item \attr{type} - a string describing the data type of the values of
|
|
this group of enums, currently unused. The only string used at
|
|
present in the is \code{bitmask}.
|
|
\item \attr{start}, \attr{end} - integers defining the start and end of
|
|
a reserved range of enumerants for a particular vendor or purpose.
|
|
\attr{start} must be $\leq$ \attr{end}. These fields define formal
|
|
enumerant allocations within a namespace, and are made by the
|
|
Khronos Registrar on request from implementers following the enum
|
|
allocation policy.
|
|
\item \attr{vendor} - string describing the vendor or purposes to whom a
|
|
reserved range of enumerants is allocated.
|
|
\item \attr{comment} - arbitrary string (unused)
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{enums} tags}
|
|
|
|
Each \tag{enums} block contains zero or more \tag{enum} and \tag{unused}
|
|
tags, in arbitrary order (although they are typically ordered by sorting
|
|
on enumerant values, to improve human readability).
|
|
|
|
\subsection{Example of \tag{enums} tags}
|
|
|
|
\begin{verbatim}
|
|
<enums namespace="AttribMask" type="bitmask">
|
|
<enum value="0x00000001" name="GL_CURRENT_BIT" />
|
|
<enum value="0x00000002" name="GL_POINT_BIT" />
|
|
</enums>
|
|
<enums namespace="GL" start="0x80E0" end="0x810F" vendor="MS">
|
|
<enum value="0x80E0" name="GL_BGR" />
|
|
<unused start="0x80E1" end="0x810F" />
|
|
</enums>
|
|
\end{verbatim}
|
|
|
|
When processed into a C header, and assuming all these tokens were
|
|
required, this results in
|
|
|
|
\begin{verbatim}
|
|
#define GL_CURRENT_BIT 0x00000001
|
|
#define GL_POINT_BIT 0x00000001
|
|
#define GL_BGR 0x80E0
|
|
\end{verbatim}
|
|
|
|
|
|
\section{Enumerants (\tag{enum} tag)}
|
|
\label{tag:enum}
|
|
|
|
Each \tag{enum} tag defines a single GL (or other API) token.
|
|
|
|
\subsection{Attributes of \tag{enum} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{value} - enumerant value, a legal C constant (usually a
|
|
hexadecimal integer).
|
|
\item \attr{name} - enumerant name, a legal C preprocessor token name.
|
|
\item \attr{api} - an API name which specializes this definition of the
|
|
named enum, so that different APIs may have different values for
|
|
the same token (used to address a few accidental incompatibilities
|
|
between GL and GL ES).
|
|
\item \attr{type} - legal C suffix for the value to force it to a
|
|
specific type. Currently only \code{u} and \code{ull} are used,
|
|
for \code{unsigned} 32- and 64-bit integer values, respectively.
|
|
Separated from the \attr{value} field since this eases parsing and
|
|
sorting of values, and is rarely used.
|
|
\item \attr{group} - group name, an arbitrary string for grouping a set of
|
|
enums together within a broader namespace.
|
|
\par {\bf Note:} the \tag{group} tag (see section~\ref{tag:group})
|
|
serves the same purpose, but is deprecated in favor of this attribute.
|
|
Eventually all \tag{group} tags will be removed from the XML
|
|
registries.
|
|
\item \attr{alias} - name of another enumerant this is an alias of, used
|
|
where token names have been changed as a result of profile changes
|
|
or for consistency purposes. An enumerant alias is simply a
|
|
different \attr{name} for the exact same \attr{value}. At present,
|
|
enumerants which are promoted from extension to core API status
|
|
are not tagged as aliases - just enumerants tagged as aliases in
|
|
the {\em Changed Tokens} sections of appendices to the OpenGL
|
|
Specification. This might change in the future.
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{enum} tags}
|
|
|
|
\tag{enum} tags have no allowed contents. All information is contained
|
|
in the attributes.
|
|
|
|
|
|
\section{Unused Enumerants (\tag{unused} tag)}
|
|
\label{tag:unused}
|
|
|
|
Each \tag{unused} tag defines a range of enumerants which is allocated,
|
|
but not yet assigned to specific enums. This just tracks the unused
|
|
values and is not needed for header generation.
|
|
|
|
\subsection{Attributes of \tag{unused} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{start}, \attr{end} - integers defining the start and end of
|
|
an unused range of enumerants. \attr{start} must be $\leq$
|
|
\attr{end}. This range should not exceed the range reserved by the
|
|
surrounding \tag{enums} tag.
|
|
\item \attr{vendor} - string describing the vendor or purposes to whom a
|
|
reserved range of enumerants is allocated. Usually identical to
|
|
the \attr{vendor} attribute of the surrounding \attr{enums} block.
|
|
\item \attr{comment} - arbitrary string (unused)
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{unused} tags}
|
|
|
|
None.
|
|
|
|
|
|
\section{Command Blocks (\tag{commands} tag)}
|
|
\label{tag:commands}
|
|
|
|
The \tag{commands} tag contains definitions of each of the functions
|
|
(commands) used in the API.
|
|
|
|
\subsection{Attributes of \tag{commands} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{namespace} - a string defining the namespace in which
|
|
commands live, currently unused but typically something like
|
|
\code{GL}.
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{commands} tags}
|
|
|
|
Each \tag{commands} block contains zero or more \tag{command} tags, in
|
|
arbitrary order (although they are typically ordered by sorting on the
|
|
command name, to improve human readability).
|
|
|
|
|
|
\section{Commands (\tag{command} tag)}
|
|
\label{tag:command}
|
|
|
|
The \tag{command} tag contains a structured definition of a single API
|
|
command (function).
|
|
|
|
\subsection{Attributes of \tag{command} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{comment} - arbitrary string (unused).
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{command} tags}
|
|
|
|
\begin{itemize}
|
|
\item \tag{proto} must be the first element, and is a tag defining the C
|
|
function prototype of a command as described below, up to the
|
|
function name but not including function parameters.
|
|
\item \tag{param} elements for each command parameter follow, defining
|
|
its name and type, as described below. If a command takes no
|
|
arguments, it has no \tag{param} tags.
|
|
\end{itemize}
|
|
|
|
Following these elements, the remaining elements in a \tag{command}
|
|
tag are optional and may be in any order:
|
|
|
|
\begin{itemize}
|
|
\item \tag{alias} has one attribute, \attr{name}, containing a string which is the
|
|
name of another command this command is an alias of, used when
|
|
promoting a function from extension to ARB or ARB to API status. A
|
|
command alias describes the case where there are two function
|
|
names which resolve to the {\bf same} client library code, so (for
|
|
example) the case where a command is promoted but is also given
|
|
different GLX protocol would {\bf not} be an alias in this sense.
|
|
\item \tag{vecequiv} has one attribute, \attr{name}, containing a string which is
|
|
the name of another command which is the {\em vector equivalent}
|
|
of this command. For example, the vector equivalent of
|
|
\code{glVertex3f} is \code{glVertex3fv}.
|
|
\item \tag{glx} defines GLX protocol information for this command, as
|
|
described below. Many GL commands don't have GLX protocol defined,
|
|
and other APIs such as EGL and WGL don't use GLX at all.
|
|
\end{itemize}
|
|
|
|
|
|
\subsection{Command prototype (\tag{proto} tags)}
|
|
\label{tag:command:proto}
|
|
|
|
The \tag{proto} tag defines the return type and name of a command.
|
|
|
|
\subsubsection{Attributes of \tag{proto} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{group} - group name, an arbitrary string.
|
|
\item \attr{kind} - kind list, a comma separated list of names of
|
|
previously defined \tag{kind} tags.
|
|
\end{itemize}
|
|
|
|
If the group name is defined, it may be interpreted as described in
|
|
section~\ref{tag:group:meaning}.
|
|
|
|
\subsubsection{Contents of \tag{proto} tags}
|
|
|
|
The text elements of a \tag{proto} tag, with all other tags removed, is
|
|
legal C code describing the return type and name of a command. In addition
|
|
it may contain two semantic tags:
|
|
|
|
\begin{itemize}
|
|
\item The \tag{ptype} tag is optional, and contains text which is a
|
|
valid type name found in \tag{type} tag, and indicates that this
|
|
type must be previously defined for the definition of the command
|
|
to succeed. Builtin C types, and any derived types which are
|
|
expected to be found in other header files, should not be wrapped
|
|
in \tag{ptype} tags.
|
|
\item The \tag{name} tag is required, and contains the command name
|
|
being described.
|
|
\end{itemize}
|
|
|
|
\subsection{Command parameter (\tag{param} tags)}
|
|
\label{tag:command:param}
|
|
|
|
The \tag{param} tag defines the type and name of a parameter.
|
|
|
|
\subsubsection{Attributes of \tag{param} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{group} - group name, an arbitrary string.
|
|
\item \attr{kind} - kind list, a comma separated list of names of
|
|
previously defined \tag{kind} tags.
|
|
\item \attr{len} - parameter length, either an integer specifying the
|
|
number of elements of the parameter \tag{ptype}, or a complex
|
|
string expression with poorly defined syntax, usually representing
|
|
a length that is computed as a combination of other command
|
|
parameter values, and possibly current GL state as well.
|
|
\item \attr{class} - an arbitrary string defining the type of object handles
|
|
passed in this parameter. Handles with different types are not
|
|
compatible; for example, handles created with
|
|
\attr{class}{\tt="buffer"} can not be passed to a parameter with
|
|
\attr{class}{\tt="shader"}.
|
|
\end{itemize}
|
|
|
|
If the group name is defined, it may be interpreted as described in
|
|
section~\ref{tag:group:meaning}.
|
|
|
|
\subsubsection{Contents of \tag{param} tags}
|
|
|
|
The text elements of a \tag{param} tag, with all other tags removed, is
|
|
legal C code describing the type and name of a function parameter. In
|
|
addition it may contain two semantic tags:
|
|
|
|
\begin{itemize}
|
|
\item The \tag{ptype} tag is optional, and contains text which is a
|
|
valid type name found in \tag{type} tag, and indicates that this
|
|
type must be previously defined for the definition of the command
|
|
to succeed. Builtin C types, and any derived types which are
|
|
expected to be found in other header files, should not be wrapped
|
|
in \tag{ptype} tags.
|
|
\item The \tag{name} tag is required, and contains the command name
|
|
being described.
|
|
\end{itemize}
|
|
|
|
\subsection{Example of a \tag{commands} tag}
|
|
|
|
\begin{verbatim}
|
|
<commands>
|
|
<command>
|
|
<proto>void <name>glBeginConditionalRenderNV</name></proto>
|
|
<param><ptype>GLuint</ptype> <name>id</name></param>
|
|
<param><ptype>GLenum</ptype> <name>mode</name></param>
|
|
<alias name="glBeginConditionalRender" />
|
|
<glx type="render" opcode="348" />
|
|
</command>
|
|
</commands>
|
|
\end{verbatim}
|
|
|
|
When processed into a C header, this results in
|
|
|
|
\begin{verbatim}
|
|
void glBeginConditionalRenderNV(GLuint id, GLenum mode);
|
|
\end{verbatim}
|
|
|
|
|
|
\section{API Features / Versions (\tag{feature} tag)}
|
|
\label{tag:feature}
|
|
|
|
API features are described in individual \tag{feature} tags. A feature
|
|
is the set of interfaces (enumerants and commands) defined by a
|
|
particular API and version, such as OpenGL 4.0 or OpenGL ES 3.0, and
|
|
includes all API profiles of that version.
|
|
|
|
\subsection{Attributes of \tag{feature} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{api} - API name this feature is for (see
|
|
section~\ref{schema:apiname}), such as \code{gl} or \code{gles2}.
|
|
\item \attr{name} - version name, used as the C preprocessor token under
|
|
which the version's interfaces are protected against multiple
|
|
inclusion. Example: \code{GL\_VERSION\_4\_2}.
|
|
\item \attr{protect} - an additional preprocessor token used to protect
|
|
a feature definition. Usually another feature or extension
|
|
\attr{name}. Rarely used, for odd circumstances where the
|
|
definition of a feature or extension requires another to be
|
|
defined first.
|
|
\item \attr{number} - feature version number, usually a string
|
|
interpreted as $majorNumber.minorNumber$. Example: \code{4.2}.
|
|
\item \attr{comment} - arbitrary string (unused)
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{feature} tags}
|
|
|
|
Zero or more \tag{require} and \tag{remove} tags (see
|
|
section~\ref{tag:required}), in arbitrary order. Each tag describes a
|
|
set of interfaces that is respectively required for, or removed from,
|
|
this feature, as described below.
|
|
|
|
\subsection{Example of a \tag{feature} tag}
|
|
|
|
\begin{verbatim}
|
|
<feature api="gl" name="GL_VERSION_3_0" number="3.0">
|
|
<require>
|
|
<enum name="GL_COMPARE_REF_TO_TEXTURE" />
|
|
<enum name="GL_CLIP_DISTANCE0" />
|
|
<command name="glEndTransformFeedback" />
|
|
</require>
|
|
<require profile="compatibility">
|
|
<enum name="GL_INDEX" />
|
|
</require>
|
|
</feature>
|
|
\end{verbatim}
|
|
|
|
When processed into a C header for the \code{compatibility} profile of
|
|
OpenGL, this results in (assuming the usual definitions of these GL
|
|
interfaces):
|
|
|
|
\begin{verbatim}
|
|
#ifndef GL_VERSION_3_0
|
|
#define GL_VERSION_3_0 1
|
|
#define GL_COMPARE_REF_TO_TEXTURE 0x884E
|
|
#define GL_CLIP_DISTANCE0 0x3000
|
|
#define GL_INDEX 0x8222
|
|
typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
|
|
#ifdef GL_GLEXT_PROTOTYPES
|
|
GLAPI void APIENTRY glEndTransformFeedback (void);
|
|
#endif
|
|
#endif /* GL_VERSION_3_0 */
|
|
\end{verbatim}
|
|
|
|
If processed into a header for the \code{core} profile, the definition of
|
|
\code{GL\_INDEX} would not appear.
|
|
|
|
|
|
\section{Extension Blocks (\tag{extensions} tag)}
|
|
\label{tag:extensions}
|
|
|
|
The \tag{extensions} tag contains definitions of each of the extenions
|
|
which are defined for the API.
|
|
|
|
\subsection{Attributes of \tag{extensions} tags}
|
|
|
|
None.
|
|
|
|
\subsection{Contents of \tag{extensions} tags}
|
|
|
|
Each \tag{extensions} block contains zero or more \tag{extension} tags,
|
|
each describing an API extension, in arbitrary order (although they are
|
|
typically ordered by sorting on the extension name, to improve human
|
|
readability).
|
|
|
|
|
|
\section{API Extensions (\tag{extension} tag)}
|
|
\label{tag:extension}
|
|
|
|
API extensions are described in individual \tag{extension} tags. An
|
|
extension is the set of interfaces defined by a particular API extension
|
|
specification, such as \code{ARB\_multitexture}. \tag{extension} is
|
|
similar to \tag{feature}, but instead of having \attr{version} and
|
|
\attr{profile} attributes, instead has a \attr{supported} attribute,
|
|
which describes the set of API names which the extension can potentially
|
|
be implemented against.
|
|
|
|
\subsection{Attributes of \tag{extension} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{supported} - a regular expression, with an implicit
|
|
\code{\^{}} and \code{\$} bracketing it, which should match the
|
|
\attr{api} tag of a set of \tag{feature} tags.
|
|
\item \attr{protect} - an additional preprocessor token used to protect
|
|
an extension definition. Usually another feature or extension
|
|
\attr{name}. Rarely used, for odd circumstances where the
|
|
definition of an extension requires another to be defined first.
|
|
\item \attr{comment} - arbitrary string (unused)
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{extension} tags}
|
|
|
|
Zero or more \tag{require} and \tag{remove} tags (see
|
|
section~\ref{tag:required}), in arbitrary order. Each tag describes a
|
|
set of interfaces that is respectively required for, or removed from,
|
|
this extension, as described below.
|
|
|
|
\subsection{Example of an \tag{extensions} tag}
|
|
|
|
\begin{verbatim}
|
|
<extensions>
|
|
<extension name="GL_ARB_robustness" supported="gl|glcore" >
|
|
<require>
|
|
<enum name="GL_NO_ERROR" />
|
|
<command name="glGetGraphicsResetStatusARB" />
|
|
</require>
|
|
<require api="gl" profile="compatibility">
|
|
<command name="glGetnMapdvARB" />
|
|
</require>
|
|
</extension>
|
|
</extensions>
|
|
\end{verbatim}
|
|
|
|
The \attr{supported} attribute says that the extension can be supported for
|
|
either the GL compatibility (\code{gl}) or GL core (\code{glcore}) API
|
|
profiles, but not for other APIs. When processed into a C header for the
|
|
\code{core} profile of OpenGL, this results in (assuming the usual
|
|
definitions of these GL interfaces):
|
|
|
|
\begin{verbatim}
|
|
#ifndef GL_ARB_robustness
|
|
#define GL_ARB_robustness 1
|
|
#define GL_NO_ERROR 0
|
|
typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);
|
|
#ifdef GL_GLEXT_PROTOTYPES
|
|
GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void);
|
|
#endif
|
|
#endif /* GL_ARB_robustness */
|
|
\end{verbatim}
|
|
|
|
|
|
\section{Required and Removed Interfaces (\tag{require} and \tag{remove} tags)}
|
|
\label{tag:required}
|
|
|
|
A \tag{require} block defines a set of interfaces (types, enumerants and
|
|
commands) {\em required} by a \tag{feature} or \tag{extension}. A
|
|
\tag{remove} block defines a set of interfaces {\em removed} by a
|
|
\tag{feature} (this is primarily useful for the OpenGL core profile,
|
|
which removed many interfaces - extensions should never remove
|
|
interfaces, although this usage is allowed by the schema). Except for
|
|
the tag name and behavior, the contents of \tag{require} and
|
|
\tag{remove} tags are identical.
|
|
|
|
\subsection{Attributes of \tag{require} and \tag{remove} tags}
|
|
|
|
\begin{itemize}
|
|
\item \attr{profile} - string name of an API profile. Interfaces in the
|
|
tag are only required (or removed) if the specified profile is
|
|
being generated. If not specified, interfaces are required (or
|
|
removed) for all API profiles.
|
|
\item \attr{comment} - arbitrary string (unused)
|
|
\item \attr{api} - an API name (see section~\ref{schema:apiname}). Interfaces
|
|
in the tag are only required (or removed) if the specified API is
|
|
being generated. If not specified, interfaces are required (or
|
|
removed) for all APIs.
|
|
|
|
{\bf The \attr{api} attribute is only supported inside
|
|
\tag{extension} tags,} since \tag{feature} tags already define a
|
|
specific API.
|
|
\end{itemize}
|
|
|
|
\subsection{Contents of \tag{require} and \tag{remove} tags}
|
|
|
|
Zero or more of the following tags, in any order:
|
|
|
|
\begin{itemize}
|
|
\item \tag{command} specifies an required (or removed) command defined
|
|
in a \tag{commands} block. The tag has no content, but contains
|
|
elements:
|
|
|
|
\begin{itemize}
|
|
\item \attr{name} - name of the command (required).
|
|
\item \attr{comment} - arbitrary string (optional and unused).
|
|
\end{itemize}
|
|
\item \tag{enum} specifies an required (or removed) enumerant defined in
|
|
a \tag{enums} block. The tag has no content, but contains
|
|
elements:
|
|
|
|
\begin{itemize}
|
|
\item \attr{name} - name of the enumerant (required).
|
|
\item \attr{comment} - arbitrary string (optional and unused).
|
|
\end{itemize}
|
|
\item \tag{type} specifies a required (or removed) type defined in a
|
|
\tag{types} block. Most types are picked up implicitly by using
|
|
the \tag{ptype} tags of commands, but in a few cases, additional
|
|
types need to be specified explicitly (it is unlikely that a type
|
|
would ever be removed, although this usage is allowed by the
|
|
schema). The tag has no content, but contains elements:
|
|
|
|
\begin{itemize}
|
|
\item \attr{name} - name of the type (required).
|
|
\item \attr{comment} - arbitrary string (optional and unused).
|
|
\end{itemize}
|
|
\end{itemize}
|
|
|
|
|
|
\section{General Discussion}
|
|
\label{general}
|
|
|
|
|
|
\subsection{Stability of the XML Database and Schema}
|
|
\label{general:stability}
|
|
|
|
The new registry schema, scripts, and databases are evolving in response
|
|
to feedback and to Khronos' own wishlist. This means the XML schema is
|
|
subject to change, although most such change will probably be confined
|
|
to adding attributes to existing tags. The XML databases such as
|
|
\code{gl.xml} will evolve in response to schema changes, to new
|
|
extensions and API versions, and to general cleanup, such as
|
|
canonicalization of the XML or sorting of \tag{command} and
|
|
\tag{extension} tags by name. Changes to the schema will be described in
|
|
the change log of this document (see section~\ref{changelog}). Changes
|
|
to the \code{.xml} files will be described in Github revision history.
|
|
|
|
|
|
\subsection{Feature Enhancements to the Registry}
|
|
\label{general:enhancements}
|
|
|
|
There are lots of tools and additional tags that would make the XML format
|
|
more expressive and the tools more capable. Khronos is open to hosting
|
|
additional processing scripts for other purposes related to the definition
|
|
of the API and bindings to it.
|
|
|
|
A partial wishlist follows:
|
|
|
|
\begin{itemize}
|
|
\item Enhance \tag{command} \tag{alias} tags to describe more relaxed
|
|
sorts of aliases, such as commands equivalent in behavior and
|
|
interface, but using different GLX protocol (this might be called
|
|
a {\em client-side alias} or something of the sort).
|
|
\end{itemize}
|
|
|
|
\subsection{Type Annotations and Relationship to \code{.spec} Files}
|
|
\label{general:annotations}
|
|
|
|
The initial releases of the XML Registry did not include type annotation
|
|
and array length information from the old \code{.spec} files, which
|
|
generated a number of complaints from people writing bindings of OpenGL
|
|
to languages other than C. The majority of these annotations have now
|
|
been added to the XML, in the form of \tag{group} tags (see
|
|
section~\ref{tag:group}) defining groups of related enumerants,
|
|
\attr{group} attributes on \tag{proto} and \tag{param} tags specifying
|
|
that the corresponding return type belongs to a group, and \attr{len}
|
|
attributes on \tag{param} tags specifying the array length of the
|
|
corresponding parameter.
|
|
|
|
There are many caveats regarding these annotations. For the most part
|
|
they date from SGI's OpenGL 1.1 implementation, and have not been
|
|
updated. The defined \tag{group}s therefore do not cover many API
|
|
parameters which {\bf could} be given a group, and in many cases, the
|
|
defined \tag{group}s have not been updated to add new enumerants from
|
|
later versions of OpenGL and OpenGL extensions. The group names are
|
|
often somewhat misleading (with imbedded vendor extension tags, while
|
|
the corresponding features have been promoted).
|
|
|
|
The \tag{group}s added to \code{gl.xml} are the enumerant groups defined
|
|
in \code{enum.spec}, and \code{enumext.spec}. Many additional group
|
|
names were used in the annotations in \code{gl.spec}, and they
|
|
fall in several categories discussed below.
|
|
|
|
|
|
\subsubsection{Simple API Type Aliases}
|
|
|
|
Group names that were simply an alias for a GL type have been left
|
|
entirely out of \code{gl.xml}, since they offer no useful additional
|
|
information.
|
|
|
|
For example, a parameter described as \code{UInt32} in \code{gl.spec} is
|
|
not annotated with \code{group="UInt32"} in \code{gl.xml}, because this
|
|
offers no information about the parameter not already present in its
|
|
declaration as \code{<ptype>GLuint</ptype>}.
|
|
|
|
A few examples of such groups are \code{cl\_context},
|
|
\code{handleARB}, \code{Int32}, and \code{sync}.
|
|
|
|
|
|
\subsubsection{Numeric Constraints}
|
|
|
|
Group names representing some type of numerical constraint on a value
|
|
are retained in \tag{proto} and \tag{param} \attr{group} attributes, but
|
|
no definition exists. This is because the existing \tag{group} mechanism
|
|
can only describe constraints to specific enumerant names.
|
|
|
|
This is not a regression relative to the \code{.spec} files, which also
|
|
did not describe the meaning of these groups.
|
|
|
|
A few examples of such groups are \code{CheckedFloat32},
|
|
\code{ClampedFixed}, and \code{CoordD}.
|
|
|
|
|
|
\subsubsection{GL Object Names}
|
|
|
|
Group names representing an object name obtained from e.g. a
|
|
\code{glGen*} command, such as a display list name, are retained in in
|
|
\tag{proto} and \tag{param} \attr{group} attributes, but no definition
|
|
exists. This is because the existing \tag{group} mechanism can only
|
|
describe constraints to specific enumerant names.
|
|
|
|
This is not a regression relative to the \code{.spec} files, which also
|
|
did not describe the meaning of these groups.
|
|
|
|
A few examples of such groups are \code{List} and \code{Path}.
|
|
|
|
|
|
\subsubsection{Groups Not Defined Yet}
|
|
|
|
Group names representing enumerant groups which were not defined in
|
|
\code{enum.spec} and \code{enumext.spec} are retained in \tag{proto} and
|
|
\tag{param} \attr{group} attributes, but no definition exists. Such
|
|
groups usually are a result of vendors contributing \code{gl.spec}
|
|
entries for an extension without contributing corresponding
|
|
\code{enum.spec} entries.
|
|
|
|
This is not a regression relative to the \code{.spec} files, which also
|
|
did not describe the meaning of these groups.
|
|
|
|
A few examples of such groups are \code{ArrayObjectPNameATI},
|
|
\code{BinormalPointerTypeEXT}, and \code{SpriteParameterNameSGIX}.
|
|
|
|
|
|
\subsubsection{Other Groups}
|
|
|
|
There are probably a few groups which are present in \code{gl.xml} but
|
|
should not be. These can be gradually cleaned up over time.
|
|
|
|
|
|
\subsubsection{Validating Groups}
|
|
|
|
The \code{genheaders.py} script has been enhanced to allow validating
|
|
groups during header generation. Invoking it with the
|
|
\code{-validate} option, for example via:
|
|
|
|
\code{\$ genheaders.py -validate -registry gl.xml}
|
|
|
|
\noindent will generate a text dump on standard output showing all
|
|
parameter type \attr{group} attributes which do {\bf not} have
|
|
corresponding \tag{group} tags.
|
|
|
|
|
|
\section{Change Log}
|
|
\label{changelog}
|
|
|
|
\begin{itemize}
|
|
\item 2020-10-27 - Add \attr{class} attribute to \tag{param} tags (github
|
|
pull request 428), update document title and make minor tweaks to
|
|
reflect this not being the only Khronos XML API schema in use, and
|
|
having migrated from Subversion to Github.
|
|
\item 2020-01-11 - Add \attr{group} attribute to \tag{enum} tags, and
|
|
deprecate \tag{group} tags (github issue 335).
|
|
\item 2017-01-20 - Update for the move to the new github repository.
|
|
\item 2014-06-16 - Add \tag{vendor} attribute to \tag{unused} tags.
|
|
\item 2013-09-17 - Add \tag{comment} attribute to \tag{command} tags
|
|
within \tag{commands}.
|
|
\item 2013-06-24 - Add \tag{groups} and \tag{group} tags, renamed
|
|
\tag{enums} attribute \attr{class} to \attr{group}, and add
|
|
parameter type annotation attributes \attr{group} and \attr{len}
|
|
to both \tag{proto} and \tag{param}. Add
|
|
section~\ref{general:annotations} discussing limitations of these
|
|
annotations. Still need to add examples of the annotation
|
|
attributes.
|
|
\item 2013-06-19 - Added \tag{extensions} tag block as a wrapper around
|
|
groups of \tag{extension} tags, to ease XML transformations such
|
|
as sorting extensions by name.
|
|
\item 2013-06-14 - Expanded description of tags, better formatting
|
|
\item 2013-06-12 - First release, text file format
|
|
\end{itemize}
|
|
|
|
\input{readme.ind}
|
|
|
|
% \printindex
|
|
|
|
\end{document}
|