mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-23 18:24:13 +08:00
9be0e2dbf4
This time, let's use proper Sphinx roles for the referenes, so we can reference documents and inline refs. Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5471>
198 lines
7.6 KiB
ReStructuredText
198 lines
7.6 KiB
ReStructuredText
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,drm``. 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``, ``drm``, ``wayland``,
|
|
``surfaceless``, ``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.
|