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