xref: /aosp_15_r20/external/mesa3d/docs/egl.rst (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard WorkerEGL
2*61046927SAndroid Build Coastguard Worker===
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard WorkerThe current version of EGL in Mesa implements EGL 1.5. More information
5*61046927SAndroid Build Coastguard Workerabout EGL can be found at https://www.khronos.org/egl/.
6*61046927SAndroid Build Coastguard Worker
7*61046927SAndroid Build Coastguard WorkerThe Mesa's implementation of EGL uses a driver architecture. The main
8*61046927SAndroid Build Coastguard Workerlibrary (``libEGL``) is window system neutral. It provides the EGL API
9*61046927SAndroid Build Coastguard Workerentry points and helper functions for use by the drivers. Drivers are
10*61046927SAndroid Build Coastguard Workerdynamically loaded by the main library and most of the EGL API calls are
11*61046927SAndroid Build Coastguard Workerdirectly dispatched to the drivers.
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard WorkerThe driver in use decides the window system to support.
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard WorkerBuild EGL
16*61046927SAndroid Build Coastguard Worker---------
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker#. Configure your build with the desired client APIs and enable the
19*61046927SAndroid Build Coastguard Worker   driver for your hardware. For example:
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard Worker   .. code-block:: sh
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker      $ meson configure \
24*61046927SAndroid Build Coastguard Worker              -D egl=enabled \
25*61046927SAndroid Build Coastguard Worker              -D gles1=enabled \
26*61046927SAndroid Build Coastguard Worker              -D gles2=enabled \
27*61046927SAndroid Build Coastguard Worker              -D gallium-drivers=...
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker   The main EGL library and OpenGL are enabled by default. The two
30*61046927SAndroid Build Coastguard Worker   ``gles*`` options after enable :doc:`OpenGL ES 1.x and 2.x+
31*61046927SAndroid Build Coastguard Worker   <opengles>`. The last option enables the listed Gallium drivers.
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker#. Build and install Mesa as usual.
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard WorkerIn the given example, it will build and install ``libEGL``, ``libGL``,
36*61046927SAndroid Build Coastguard Worker``libGLESv1_CM``, ``libGLESv2``, and one or more EGL drivers.
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard WorkerConfigure Options
39*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard WorkerThere are several options that control the build of EGL at configuration
42*61046927SAndroid Build Coastguard Workertime
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker``-D egl=enabled``
45*61046927SAndroid Build Coastguard Worker   By default, EGL is enabled. When disabled, the main library and the
46*61046927SAndroid Build Coastguard Worker   drivers will not be built.
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker``-D platforms=...``
49*61046927SAndroid Build Coastguard Worker   List the platforms (window systems) to support. Its argument is a
50*61046927SAndroid Build Coastguard Worker   comma separated string such as ``-D platforms=x11,wayland``. It decides
51*61046927SAndroid Build Coastguard Worker   the platforms a driver may support. The first listed platform is also
52*61046927SAndroid Build Coastguard Worker   used by the main library to decide the native platform.
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker   The available platforms are ``x11``, ``wayland``,
55*61046927SAndroid Build Coastguard Worker   ``android``, and ``haiku``. The ``android`` platform
56*61046927SAndroid Build Coastguard Worker   can either be built as a system component, part of AOSP, using
57*61046927SAndroid Build Coastguard Worker   ``Android.mk`` files, or cross-compiled using appropriate options.
58*61046927SAndroid Build Coastguard Worker   Unless for special needs, the build system should select the right
59*61046927SAndroid Build Coastguard Worker   platforms automatically.
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker``-D gles1=enabled`` and ``-D gles2=enabled``
62*61046927SAndroid Build Coastguard Worker   These options enable OpenGL ES support in OpenGL. The result is one
63*61046927SAndroid Build Coastguard Worker   big internal library that supports multiple APIs.
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker``-D shared-glapi=enabled``
66*61046927SAndroid Build Coastguard Worker   By default, ``libGL`` has its own copy of ``libglapi``. This options
67*61046927SAndroid Build Coastguard Worker   makes ``libGL`` use the shared ``libglapi``. This is required if
68*61046927SAndroid Build Coastguard Worker   applications mix OpenGL and OpenGL ES.
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard WorkerUse EGL
71*61046927SAndroid Build Coastguard Worker-------
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard WorkerDemos
74*61046927SAndroid Build Coastguard Worker~~~~~
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard WorkerThere are demos for the client APIs supported by EGL. They can be found
77*61046927SAndroid Build Coastguard Workerin mesa/demos repository.
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard WorkerEnvironment Variables
80*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard WorkerThere are several environment variables that control the behavior of EGL
83*61046927SAndroid Build Coastguard Workerat runtime
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker``EGL_PLATFORM``
86*61046927SAndroid Build Coastguard Worker   This variable specifies the native platform. The valid values are the
87*61046927SAndroid Build Coastguard Worker   same as those for ``-D platforms=...``. When the variable is not set,
88*61046927SAndroid Build Coastguard Worker   the main library uses the first platform listed in
89*61046927SAndroid Build Coastguard Worker   ``-D platforms=...`` as the native platform.
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker``EGL_LOG_LEVEL``
92*61046927SAndroid Build Coastguard Worker   This changes the log level of the main library and the drivers. The
93*61046927SAndroid Build Coastguard Worker   valid values are: ``debug``, ``info``, ``warning``, and ``fatal``.
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard WorkerPackaging
96*61046927SAndroid Build Coastguard Worker---------
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard WorkerThe ABI between the main library and its drivers are not stable. Nor is
99*61046927SAndroid Build Coastguard Workerthere a plan to stabilize it at the moment.
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard WorkerDevelopers
102*61046927SAndroid Build Coastguard Worker----------
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard WorkerThe sources of the main library and drivers can be found at
105*61046927SAndroid Build Coastguard Worker``src/egl/``.
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard WorkerThe code basically consists of two things:
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker1. An EGL API dispatcher. This directly routes all the ``eglFooBar()``
110*61046927SAndroid Build Coastguard Worker   API calls into driver-specific functions.
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker2. Two EGL drivers (``dri2`` and ``haiku``), implementing the API
113*61046927SAndroid Build Coastguard Worker   functions handling the platforms' specifics.
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard WorkerTwo of API functions are optional (``eglQuerySurface()`` and
116*61046927SAndroid Build Coastguard Worker``eglSwapInterval()``); the former provides fallback for all the
117*61046927SAndroid Build Coastguard Workerplatform-agnostic attributes (i.e. everything except ``EGL_WIDTH``
118*61046927SAndroid Build Coastguard Worker& ``EGL_HEIGHT``), and the latter just silently pretends the API call
119*61046927SAndroid Build Coastguard Workersucceeded (as per EGL spec).
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard WorkerA driver _could_ implement all the other EGL API functions, but several of
122*61046927SAndroid Build Coastguard Workerthem are only needed for extensions, like ``eglSwapBuffersWithDamageEXT()``.
123*61046927SAndroid Build Coastguard WorkerSee ``src/egl/main/egldriver.h`` to see which driver hooks are only
124*61046927SAndroid Build Coastguard Workerrequired by extensions.
125*61046927SAndroid Build Coastguard Worker
126*61046927SAndroid Build Coastguard WorkerBootstrapping
127*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard WorkerWhen the apps calls ``eglInitialize()``, the driver's ``Initialize()``
130*61046927SAndroid Build Coastguard Workerfunction is called. If the first driver initialization attempt fails,
131*61046927SAndroid Build Coastguard Workera second one is tried using only software components (this can be forced
132*61046927SAndroid Build Coastguard Workerusing the ``LIBGL_ALWAYS_SOFTWARE`` environment variable). Typically,
133*61046927SAndroid Build Coastguard Workerthis function takes care of setting up visual configs, creating EGL
134*61046927SAndroid Build Coastguard Workerdevices, etc.
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard WorkerTeardown
137*61046927SAndroid Build Coastguard Worker~~~~~~~~
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard WorkerWhen ``eglTerminate()`` is called, the ``driver->Terminate()`` function
140*61046927SAndroid Build Coastguard Workeris called. The driver should clean up after itself.
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard WorkerSubclassing
143*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard WorkerThe internal libEGL data structures such as ``_EGLDisplay``,
146*61046927SAndroid Build Coastguard Worker``_EGLContext``, ``_EGLSurface``, etc. should be considered base classes
147*61046927SAndroid Build Coastguard Workerfrom which drivers will derive subclasses.
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard WorkerEGL Drivers
150*61046927SAndroid Build Coastguard Worker-----------
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker``egl_dri2``
153*61046927SAndroid Build Coastguard Worker   This driver supports several platforms: ``android``, ``device``,
154*61046927SAndroid Build Coastguard Worker   ``drm``, ``surfaceless``, ``wayland`` and ``x11``. It functions as
155*61046927SAndroid Build Coastguard Worker   a DRI driver loader. For ``x11`` support, it talks to the X server
156*61046927SAndroid Build Coastguard Worker   directly using (XCB-)DRI3 protocol when available, and falls back to
157*61046927SAndroid Build Coastguard Worker   DRI2 if necessary (can be forced with ``LIBGL_DRI3_DISABLE``).
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker   This driver can share DRI drivers with ``libGL``.
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker``haiku``
162*61046927SAndroid Build Coastguard Worker   This driver supports only the `Haiku <https://www.haiku-os.org/>`__
163*61046927SAndroid Build Coastguard Worker   platform. It is also much less feature-complete than ``egl_dri2``,
164*61046927SAndroid Build Coastguard Worker   supporting only part of EGL 1.4 and none of the extensions beyond it.
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard WorkerLifetime of Display Resources
167*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard WorkerContexts and surfaces are examples of display resources. They might live
170*61046927SAndroid Build Coastguard Workerlonger than the display that creates them.
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard WorkerIn EGL, when a display is terminated through ``eglTerminate``, all
173*61046927SAndroid Build Coastguard Workerdisplay resources should be destroyed. Similarly, when a thread is
174*61046927SAndroid Build Coastguard Workerreleased through ``eglReleaseThread``, all current display resources
175*61046927SAndroid Build Coastguard Workershould be released. Another way to destroy or release resources is
176*61046927SAndroid Build Coastguard Workerthrough functions such as ``eglDestroySurface`` or ``eglMakeCurrent``.
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard WorkerWhen a resource that is current to some thread is destroyed, the
179*61046927SAndroid Build Coastguard Workerresource should not be destroyed immediately. EGL requires the resource
180*61046927SAndroid Build Coastguard Workerto live until it is no longer current. A driver usually calls
181*61046927SAndroid Build Coastguard Worker``eglIs<Resource>Bound`` to check if a resource is bound (current) to
182*61046927SAndroid Build Coastguard Workerany thread in the destroy callbacks. If it is still bound, the resource
183*61046927SAndroid Build Coastguard Workeris not destroyed.
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard WorkerThe main library will mark destroyed current resources as unlinked. In a
186*61046927SAndroid Build Coastguard Workerdriver's ``MakeCurrent`` callback, ``eglIs<Resource>Linked`` can then be
187*61046927SAndroid Build Coastguard Workercalled to check if a newly released resource is linked to a display. If
188*61046927SAndroid Build Coastguard Workerit is not, the last reference to the resource is removed and the driver
189*61046927SAndroid Build Coastguard Workershould destroy the resource. But it should be careful here because
190*61046927SAndroid Build Coastguard Worker``MakeCurrent`` might be called with an uninitialized display.
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard WorkerThis is the only mechanism provided by the main library to help manage
193*61046927SAndroid Build Coastguard Workerthe resources. The drivers are responsible to the correct behavior as
194*61046927SAndroid Build Coastguard Workerdefined by EGL.
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker``EGL_RENDER_BUFFER``
197*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard WorkerIn EGL, the color buffer a context should try to render to is decided by
200*61046927SAndroid Build Coastguard Workerthe binding surface. It should try to render to the front buffer if the
201*61046927SAndroid Build Coastguard Workerbinding surface has ``EGL_RENDER_BUFFER`` set to ``EGL_SINGLE_BUFFER``;
202*61046927SAndroid Build Coastguard WorkerIf the same context is later bound to a surface with
203*61046927SAndroid Build Coastguard Worker``EGL_RENDER_BUFFER`` set to ``EGL_BACK_BUFFER``, the context should try
204*61046927SAndroid Build Coastguard Workerto render to the back buffer. However, the context is allowed to make
205*61046927SAndroid Build Coastguard Workerthe final decision as to which color buffer it wants to or is able to
206*61046927SAndroid Build Coastguard Workerrender to.
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard WorkerFor pbuffer surfaces, the render buffer is always ``EGL_BACK_BUFFER``.
209*61046927SAndroid Build Coastguard WorkerAnd for pixmap surfaces, the render buffer is always
210*61046927SAndroid Build Coastguard Worker``EGL_SINGLE_BUFFER``. Unlike window surfaces, EGL spec requires their
211*61046927SAndroid Build Coastguard Worker``EGL_RENDER_BUFFER`` values to be honored. As a result, a driver should
212*61046927SAndroid Build Coastguard Workernever set ``EGL_PIXMAP_BIT`` or ``EGL_PBUFFER_BIT`` bits of a config if
213*61046927SAndroid Build Coastguard Workerthe contexts created with the config won't be able to honor the
214*61046927SAndroid Build Coastguard Worker``EGL_RENDER_BUFFER`` of pixmap or pbuffer surfaces.
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard WorkerIt should also be noted that pixmap and pbuffer surfaces are assumed to
217*61046927SAndroid Build Coastguard Workerbe single-buffered, in that ``eglSwapBuffers`` has no effect on them. It
218*61046927SAndroid Build Coastguard Workeris desirable that a driver allocates a private color buffer for each
219*61046927SAndroid Build Coastguard Workerpbuffer surface created. If the window system the driver supports has
220*61046927SAndroid Build Coastguard Workernative pbuffers, or if the native pixmaps have more than one color
221*61046927SAndroid Build Coastguard Workerbuffers, the driver should carefully attach the native color buffers to
222*61046927SAndroid Build Coastguard Workerthe EGL surfaces, re-route them if required.
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard WorkerThere is no defined behavior as to, for example, how ``glDrawBuffer``
225*61046927SAndroid Build Coastguard Workerinteracts with ``EGL_RENDER_BUFFER``. Right now, it is desired that the
226*61046927SAndroid Build Coastguard Workerdraw buffer in a client API be fixed for pixmap and pbuffer surfaces.
227*61046927SAndroid Build Coastguard WorkerTherefore, the driver is responsible to guarantee that the client API
228*61046927SAndroid Build Coastguard Workerrenders to the specified render buffer for pixmap and pbuffer surfaces.
229*61046927SAndroid Build Coastguard Worker
230*61046927SAndroid Build Coastguard Worker``EGLDisplay`` Mutex
231*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard WorkerThe ``EGLDisplay`` will be locked before calling any of the dispatch
234*61046927SAndroid Build Coastguard Workerfunctions (well, except for GetProcAddress which does not take an
235*61046927SAndroid Build Coastguard Worker``EGLDisplay``). This guarantees that the same dispatch function will
236*61046927SAndroid Build Coastguard Workernot be called with the same display at the same time. If a driver has
237*61046927SAndroid Build Coastguard Workeraccess to an ``EGLDisplay`` without going through the EGL APIs, the
238*61046927SAndroid Build Coastguard Workerdriver should as well lock the display before using it.
239