blob: efc7b1ed3aa7f2f473109b8a3febb1cbc37539ad [file] [log] [blame]
Chia-I Wuada46052010-01-21 15:29:14 +08001<html>
2
3<title>Mesa EGL</title>
4
5<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
6
7<body>
8
9<h1>Mesa EGL</h1>
10
11<p>The current version of EGL in Mesa implements EGL 1.4. More information
12about EGL can be found at
Brian Paulaeff9f92010-01-21 08:13:32 -070013<a href="http://www.khronos.org/egl/" target="_parent">
14http://www.khronos.org/egl/</a>.</p>
Chia-I Wuada46052010-01-21 15:29:14 +080015
16<p>The Mesa's implementation of EGL uses a driver architecture. The main
17library (<code>libEGL</code>) is window system neutral. It provides the EGL
18API entry points and helper functions for use by the drivers. Drivers are
19dynamically loaded by the main library and most of the EGL API calls are
20directly dispatched to the drivers.</p>
21
22<p>The driver in use decides the window system to support. For drivers that
23support hardware rendering, there are usually multiple drivers supporting the
24same window system. Each one of of them supports a certain range of graphics
25cards.</p>
26
27<h2>Build EGL</h2>
28
29<ol>
30<li>
31<p>Run <code>configure</code> with the desired state trackers and and enable
32the Gallium driver for your hardware. For example</p>
33
34<pre>
35 $ ./configure --with-state-trackers=egl_g3d,es,vega --enable-gallium-intel
36</pre>
37
38<p>The main library will be enabled by default. The <code>egl_g3d</code> state
39tracker is needed by a number of EGL drivers. EGL drivers will be covered
40later. The <a href="opengles.html">es state tracker</a> provides OpenGL ES 1.x
41and 2.x and the <a href="openvg.html">vega state tracker</a> provides OpenVG
421.x.</p>
43</li>
44
45<li>Build and install Mesa as usual.</li>
46</ol>
47
48<p>In the given example, it will build and install <code>libEGL</code>,
49<code>libGLESv1_CM</code>, <code>libGLESv2</code>, <code>libOpenVG</code>, and
50one or more EGL drivers.</p>
51
52<h3>Configure Options</h3>
53
54<p>There are several options that control the build of EGL at configuration
55time</p>
56
57<ul>
58<li><code>--enable-egl</code>
59
60<p>By default, EGL is enabled. When disabled, the main library and the drivers
61will not be built.</p>
62
63</li>
64
65<li><code>--with-egl-displays</code>
66
67<p>List the window system(s) to support. It is by default <code>x11</code>,
68which supports the X Window System. Its argument is a comma separated string
69like, for example, <code>--with-egl-displays=x11,kms</code>. Because an EGL
70driver decides which window system to support, this example will enable two
71(sets of) EGL drivers. One supports the X window system and the other supports
72bare KMS (kernel modesetting).</p>
73
74</li>
75
76<li><code>--with-state-trackers</code>
77
78<p>The argument is a comma separated string. It is usually used to specify the
79rendering APIs, like OpenGL ES or OpenVG, to build. But it should be noted
80that a number of EGL drivers depend on the <code>egl_g3d</code> state tracker.
81They will <em>not</em> be built without the <code>egl_g3d</code> state
82tracker.</p>
83
84</li>
Chia-I Wua1306f42010-01-22 15:51:51 +080085
86<li><code>--enable-gallium-swrast</code>
87
88<p>This option is not specific to EGL. But if there is no driver for your
89hardware, or you are experiencing problems with the hardware driver, you can
90enable the swrast DRM driver. It is a dummy driver and EGL will fallback to
91software rendering automatically.</p>
92
93</li>
Chia-I Wuada46052010-01-21 15:29:14 +080094</ul>
95
96<h3>OpenGL</h3>
97
98<p>The OpenGL state tracker is not built in the above example. It should be
99noted that the classic <code>libGL</code> is not a state tracker and cannot be
100used with EGL (unless the EGL driver in use is <code>egl_glx</code>). To build
101the OpenGL state tracker, one may append <code>glx</code> to
102<code>--with-state-trackers</code> and manually build
103<code>src/gallium/winsys/xlib/</code>.</p>
104
105<h2>Use EGL</h2>
106
107<p> The demos for OpenGL ES and OpenVG can be found in <code>progs/es1/</code>,
108<code>progs/es2/</code> and <code>progs/openvg/</code>. You can use them to
109test your build. For example,</p>
110
111<pre>
112 $ cd progs/es1/xegl
113 $ make
114 $ ./torus
115</pre>
116
117<h3>Environment Variables</h3>
118
119<p>There are several environment variables that control the behavior of EGL at
120runtime</p>
121
122<ul>
123<li><code>EGL_DRIVER</code>
124
125<p>This variable forces the specified EGL driver to be loaded. It comes in
126handy when one wants to test a specific driver.</p>
127
128</li>
129
130<li><code>EGL_DISPLAY</code>
131
132<p>When <code>EGL_DRIVER</code> is not set, the main library loads <em>all</em>
133EGL drivers that support a certain window system. <code>EGL_DISPLAY</code> can
134be used to specify the window system and the valid values are, for example,
135<code>x11</code> or <code>kms</code>. When the variable is not set, the main
136library defaults the value to the first window system listed in
137<code>--with-egl-displays</code> at configuration time.
138
139</li>
140
141<li><code>EGL_LOG_LEVEL</code>
142
143<p>This changes the log level of the main library and the drivers. The valid
144values are: <code>debug</code>, <code>info</code>, <code>warning</code>, and
145<code>fatal</code>.</p>
146
147</li>
148
149<li><code>EGL_SOFTWARE</code>
150
151<p>For drivers that support both hardware and software rendering, setting this
152variable to true forces the use of software rendering.</p>
153
154</li>
155</ul>
156
157<h2>EGL Drivers</h2>
158
159<p>There are two categories of EGL drivers: Gallium and classic.</p>
160
161<p>Gallium EGL drivers supports all rendering APIs specified in EGL 1.4. The
162support for optional EGL functions and EGL extensions is usually more complete
163than the classic ones. These drivers depend on the <code>egl_g3d</code> state
164tracker to build. The available drivers are</p>
165
166<ul>
167<li><code>egl_&lt;dpy&gt;_i915</code></li>
168<li><code>egl_&lt;dpy&gt;_i965</code></li>
169<li><code>egl_&lt;dpy&gt;_radeon</code></li>
170<li><code>egl_&lt;dpy&gt;_nouveau</code></li>
Chia-I Wua1306f42010-01-22 15:51:51 +0800171<li><code>egl_&lt;dpy&gt;_swrast</code></li>
Chia-I Wuada46052010-01-21 15:29:14 +0800172<li><code>egl_&lt;dpy&gt;_vmwgfx</code></li>
173</ul>
174
175<p><code>&lt;dpy&gt;</code> is given by <code>--with-egl-displays</code> at
176configuration time. There will be one EGL driver for each combination of the
177displays listed and the hardware drivers enabled.</p>
178
179<p>Classic EGL drivers, on the other hand, supports only OpenGL as its
180rendering API. They can be found under <code>src/egl/drivers/</code>. There
181are 3 of them</p>
182
183<ul>
184<li><code>egl_glx</code>
185
186<p>This driver provides a wrapper to GLX. It uses exclusively GLX to implement
187the EGL API. It supports both direct and indirect rendering when the GLX does.
188It is accelerated when the GLX is. As such, it cannot provide functions that
189is not available in GLX or GLX extensions.</p>
190</li>
191
192<li><code>egl_xdri</code>
193
194<p>This driver supports the X Window System as its window system. It functions
Chia-I Wu29732f92010-01-22 15:05:31 +0800195as a DRI driver loader and can load DRI/DRI2/DRISW drivers. Unlike
196<code>egl_glx</code>, it has no dependency on <code>libGL</code>. It talks to
197the X server directly using DRI or DRI2 protocols. It also talks minimal GLX
198protocol for things like available visuals or fbconfigs. With direct access to
199the DRI drivers, it has the potential to support more EGL functions that are
200not possible with <code>egl_glx</code>.</p>
Chia-I Wuada46052010-01-21 15:29:14 +0800201
202</li>
203<li><code>egl_dri</code>
204
205<p>This driver lacks maintenance and does <em>not</em> build. It is similiar
206to <code>egl_xdri</code> in that it functions as a DRI driver loader. But
207unlike <code>egl_xdri</code>, it supports Linux framebuffer devices as its
208window system and supports EGL_MESA_screen_surface extension. It loads only
209DRI1 drivers. As DRI1 drivers is phasing out, it might be better to rewrite
210the driver to support KMS and DRI2.</p>
211
212</li>
213</ul>
214
215<p>To use the classic drivers, one must manually set <code>EGL_DRIVER</code> at
216runtime.</p>
217
218<h2>Developers</h2>
219
220The sources of the main library and the classic drivers can be found at
221<code>src/egl/</code>. The sources of the <code>egl_g3d</code> state tracker
222can be found at <code>src/gallium/state_trackers/egl_g3d/</code>.
223
224<h3>TODOs</h3>
225
226<ul>
227<li>Thread safety</li>
228<li>Pass the conformance tests</li>
229<li>Better automatic driver selection: <code>EGL_DISPLAY</code> loads all
230drivers and might eat too much memory.</li>
231
232</ul>
233
234</body>
235</html>