blob: 0cdd0a11ff91917237f5b142f524cfa7b5dc0a7c [file] [log] [blame]
<refentry xmlns="http://docbook.org/ns/docbook" version="5.0" xml:base="" xml:id="eglIntro">
<info>
<copyright>
<year>2003-2018</year>
<holder>The Khronos Group Inc.</holder>
</copyright>
</info>
<refmeta>
<refentrytitle>eglIntro</refentrytitle>
<manvolnum>3G</manvolnum>
</refmeta>
<refnamediv>
<refname>eglIntro</refname>
<refpurpose>
introduction to managing client API rendering through the
<acronym>EGL</acronym> API.
</refpurpose>
</refnamediv>
<refsect1 xml:id="overview"><title>Overview</title>
<para>
The <firstterm>Khronos Native Platform Graphics
Interface</firstterm> (EGL) provides a means for rendering
using a <firstterm>client API</firstterm> such as OpenGL ES
(a 3D renderer for embedded systems), OpenGL (a functional
superset of OpenGL ES for desktop systems), and OpenVG (a 2D
vector graphics renderer) together with a
<firstterm>platform</firstterm>, such as Microsoft Windows or
the X Window System.
</para>
<para>
Depending on its implementation EGL might be more or less
tightly integrated into the platform. Most EGL
functions require an EGL display connection, which can be
obtained by calling
<citerefentry><refentrytitle>eglGetPlatformDisplay</refentrytitle></citerefentry>
or
<citerefentry><refentrytitle>eglGetDisplay</refentrytitle></citerefentry>.
To initialize and
query what EGL version is supported on the display
connection, call
<citerefentry><refentrytitle>eglInitialize</refentrytitle></citerefentry>.
</para>
<para>
The EGL specification does not define the set of platforms that
may be supported by an EGL implementation, nor does it specify
behavior specific to any platform. The set of supported
platforms and their behavior is defined by platform-specific
extensions. To detect if a particular platform is supported,
clients should query the <constant>EGL_EXTENSIONS</constant>
string of <constant>EGL_NO_DISPLAY</constant> using
<citerefentry><refentrytitle>eglQueryString</refentrytitle></citerefentry>.
</para>
<para>
Platforms supporting EGL make a subset of their
visuals (which may also referred to as pixel formats, frame
buffer configurations, or other similar terms) available for
client API rendering. Windows and pixmaps created with these
visuals may also be rendered into using the platform APIs.
</para>
<para>
An EGL <firstterm>surface</firstterm> extends a native
window or pixmap with additional <firstterm>auxillary
buffers</firstterm>. These buffers include a color buffer, a
depth buffer, a stencil buffer, and an alpha mask buffer.
Some or all of the buffers listed are included in each EGL
frame buffer configuration.
</para>
<para>
EGL supports rendering into three types of surfaces:
windows, pixmaps and pixel buffers (pbuffers). EGL window
and pixmap surfaces are associated with corresponding
resources of the platform. EGL pixel buffers are
EGL-only resources, and do not accept rendering through the
platform APIs.
</para>
<para>
To render using a client API into an EGL surface, you must
determine the appropriate EGL frame buffer configuration,
which supports the rendering features the application
requires.
<citerefentry><refentrytitle>eglChooseConfig</refentrytitle></citerefentry>
returns an <type>EGLConfig</type> matching the required
attributes, if any. A complete list of EGL frame buffer
configurations can be obtained by calling
<citerefentry><refentrytitle>eglGetConfigs</refentrytitle></citerefentry>.
Attributes of a particular EGL frame buffer configuration
can be queried by calling
<citerefentry><refentrytitle>eglGetConfigAttrib</refentrytitle></citerefentry>.
</para>
<para>
For EGL window and pixmap surfaces, a suitable native window
or pixmap with a matching native visual must be created
first. For a given EGL frame buffer configuration, the
native visual type and ID can be retrieved with a call to
<citerefentry><refentrytitle>eglGetConfigAttrib</refentrytitle></citerefentry>.
For pixel buffers, no underlying native resource is
required.
</para>
<para>
To create an EGL window surface from a native window, call
<citerefentry><refentrytitle>eglCreateWindowSurface</refentrytitle></citerefentry>.
To create an EGL pixmap surface from a native pixmap, call
<citerefentry><refentrytitle>eglCreatePixmapSurface</refentrytitle></citerefentry>.
To create a pixel buffer (pbuffer) surface (which has no
associated native buffer), call
<citerefentry><refentrytitle>eglCreatePbufferSurface</refentrytitle></citerefentry>
To create a pixel buffer (pbuffer) surface whose color
buffer is provided by an OpenVG <type>VGImage</type>, call
<citerefentry><refentrytitle>eglCreatePbufferFromClientBuffer</refentrytitle></citerefentry>.
Use
<citerefentry><refentrytitle>eglDestroySurface</refentrytitle></citerefentry>
to release previously allocated resources.
</para>
<para>
An EGL rendering context is required to bind client API
rendering to an EGL surface. An EGL surface and an EGL
rendering context must have compatible EGL frame buffer
configurations. To create an EGL rendering context, call
<citerefentry><refentrytitle>eglCreateContext</refentrytitle></citerefentry>.
The type of client API context created (OpenGL ES, OpenVG,
etc.) can be changed by first calling
<citerefentry><refentrytitle>eglBindAPI</refentrytitle></citerefentry>.
</para>
<para>
An EGL rendering context may be bound to one or two EGL
surfaces by calling
<citerefentry><refentrytitle>eglMakeCurrent</refentrytitle></citerefentry>.
This context/surface(s) association specifies the
<firstterm>current context</firstterm> and
<firstterm>current surface</firstterm>, and is used by all
client API rendering commands for the bound context until
<citerefentry><refentrytitle>eglMakeCurrent</refentrytitle></citerefentry>
is called with different arguments.
</para>
<para>
Both platform and client API commands may be used to operate
on certain surfaces. However, the two command streams are
not synchronized. Synchronization can be explicitly
specified using by calling
<citerefentry><refentrytitle>eglWaitClient</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglWaitNative</refentrytitle></citerefentry>,
and possibly by calling other platform APIs.
</para>
</refsect1>
<refsect1 xml:id="examples"><title>Examples</title>
<para>
Below is a minimal example of creating an RGBA-format window that
allows rendering with OpenGL ES.
The window is cleared to yellow when the program runs. For simplicity,
the program does not check for any errors.
</para>
<programlisting>
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;EGL/egl.h&gt;
#include &lt;GLES/gl.h&gt;
typedef ... NativeWindowType;
extern NativeWindowType createNativeWindow(void);
static EGLint const attribute_list[] = {
EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1,
EGL_NONE
};
int main(int argc, char ** argv)
{
EGLDisplay display;
EGLConfig config;
EGLContext context;
EGLSurface surface;
NativeWindowType native_window;
EGLint num_config;
/* get an EGL display connection */
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
/* initialize the EGL display connection */
eglInitialize(display, NULL, NULL);
/* get an appropriate EGL frame buffer configuration */
eglChooseConfig(display, attribute_list, &amp;config, 1, &amp;num_config);
/* create an EGL rendering context */
context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);
/* create a native window */
native_window = createNativeWindow();
/* create an EGL window surface */
surface = eglCreateWindowSurface(display, config, native_window, NULL);
/* connect the context to the surface */
eglMakeCurrent(display, surface, surface, context);
/* clear the color buffer */
glClearColor(1.0, 1.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
eglSwapBuffers(display, surface);
sleep(10);
return EXIT_SUCCESS;
}
</programlisting>
</refsect1>
<refsect1 xml:id="notes"><title>Notes</title>
<para>
Prior to EGL 1.5, platforms were referred to as the
<firstterm>native window system</firstterm>, and
platform-specific queries and APIs were not available. Only a
single native window system was supported.
</para>
</refsect1>
<refsect1 xml:id="usingeglextensions"><title>Using EGL Extensions</title>
<para>
All supported EGL extensions will have a corresponding definition in
<filename>egl.h</filename> and a token in the extension strings returned
by
<citerefentry><refentrytitle>eglQueryString</refentrytitle></citerefentry>.
</para>
</refsect1>
<refsect1 xml:id="futureeglversions"><title>Future EGL Versions</title>
<para>
<citerefentry><refentrytitle>eglInitialize</refentrytitle></citerefentry>
and
<citerefentry><refentrytitle>eglQueryString</refentrytitle></citerefentry>
can be used to determine at run-time what version of EGL is available.
To check the EGL version at compile-time, test whether
<constant>EGL_VERSION_<replaceable>x</replaceable>_<replaceable>y</replaceable></constant>
is defined, where <replaceable>x</replaceable> and
<replaceable>y</replaceable> are the major and minor version
numbers.
</para>
</refsect1>
<refsect1 xml:id="files"><title>Files</title>
<variablelist>
<varlistentry>
<term><filename>GLES/egl.h</filename></term>
<listitem><para>
EGL header file
</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 xml:id="seealso"><title>See Also</title>
<para>
<!--
<citerefentry><refentrytitle>glIntro</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>glFinish</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>glFlush</refentrytitle></citerefentry>,
-->
<citerefentry><refentrytitle>eglBindAPI</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglChooseConfig</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglCreateContext</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglCreatePbufferFromClientBuffer</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglCreatePbufferSurface</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglCreatePixmapSurface</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglCreateWindowSurface</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglDestroyContext</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglDestroySurface</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglGetConfigs</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglGetDisplay</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglGetPlatformDisplay</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglInitialize</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglMakeCurrent</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglQueryString</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglSwapBuffers</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglTerminate</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglWaitGL</refentrytitle></citerefentry>,
<citerefentry><refentrytitle>eglWaitNative</refentrytitle></citerefentry>
</para>
</refsect1>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="copyright.xml"/>
</refentry>