| <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 <stdlib.h> |
| #include <unistd.h> |
| #include <EGL/egl.h> |
| #include <GLES/gl.h> |
| 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, &config, 1, &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> |