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