<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>
