1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html lang="en"> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 5 <title>Mesa EGL</title> 6 <link rel="stylesheet" type="text/css" href="mesa.css"> 7 </head> 8 <body> 9 10 <h1>Mesa EGL</h1> 11 12 <p>The current version of EGL in Mesa implements EGL 1.4. More information 13 about EGL can be found at 14 <a href="http://www.khronos.org/egl/" target="_parent"> 15 http://www.khronos.org/egl/</a>.</p> 16 17 <p>The Mesa's implementation of EGL uses a driver architecture. The main 18 library (<code>libEGL</code>) is window system neutral. It provides the EGL 19 API entry points and helper functions for use by the drivers. Drivers are 20 dynamically loaded by the main library and most of the EGL API calls are 21 directly dispatched to the drivers.</p> 22 23 <p>The driver in use decides the window system to support.</p> 24 25 <h2>Build EGL</h2> 26 27 <ol> 28 <li> 29 <p>Run <code>configure</code> with the desired client APIs and enable 30 the driver for your hardware. For example</p> 31 32 <pre> 33 $ ./configure --enable-gles1 --enable-gles2 \ 34 --with-dri-drivers=... \ 35 --with-gallium-drivers=... 36 </pre> 37 38 <p>The main library and OpenGL is enabled by default. The first two options 39 above enables <a href="opengles.html">OpenGL ES 1.x and 2.x</a>. The last two 40 options enables the listed classic and and Gallium drivers respectively.</p> 41 42 </li> 43 44 <li>Build and install Mesa as usual.</li> 45 </ol> 46 47 <p>In the given example, it will build and install <code>libEGL</code>, 48 <code>libGL</code>, <code>libGLESv1_CM</code>, <code>libGLESv2</code>, and one 49 or more EGL drivers.</p> 50 51 <h3>Configure Options</h3> 52 53 <p>There are several options that control the build of EGL at configuration 54 time</p> 55 56 <ul> 57 <li><code>--enable-egl</code> 58 59 <p>By default, EGL is enabled. When disabled, the main library and the drivers 60 will not be built.</p> 61 62 </li> 63 64 <li><code>--with-egl-driver-dir</code> 65 66 <p>The directory EGL drivers should be installed to. If not specified, EGL 67 drivers will be installed to <code>${libdir}/egl</code>.</p> 68 69 </li> 70 71 <li><code>--enable-gallium-egl</code> 72 73 <p>Enable the optional <code>egl_gallium</code> driver.</p> 74 75 </li> 76 77 <li><code>--with-egl-platforms</code> 78 79 <p>List the platforms (window systems) to support. Its argument is a comma 80 seprated string such as <code>--with-egl-platforms=x11,drm</code>. It decides 81 the platforms a driver may support. The first listed platform is also used by 82 the main library to decide the native platform: the platform the EGL native 83 types such as <code>EGLNativeDisplayType</code> or 84 <code>EGLNativeWindowType</code> defined for.</p> 85 86 <p>The available platforms are <code>x11</code>, <code>drm</code>, 87 <code>fbdev</code>, and <code>gdi</code>. The <code>gdi</code> platform can 88 only be built with SCons. Unless for special needs, the build system should 89 select the right platforms automatically.</p> 90 91 </li> 92 93 <li><code>--enable-gles1</code> and <code>--enable-gles2</code> 94 95 <p>These options enable OpenGL ES support in OpenGL. The result is one big 96 internal library that supports multiple APIs.</p> 97 98 </li> 99 100 <li><code>--enable-shared-glapi</code> 101 102 <p>By default, <code>libGL</code> has its own copy of <code>libglapi</code>. 103 This options makes <code>libGL</code> use the shared <code>libglapi</code>. This 104 is required if applications mix OpenGL and OpenGL ES.</p> 105 106 </li> 107 108 <li><code>--enable-openvg</code> 109 110 <p>OpenVG must be explicitly enabled by this option.</p> 111 112 </li> 113 114 </ul> 115 116 <h2>Use EGL</h2> 117 118 <h3>Demos</h3> 119 120 <p>There are demos for the client APIs supported by EGL. They can be found in 121 mesa/demos repository.</p> 122 123 <h3>Environment Variables</h3> 124 125 <p>There are several environment variables that control the behavior of EGL at 126 runtime</p> 127 128 <ul> 129 <li><code>EGL_DRIVERS_PATH</code> 130 131 <p>By default, the main library will look for drivers in the directory where 132 the drivers are installed to. This variable specifies a list of 133 colon-separated directories where the main library will look for drivers, in 134 addition to the default directory. This variable is ignored for setuid/setgid 135 binaries.</p> 136 137 <p>This variable is usually set to test an uninstalled build. For example, one 138 may set</p> 139 140 <pre> 141 $ export LD_LIBRARY_PATH=$mesa/lib 142 $ export EGL_DRIVERS_PATH=$mesa/lib/egl 143 </pre> 144 145 <p>to test a build without installation</p> 146 147 </li> 148 149 <li><code>EGL_DRIVER</code> 150 151 <p>This variable specifies a full path to or the name of an EGL driver. It 152 forces the specified EGL driver to be loaded. It comes in handy when one wants 153 to test a specific driver. This variable is ignored for setuid/setgid 154 binaries.</p> 155 156 </li> 157 158 <li><code>EGL_PLATFORM</code> 159 160 <p>This variable specifies the native platform. The valid values are the same 161 as those for <code>--with-egl-platforms</code>. When the variable is not set, 162 the main library uses the first platform listed in 163 <code>--with-egl-platforms</code> as the native platform.</p> 164 165 <p>Extensions like <code>EGL_MESA_drm_display</code> define new functions to 166 create displays for non-native platforms. These extensions are usually used by 167 applications that support non-native platforms. Setting this variable is 168 probably required only for some of the demos found in mesa/demo repository.</p> 169 170 </li> 171 172 <li><code>EGL_LOG_LEVEL</code> 173 174 <p>This changes the log level of the main library and the drivers. The valid 175 values are: <code>debug</code>, <code>info</code>, <code>warning</code>, and 176 <code>fatal</code>.</p> 177 178 </li> 179 180 <li><code>EGL_SOFTWARE</code> 181 182 <p>For drivers that support both hardware and software rendering, setting this 183 variable to true forces the use of software rendering.</p> 184 185 </li> 186 </ul> 187 188 <h2>EGL Drivers</h2> 189 190 <ul> 191 <li><code>egl_dri2</code> 192 193 <p>This driver supports both <code>x11</code> and <code>drm</code> platforms. 194 It functions as a DRI driver loader. For <code>x11</code> support, it talks to 195 the X server directly using (XCB-)DRI2 protocol.</p> 196 197 <p>This driver can share DRI drivers with <code>libGL</code>.</p> 198 199 </li> 200 201 <li><code>egl_gallium</code> 202 203 <p>This driver is based on Gallium3D. It supports all rendering APIs and 204 hardwares supported by Gallium3D. It is the only driver that supports OpenVG. 205 The supported platforms are X11, DRM, FBDEV, and GDI.</p> 206 207 <p>This driver comes with its own hardware drivers 208 (<code>pipe_<hw></code>) and client API modules 209 (<code>st_<api></code>).</p> 210 211 </li> 212 213 <li><code>egl_glx</code> 214 215 <p>This driver provides a wrapper to GLX. It uses exclusively GLX to implement 216 the EGL API. It supports both direct and indirect rendering when the GLX does. 217 It is accelerated when the GLX is. As such, it cannot provide functions that 218 is not available in GLX or GLX extensions.</p> 219 </li> 220 </ul> 221 222 <h2>Packaging</h2> 223 224 <p>The ABI between the main library and its drivers are not stable. Nor is 225 there a plan to stabilize it at the moment. Of the EGL drivers, 226 <code>egl_gallium</code> has its own hardware drivers and client API modules. 227 They are considered internal to <code>egl_gallium</code> and there is also no 228 stable ABI between them. These should be kept in mind when packaging for 229 distribution.</p> 230 231 <p>Generally, <code>egl_dri2</code> is preferred over <code>egl_gallium</code> 232 when the system already has DRI drivers. As <code>egl_gallium</code> is loaded 233 before <code>egl_dri2</code> when both are available, <code>egl_gallium</code> 234 is disabled by default.</p> 235 236 <h2>Developers</h2> 237 238 <p>The sources of the main library and the classic drivers can be found at 239 <code>src/egl/</code>. The sources of the <code>egl</code> state tracker can 240 be found at <code>src/gallium/state_trackers/egl/</code>.</p> 241 242 <p>The suggested way to learn to write a EGL driver is to see how other drivers 243 are written. <code>egl_glx</code> should be a good reference. It works in any 244 environment that has GLX support, and it is simpler than most drivers.</p> 245 246 <h3>Lifetime of Display Resources</h3> 247 248 <p>Contexts and surfaces are examples of display resources. They might live 249 longer than the display that creates them.</p> 250 251 <p>In EGL, when a display is terminated through <code>eglTerminate</code>, all 252 display resources should be destroyed. Similarly, when a thread is released 253 throught <code>eglReleaseThread</code>, all current display resources should be 254 released. Another way to destory or release resources is through functions 255 such as <code>eglDestroySurface</code> or <code>eglMakeCurrent</code>.</p> 256 257 <p>When a resource that is current to some thread is destroyed, the resource 258 should not be destroyed immediately. EGL requires the resource to live until 259 it is no longer current. A driver usually calls 260 <code>eglIs<Resource>Bound</code> to check if a resource is bound 261 (current) to any thread in the destroy callbacks. If it is still bound, the 262 resource is not destroyed.</p> 263 264 <p>The main library will mark destroyed current resources as unlinked. In a 265 driver's <code>MakeCurrent</code> callback, 266 <code>eglIs<Resource>Linked</code> can then be called to check if a newly 267 released resource is linked to a display. If it is not, the last reference to 268 the resource is removed and the driver should destroy the resource. But it 269 should be careful here because <code>MakeCurrent</code> might be called with an 270 uninitialized display.</p> 271 272 <p>This is the only mechanism provided by the main library to help manage the 273 resources. The drivers are responsible to the correct behavior as defined by 274 EGL.</p> 275 276 <h3><code>EGL_RENDER_BUFFER</code></h3> 277 278 <p>In EGL, the color buffer a context should try to render to is decided by the 279 binding surface. It should try to render to the front buffer if the binding 280 surface has <code>EGL_RENDER_BUFFER</code> set to 281 <code>EGL_SINGLE_BUFFER</code>; If the same context is later bound to a 282 surface with <code>EGL_RENDER_BUFFER</code> set to 283 <code>EGL_BACK_BUFFER</code>, the context should try to render to the back 284 buffer. However, the context is allowed to make the final decision as to which 285 color buffer it wants to or is able to render to.</p> 286 287 <p>For pbuffer surfaces, the render buffer is always 288 <code>EGL_BACK_BUFFER</code>. And for pixmap surfaces, the render buffer is 289 always <code>EGL_SINGLE_BUFFER</code>. Unlike window surfaces, EGL spec 290 requires their <code>EGL_RENDER_BUFFER</code> values to be honored. As a 291 result, a driver should never set <code>EGL_PIXMAP_BIT</code> or 292 <code>EGL_PBUFFER_BIT</code> bits of a config if the contexts created with the 293 config won't be able to honor the <code>EGL_RENDER_BUFFER</code> of pixmap or 294 pbuffer surfaces.</p> 295 296 <p>It should also be noted that pixmap and pbuffer surfaces are assumed to be 297 single-buffered, in that <code>eglSwapBuffers</code> has no effect on them. It 298 is desirable that a driver allocates a private color buffer for each pbuffer 299 surface created. If the window system the driver supports has native pbuffers, 300 or if the native pixmaps have more than one color buffers, the driver should 301 carefully attach the native color buffers to the EGL surfaces, re-route them if 302 required.</p> 303 304 <p>There is no defined behavior as to, for example, how 305 <code>glDrawBuffer</code> interacts with <code>EGL_RENDER_BUFFER</code>. Right 306 now, it is desired that the draw buffer in a client API be fixed for pixmap and 307 pbuffer surfaces. Therefore, the driver is responsible to guarantee that the 308 client API renders to the specified render buffer for pixmap and pbuffer 309 surfaces.</p> 310 311 <h3><code>EGLDisplay</code> Mutex</h3> 312 313 The <code>EGLDisplay</code> will be locked before calling any of the dispatch 314 functions (well, except for GetProcAddress which does not take an 315 <code>EGLDisplay</code>). This guarantees that the same dispatch function will 316 not be called with the sample display at the same time. If a driver has access 317 to an <code>EGLDisplay</code> without going through the EGL APIs, the driver 318 should as well lock the display before using it. 319 320 </body> 321 </html> 322