EGL
===

The current version of EGL in Mesa implements EGL 1.4. More information
about EGL can be found at https://www.khronos.org/egl/.

The Mesa's implementation of EGL uses a driver architecture. The main
library (``libEGL``) is window system neutral. It provides the EGL API
entry points and helper functions for use by the drivers. Drivers are
dynamically loaded by the main library and most of the EGL API calls are
directly dispatched to the drivers.

The driver in use decides the window system to support.

Build EGL
---------

#. Configure your build with the desired client APIs and enable the
   driver for your hardware. For example:

   .. code-block:: console

      $ meson configure \
              -D egl=true \
              -D gles1=true \
              -D gles2=true \
              -D dri-drivers=... \
              -D gallium-drivers=...

   The main library and OpenGL is enabled by default. The first two
   options above enables :doc:`OpenGL ES 1.x and 2.x <opengles>`. The
   last two options enables the listed classic and Gallium drivers
   respectively.

#. Build and install Mesa as usual.

In the given example, it will build and install ``libEGL``, ``libGL``,
``libGLESv1_CM``, ``libGLESv2``, and one or more EGL drivers.

Configure Options
~~~~~~~~~~~~~~~~~

There are several options that control the build of EGL at configuration
time

``-D egl=true``
   By default, EGL is enabled. When disabled, the main library and the
   drivers will not be built.

``-D platforms=...``
   List the platforms (window systems) to support. Its argument is a
   comma separated string such as ``-D platforms=x11,wayland``. It decides
   the platforms a driver may support. The first listed platform is also
   used by the main library to decide the native platform.

   The available platforms are ``x11``, ``wayland``,
   ``android``, and ``haiku``. The ``android`` platform
   can either be built as a system component, part of AOSP, using
   ``Android.mk`` files, or cross-compiled using appropriate options.
   Unless for special needs, the build system should select the right
   platforms automatically.

``-D gles1=true`` and ``-D gles2=true``
   These options enable OpenGL ES support in OpenGL. The result is one
   big internal library that supports multiple APIs.

``-D shared-glapi=true``
   By default, ``libGL`` has its own copy of ``libglapi``. This options
   makes ``libGL`` use the shared ``libglapi``. This is required if
   applications mix OpenGL and OpenGL ES.

Use EGL
-------

Demos
~~~~~

There are demos for the client APIs supported by EGL. They can be found
in mesa/demos repository.

Environment Variables
~~~~~~~~~~~~~~~~~~~~~

There are several environment variables that control the behavior of EGL
at runtime

``EGL_PLATFORM``
   This variable specifies the native platform. The valid values are the
   same as those for ``-D platforms=...``. When the variable is not set,
   the main library uses the first platform listed in
   ``-D platforms=...`` as the native platform.

   Extensions like ``EGL_MESA_drm_display`` define new functions to
   create displays for non-native platforms. These extensions are
   usually used by applications that support non-native platforms.
   Setting this variable is probably required only for some of the demos
   found in mesa/demo repository.

``EGL_LOG_LEVEL``
   This changes the log level of the main library and the drivers. The
   valid values are: ``debug``, ``info``, ``warning``, and ``fatal``.

EGL Drivers
-----------

``egl_dri2``
   This driver supports both ``x11`` and ``drm`` platforms. It functions
   as a DRI driver loader. For ``x11`` support, it talks to the X server
   directly using (XCB-)DRI2 protocol.

   This driver can share DRI drivers with ``libGL``.

Packaging
---------

The ABI between the main library and its drivers are not stable. Nor is
there a plan to stabilize it at the moment.

Developers
----------

The sources of the main library and drivers can be found at
``src/egl/``.

Lifetime of Display Resources
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Contexts and surfaces are examples of display resources. They might live
longer than the display that creates them.

In EGL, when a display is terminated through ``eglTerminate``, all
display resources should be destroyed. Similarly, when a thread is
released through ``eglReleaseThread``, all current display resources
should be released. Another way to destroy or release resources is
through functions such as ``eglDestroySurface`` or ``eglMakeCurrent``.

When a resource that is current to some thread is destroyed, the
resource should not be destroyed immediately. EGL requires the resource
to live until it is no longer current. A driver usually calls
``eglIs<Resource>Bound`` to check if a resource is bound (current) to
any thread in the destroy callbacks. If it is still bound, the resource
is not destroyed.

The main library will mark destroyed current resources as unlinked. In a
driver's ``MakeCurrent`` callback, ``eglIs<Resource>Linked`` can then be
called to check if a newly released resource is linked to a display. If
it is not, the last reference to the resource is removed and the driver
should destroy the resource. But it should be careful here because
``MakeCurrent`` might be called with an uninitialized display.

This is the only mechanism provided by the main library to help manage
the resources. The drivers are responsible to the correct behavior as
defined by EGL.

``EGL_RENDER_BUFFER``
~~~~~~~~~~~~~~~~~~~~~

In EGL, the color buffer a context should try to render to is decided by
the binding surface. It should try to render to the front buffer if the
binding surface has ``EGL_RENDER_BUFFER`` set to ``EGL_SINGLE_BUFFER``;
If the same context is later bound to a surface with
``EGL_RENDER_BUFFER`` set to ``EGL_BACK_BUFFER``, the context should try
to render to the back buffer. However, the context is allowed to make
the final decision as to which color buffer it wants to or is able to
render to.

For pbuffer surfaces, the render buffer is always ``EGL_BACK_BUFFER``.
And for pixmap surfaces, the render buffer is always
``EGL_SINGLE_BUFFER``. Unlike window surfaces, EGL spec requires their
``EGL_RENDER_BUFFER`` values to be honored. As a result, a driver should
never set ``EGL_PIXMAP_BIT`` or ``EGL_PBUFFER_BIT`` bits of a config if
the contexts created with the config won't be able to honor the
``EGL_RENDER_BUFFER`` of pixmap or pbuffer surfaces.

It should also be noted that pixmap and pbuffer surfaces are assumed to
be single-buffered, in that ``eglSwapBuffers`` has no effect on them. It
is desirable that a driver allocates a private color buffer for each
pbuffer surface created. If the window system the driver supports has
native pbuffers, or if the native pixmaps have more than one color
buffers, the driver should carefully attach the native color buffers to
the EGL surfaces, re-route them if required.

There is no defined behavior as to, for example, how ``glDrawBuffer``
interacts with ``EGL_RENDER_BUFFER``. Right now, it is desired that the
draw buffer in a client API be fixed for pixmap and pbuffer surfaces.
Therefore, the driver is responsible to guarantee that the client API
renders to the specified render buffer for pixmap and pbuffer surfaces.

``EGLDisplay`` Mutex
~~~~~~~~~~~~~~~~~~~~

The ``EGLDisplay`` will be locked before calling any of the dispatch
functions (well, except for GetProcAddress which does not take an
``EGLDisplay``). This guarantees that the same dispatch function will
not be called with the sample display at the same time. If a driver has
access to an ``EGLDisplay`` without going through the EGL APIs, the
driver should as well lock the display before using it.
