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