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 | <div class="header">
|
---|
11 | <h1>The Mesa 3D Graphics Library</h1>
|
---|
12 | </div>
|
---|
13 |
|
---|
14 | <iframe src="contents.html"></iframe>
|
---|
15 | <div class="content">
|
---|
16 |
|
---|
17 | <h1>Mesa EGL</h1>
|
---|
18 |
|
---|
19 | <p>The current version of EGL in Mesa implements EGL 1.4. More information
|
---|
20 | about EGL can be found at
|
---|
21 | <a href="https://www.khronos.org/egl/">
|
---|
22 | https://www.khronos.org/egl/</a>.</p>
|
---|
23 |
|
---|
24 | <p>The Mesa's implementation of EGL uses a driver architecture. The main
|
---|
25 | library (<code>libEGL</code>) is window system neutral. It provides the EGL
|
---|
26 | API entry points and helper functions for use by the drivers. Drivers are
|
---|
27 | dynamically loaded by the main library and most of the EGL API calls are
|
---|
28 | directly dispatched to the drivers.</p>
|
---|
29 |
|
---|
30 | <p>The driver in use decides the window system to support.</p>
|
---|
31 |
|
---|
32 | <h2>Build EGL</h2>
|
---|
33 |
|
---|
34 | <ol>
|
---|
35 | <li>
|
---|
36 | <p>Run <code>configure</code> with the desired client APIs and enable
|
---|
37 | the driver for your hardware. For example</p>
|
---|
38 |
|
---|
39 | <pre>
|
---|
40 | $ ./configure --enable-gles1 --enable-gles2 \
|
---|
41 | --with-dri-drivers=... \
|
---|
42 | --with-gallium-drivers=...
|
---|
43 | </pre>
|
---|
44 |
|
---|
45 | <p>The main library and OpenGL is enabled by default. The first two options
|
---|
46 | above enables <a href="opengles.html">OpenGL ES 1.x and 2.x</a>. The last two
|
---|
47 | options enables the listed classic and Gallium drivers respectively.</p>
|
---|
48 |
|
---|
49 | </li>
|
---|
50 |
|
---|
51 | <li>Build and install Mesa as usual.</li>
|
---|
52 | </ol>
|
---|
53 |
|
---|
54 | <p>In the given example, it will build and install <code>libEGL</code>,
|
---|
55 | <code>libGL</code>, <code>libGLESv1_CM</code>, <code>libGLESv2</code>, and one
|
---|
56 | or more EGL drivers.</p>
|
---|
57 |
|
---|
58 | <h3>Configure Options</h3>
|
---|
59 |
|
---|
60 | <p>There are several options that control the build of EGL at configuration
|
---|
61 | time</p>
|
---|
62 |
|
---|
63 | <dl>
|
---|
64 | <dt><code>--enable-egl</code></dt>
|
---|
65 | <dd>
|
---|
66 |
|
---|
67 | <p>By default, EGL is enabled. When disabled, the main library and the drivers
|
---|
68 | will not be built.</p>
|
---|
69 |
|
---|
70 | </dd>
|
---|
71 |
|
---|
72 | <dt><code>--with-egl-driver-dir</code></dt>
|
---|
73 | <dd>
|
---|
74 |
|
---|
75 | <p>The directory EGL drivers should be installed to. If not specified, EGL
|
---|
76 | drivers will be installed to <code>${libdir}/egl</code>.</p>
|
---|
77 |
|
---|
78 | </dd>
|
---|
79 |
|
---|
80 | <dt><code>--with-platforms</code></dt>
|
---|
81 | <dd>
|
---|
82 |
|
---|
83 | <p>List the platforms (window systems) to support. Its argument is a comma
|
---|
84 | separated string such as <code>--with-platforms=x11,drm</code>. It decides
|
---|
85 | the platforms a driver may support. The first listed platform is also used by
|
---|
86 | the main library to decide the native platform.</p>
|
---|
87 |
|
---|
88 | <p>The available platforms are <code>x11</code>, <code>drm</code>,
|
---|
89 | <code>wayland</code>, <code>surfaceless</code>, <code>android</code>,
|
---|
90 | and <code>haiku</code>.
|
---|
91 | The <code>android</code> platform can either be built as a system
|
---|
92 | component, part of AOSP, using <code>Android.mk</code> files, or
|
---|
93 | cross-compiled using appropriate <code>configure</code> options.
|
---|
94 | The <code>haiku</code> platform can only be built with SCons.
|
---|
95 | Unless for special needs, the build system should
|
---|
96 | select the right platforms automatically.</p>
|
---|
97 |
|
---|
98 | </dd>
|
---|
99 |
|
---|
100 | <dt><code>--enable-gles1</code></dt>
|
---|
101 | <dt><code>--enable-gles2</code></dt>
|
---|
102 | <dd>
|
---|
103 |
|
---|
104 | <p>These options enable OpenGL ES support in OpenGL. The result is one big
|
---|
105 | internal library that supports multiple APIs.</p>
|
---|
106 |
|
---|
107 | </dd>
|
---|
108 |
|
---|
109 | <dt><code>--enable-shared-glapi</code></dt>
|
---|
110 | <dd>
|
---|
111 |
|
---|
112 | <p>By default, <code>libGL</code> has its own copy of <code>libglapi</code>.
|
---|
113 | This options makes <code>libGL</code> use the shared <code>libglapi</code>. This
|
---|
114 | is required if applications mix OpenGL and OpenGL ES.</p>
|
---|
115 |
|
---|
116 | </dd>
|
---|
117 |
|
---|
118 | </dl>
|
---|
119 |
|
---|
120 | <h2>Use EGL</h2>
|
---|
121 |
|
---|
122 | <h3>Demos</h3>
|
---|
123 |
|
---|
124 | <p>There are demos for the client APIs supported by EGL. They can be found in
|
---|
125 | mesa/demos repository.</p>
|
---|
126 |
|
---|
127 | <h3>Environment Variables</h3>
|
---|
128 |
|
---|
129 | <p>There are several environment variables that control the behavior of EGL at
|
---|
130 | runtime</p>
|
---|
131 |
|
---|
132 | <dl>
|
---|
133 | <dt><code>EGL_PLATFORM</code></dt>
|
---|
134 | <dd>
|
---|
135 |
|
---|
136 | <p>This variable specifies the native platform. The valid values are the same
|
---|
137 | as those for <code>--with-platforms</code>. When the variable is not set,
|
---|
138 | the main library uses the first platform listed in
|
---|
139 | <code>--with-platforms</code> as the native platform.</p>
|
---|
140 |
|
---|
141 | <p>Extensions like <code>EGL_MESA_drm_display</code> define new functions to
|
---|
142 | create displays for non-native platforms. These extensions are usually used by
|
---|
143 | applications that support non-native platforms. Setting this variable is
|
---|
144 | probably required only for some of the demos found in mesa/demo repository.</p>
|
---|
145 |
|
---|
146 | </dd>
|
---|
147 |
|
---|
148 | <dt><code>EGL_LOG_LEVEL</code></dt>
|
---|
149 | <dd>
|
---|
150 |
|
---|
151 | <p>This changes the log level of the main library and the drivers. The valid
|
---|
152 | values are: <code>debug</code>, <code>info</code>, <code>warning</code>, and
|
---|
153 | <code>fatal</code>.</p>
|
---|
154 |
|
---|
155 | </dd>
|
---|
156 | </dl>
|
---|
157 |
|
---|
158 | <h2>EGL Drivers</h2>
|
---|
159 |
|
---|
160 | <dl>
|
---|
161 | <dt><code>egl_dri2</code></dt>
|
---|
162 | <dd>
|
---|
163 |
|
---|
164 | <p>This driver supports both <code>x11</code> and <code>drm</code> platforms.
|
---|
165 | It functions as a DRI driver loader. For <code>x11</code> support, it talks to
|
---|
166 | the X server directly using (XCB-)DRI2 protocol.</p>
|
---|
167 |
|
---|
168 | <p>This driver can share DRI drivers with <code>libGL</code>.</p>
|
---|
169 |
|
---|
170 | </dd>
|
---|
171 |
|
---|
172 | <h2>Packaging</h2>
|
---|
173 |
|
---|
174 | <p>The ABI between the main library and its drivers are not stable. Nor is
|
---|
175 | there a plan to stabilize it at the moment.</p>
|
---|
176 |
|
---|
177 | <h2>Developers</h2>
|
---|
178 |
|
---|
179 | <p>The sources of the main library and drivers can be found at
|
---|
180 | <code>src/egl/</code>.</p>
|
---|
181 |
|
---|
182 | <h3>Lifetime of Display Resources</h3>
|
---|
183 |
|
---|
184 | <p>Contexts and surfaces are examples of display resources. They might live
|
---|
185 | longer than the display that creates them.</p>
|
---|
186 |
|
---|
187 | <p>In EGL, when a display is terminated through <code>eglTerminate</code>, all
|
---|
188 | display resources should be destroyed. Similarly, when a thread is released
|
---|
189 | through <code>eglReleaseThread</code>, all current display resources should be
|
---|
190 | released. Another way to destroy or release resources is through functions
|
---|
191 | such as <code>eglDestroySurface</code> or <code>eglMakeCurrent</code>.</p>
|
---|
192 |
|
---|
193 | <p>When a resource that is current to some thread is destroyed, the resource
|
---|
194 | should not be destroyed immediately. EGL requires the resource to live until
|
---|
195 | it is no longer current. A driver usually calls
|
---|
196 | <code>eglIs<Resource>Bound</code> to check if a resource is bound
|
---|
197 | (current) to any thread in the destroy callbacks. If it is still bound, the
|
---|
198 | resource is not destroyed.</p>
|
---|
199 |
|
---|
200 | <p>The main library will mark destroyed current resources as unlinked. In a
|
---|
201 | driver's <code>MakeCurrent</code> callback,
|
---|
202 | <code>eglIs<Resource>Linked</code> can then be called to check if a newly
|
---|
203 | released resource is linked to a display. If it is not, the last reference to
|
---|
204 | the resource is removed and the driver should destroy the resource. But it
|
---|
205 | should be careful here because <code>MakeCurrent</code> might be called with an
|
---|
206 | uninitialized display.</p>
|
---|
207 |
|
---|
208 | <p>This is the only mechanism provided by the main library to help manage the
|
---|
209 | resources. The drivers are responsible to the correct behavior as defined by
|
---|
210 | EGL.</p>
|
---|
211 |
|
---|
212 | <h3><code>EGL_RENDER_BUFFER</code></h3>
|
---|
213 |
|
---|
214 | <p>In EGL, the color buffer a context should try to render to is decided by the
|
---|
215 | binding surface. It should try to render to the front buffer if the binding
|
---|
216 | surface has <code>EGL_RENDER_BUFFER</code> set to
|
---|
217 | <code>EGL_SINGLE_BUFFER</code>; If the same context is later bound to a
|
---|
218 | surface with <code>EGL_RENDER_BUFFER</code> set to
|
---|
219 | <code>EGL_BACK_BUFFER</code>, the context should try to render to the back
|
---|
220 | buffer. However, the context is allowed to make the final decision as to which
|
---|
221 | color buffer it wants to or is able to render to.</p>
|
---|
222 |
|
---|
223 | <p>For pbuffer surfaces, the render buffer is always
|
---|
224 | <code>EGL_BACK_BUFFER</code>. And for pixmap surfaces, the render buffer is
|
---|
225 | always <code>EGL_SINGLE_BUFFER</code>. Unlike window surfaces, EGL spec
|
---|
226 | requires their <code>EGL_RENDER_BUFFER</code> values to be honored. As a
|
---|
227 | result, a driver should never set <code>EGL_PIXMAP_BIT</code> or
|
---|
228 | <code>EGL_PBUFFER_BIT</code> bits of a config if the contexts created with the
|
---|
229 | config won't be able to honor the <code>EGL_RENDER_BUFFER</code> of pixmap or
|
---|
230 | pbuffer surfaces.</p>
|
---|
231 |
|
---|
232 | <p>It should also be noted that pixmap and pbuffer surfaces are assumed to be
|
---|
233 | single-buffered, in that <code>eglSwapBuffers</code> has no effect on them. It
|
---|
234 | is desirable that a driver allocates a private color buffer for each pbuffer
|
---|
235 | surface created. If the window system the driver supports has native pbuffers,
|
---|
236 | or if the native pixmaps have more than one color buffers, the driver should
|
---|
237 | carefully attach the native color buffers to the EGL surfaces, re-route them if
|
---|
238 | required.</p>
|
---|
239 |
|
---|
240 | <p>There is no defined behavior as to, for example, how
|
---|
241 | <code>glDrawBuffer</code> interacts with <code>EGL_RENDER_BUFFER</code>. Right
|
---|
242 | now, it is desired that the draw buffer in a client API be fixed for pixmap and
|
---|
243 | pbuffer surfaces. Therefore, the driver is responsible to guarantee that the
|
---|
244 | client API renders to the specified render buffer for pixmap and pbuffer
|
---|
245 | surfaces.</p>
|
---|
246 |
|
---|
247 | <h3><code>EGLDisplay</code> Mutex</h3>
|
---|
248 |
|
---|
249 | The <code>EGLDisplay</code> will be locked before calling any of the dispatch
|
---|
250 | functions (well, except for GetProcAddress which does not take an
|
---|
251 | <code>EGLDisplay</code>). This guarantees that the same dispatch function will
|
---|
252 | not be called with the sample display at the same time. If a driver has access
|
---|
253 | to an <code>EGLDisplay</code> without going through the EGL APIs, the driver
|
---|
254 | should as well lock the display before using it.
|
---|
255 |
|
---|
256 | </div>
|
---|
257 | </body>
|
---|
258 | </html>
|
---|