mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-12-02 22:54:05 +08:00
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:
|
||
|
|
||
|
::
|
||
|
|
||
|
$ 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 `OpenGL ES 1.x and 2.x <opengles.html>`__. 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.
|