]> git.cworth.org Git - apitrace/blob - README.markdown
Fix typos.
[apitrace] / README.markdown
1 About **apitrace**
2 ==================
3
4 **apitrace** consists of a set of tools to:
5
6 * trace OpenGL, D3D9, D3D8, D3D7, and DDRAW APIs calls to a file;
7
8 * retrace OpenGL calls from a file;
9
10 * visualize trace files, and inspect state.
11
12
13 Basic usage
14 ===========
15
16
17 Linux
18 -----
19
20 Run the application you want to trace as
21
22      LD_PRELOAD=/path/to/glxtrace.so /path/to/application
23
24 and it will generate a trace named `application.trace` in the current
25 directory.  You can specify the written trace filename by setting the
26 `TRACE_FILE` environment variable before running.
27
28 View the trace with
29
30     /path/to/tracedump application.trace | less -R
31
32 Replay the trace with
33
34     /path/to/glretrace application.trace
35
36 Pass the `-sb` option to use a single buffered visual.  Pass `--help` to
37 glretrace for more options.
38
39 Start the GUI as
40
41     /path/to/qapitrace application.trace
42
43
44 The `LD_PRELOAD` mechanism should work with most applications.  There are some
45 applications, e.g., Unigine Heaven, which global function pointers with the
46 same name as GL entrypoints, living in a shared object that wasn't linked with
47 `-Bsymbolic` flag, so relocations to those globals function pointers get
48 overwritten with the address to our wrapper library, and the application will
49 segfault when trying to write to them.  For these applications it is possible
50 to trace by using `glxtrace.so` as an ordinary `libGL.so` and injecting into
51 `LD_LIBRARY_PATH`:
52
53     ln -s glxtrace.so libGL.so
54     ln -s glxtrace.so libGL.so.1
55     ln -s glxtrace.so libGL.so.1.2
56     export LD_LIBRARY_PATH=/path/to/directory/where/glxtrace/is:$LD_LIBRARY_PATH
57     export TRACE_LIBGL=/path/to/real/libGL.so.1
58     /path/to/application
59
60 See the `ld.so` man page for more information about `LD_PRELOAD` and
61 `LD_LIBRARY_PATH` environment flags.
62
63
64
65 Mac OS X
66 --------
67
68 Usage on Mac OS X is similar to Linux above, except for the tracing procedure,
69 which is instead:
70
71     DYLD_LIBRARY_PATH=/path/to/apitrace/wrappers /path/to/application
72
73 Note that although Mac OS X has an `LD_PRELOAD` equivalent,
74 `DYLD_INSERT_LIBRARIES`, it is mostly useless because it only works with
75 `DYLD_FORCE_FLAT_NAMESPACE=1` which breaks most applications.  See the `dyld` man
76 page for more details about these environment flags.
77
78
79 Windows
80 -------
81
82 * Copy `opengl32.dll`, `d3d8.dll`, or `d3d9.dll` from build/wrappers directory
83   to the directory with the application you want to trace.
84
85 * Run the application.
86
87 * View the trace with
88
89         \path\to\tracedump application.trace
90
91 * Replay the trace with
92
93         \path\to\glretrace application.trace
94
95
96 Advanced command line usage
97 ===========================
98
99
100 Emitting annotations to the trace from GL applications
101 ------------------------------------------------------
102
103 You can emit string and frame annotations through the
104 [`GL_GREMEDY_string_marker`](http://www.opengl.org/registry/specs/GREMEDY/string_marker.txt)
105 and
106 [`GL_GREMEDY_frame_terminator`](http://www.opengl.org/registry/specs/GREMEDY/frame_terminator.txt)
107 GL extensions.
108
109 *apitrace* will advertise and intercept these GL extensions independently of
110 the GL implementation.  So all you have to do is to use these extensions when
111 available.
112
113 For example, if you use [GLEW](http://glew.sourceforge.net/) to dynamically
114 detect and use GL extensions, you could easily accomplish this by doing:
115
116     void foo() {
117     
118       if (GLEW_GREMEDY_string_marker) {
119         glStringMarkerGREMEDY(0, __FUNCTION__ ": enter");
120       }
121       
122       ...
123       
124       if (GLEW_GREMEDY_string_marker) {
125         glStringMarkerGREMEDY(0, __FUNCTION__ ": leave");
126       }
127       
128     }
129
130 This has the added advantage of working equally well with gDEBugger.
131
132
133 Dump GL state at a particular call
134 ----------------------------------
135
136 You can get a dump of the bound GL state at call 12345 by doing:
137
138     /path/to/glretrace -D 12345 application.trace > 12345.json
139
140 This is precisely the mechanism the GUI obtains its own state.
141
142 You can compare two state dumps with the jsondiff.py script:
143
144     ./scripts/jsondiff.py 12345.json 67890.json
145
146
147 Comparing two traces side by side
148 ---------------------------------
149
150     ./scripts/tracediff.sh trace1.trace trace2.trace
151
152 This works only on Unices, and it will truncate the traces due to performance
153 limitations.
154
155
156 Recording a video with FFmpeg
157 -----------------------------
158
159 You can make a video of the output by doing
160
161     /path/to/glretrace -s - application.trace \
162     | ffmpeg -r 30 -f image2pipe -vcodec ppm -i pipe: -vcodec mpeg4 -y output.mp4
163
164
165 Advanced usage for OpenGL implementors
166 ======================================
167
168 There are several advanced usage examples meant for OpenGL implementors.
169
170
171 Regression testing
172 ------------------
173
174 These are the steps to create a regression test-suite around apitrace:
175
176 * obtain a trace
177
178 * obtain reference snapshots, by doing:
179
180         mkdir /path/to/snapshots/
181         /path/to/glretrace -s /path/to/reference/snapshots/ application.trace
182
183   on reference system.
184
185 * prune the snapshots which are not interesting
186
187 * to do a regression test, do:
188
189         /path/to/glretrace -c /path/to/reference/snapshots/ application.trace
190
191   Alternatively, for a HTML summary, use the snapdiff script:
192
193         /path/to/glretrace -s /path/to/current/snapshots/ application.trace
194         ./scripts/snapdiff.py --output summary.html /path/to/reference/snapshots/ /path/to/current/snapshots/
195
196
197 Automated git-bisection
198 -----------------------
199
200 With tracecheck.py it is possible to automate git bisect and pinpoint the
201 commit responsible for a regression.
202
203 Below is an example of using tracecheck.py to bisect a regression in the
204 Mesa-based Intel 965 driver.  But the procedure could be applied to any GL
205 driver hosted on a git repository.
206
207 First, create a build script, named build-script.sh, containing:
208
209     #!/bin/sh
210     set -e
211     export PATH=/usr/lib/ccache:$PATH
212     export CFLAGS='-g'
213     export CXXFLAGS='-g'
214     ./autogen.sh --disable-egl --disable-gallium --disable-glut --disable-glu --disable-glw --with-dri-drivers=i965
215     make clean
216     make "$@"
217
218 It is important that builds are both robust, and efficient.  Due to broken
219 dependency discovery in Mesa's makefile system, it was necessary invoke `make
220 clean` in every iteration step.  `ccache` should be installed to avoid
221 recompiling unchanged source files.
222
223 Then do:
224
225     cd /path/to/mesa
226     export LIBGL_DEBUG=verbose
227     export LD_LIBRARY_PATH=$PWD/lib
228     export LIBGL_DRIVERS_DIR=$PWD/lib
229     git bisect start \
230         6491e9593d5cbc5644eb02593a2f562447efdcbb 71acbb54f49089b03d3498b6f88c1681d3f649ac \
231         -- src/mesa/drivers/dri/intel src/mesa/drivers/dri/i965/
232     git bisect run /path/to/tracecheck.py \
233         --precision-threshold 8.0 \
234         --build /path/to/build-script.sh \
235         --gl-renderer '.*Mesa.*Intel.*' \
236         --retrace=/path/to/glretrace \
237         -c /path/to/reference/snapshots/ \
238         topogun-1.06-orc-84k.trace
239
240 The trace-check.py script will skip automatically when there are build
241 failures.
242
243 The `--gl-renderer` option will also cause a commit to be skipped if the
244 `GL_RENDERER` is unexpected (e.g., when a software renderer or another GL
245 driver is unintentionally loaded due to missing symbol in the DRI driver, or
246 another runtime fault).
247
248
249 Side by side retracing
250 ----------------------
251
252 In order to determine which draw call a regression first manifests one could
253 generate snapshots for every draw call, using the `-S` option.  That is, however,
254 very inefficient for big traces with many draw calls.
255
256 A faster approach is to run both the bad and a good GL driver side-by-side.
257 The latter can be either a previously known good build of the GL driver, or a
258 reference software renderer.
259
260 This can be achieved with retracediff.py script, which invokes glretrace with
261 different environments, allowing to choose the desired GL driver by
262 manipulating variables such as `LD_LIBRARY_PATH` or `LIBGL_DRIVERS_DIR`.
263
264 For example:
265
266     ./scripts/retracediff.py \
267         --ref-env LD_LIBRARY_PATH=/path/to/reference/GL/implementation \
268         -r ./glretrace \
269         --diff-prefix=/path/to/output/diffs \
270         application.trace
271
272
273
274 Links
275 =====
276
277 About **apitrace**:
278
279 * [Official mailing list](http://lists.freedesktop.org/mailman/listinfo/apitrace)
280
281 * [Zack Rusin's blog introducing the GUI](http://zrusin.blogspot.com/2011/04/apitrace.html)
282
283 * [Jose's Fonseca blog introducing the tool](http://jrfonseca.blogspot.com/2008/07/tracing-d3d-applications.html)
284
285
286 Direct3D
287 --------
288
289 Open-source:
290
291 * [Proxy DLL](http://www.mikoweb.eu/index.php?node=21)
292
293   * [Intercept Calls to DirectX with a Proxy DLL](http://www.codeguru.com/cpp/g-m/directx/directx8/article.php/c11453/)
294
295 * [Direct3D 9 API Interceptor](http://graphics.stanford.edu/~mdfisher/D3D9Interceptor.html)
296
297 Closed-source:
298
299 * [Microsoft PIX](http://msdn.microsoft.com/en-us/library/ee417062.aspx)
300
301   * [D3DSpy](http://doc.51windows.net/Directx9_SDK/?url=/directx9_sdk/graphics/programmingguide/TutorialsAndSamplesAndToolsAndTips/Tools/D3DSpy.htm): the predecessor of PIX
302
303 * [AMD GPU PerfStudio](http://developer.amd.com/gpu/PerfStudio/pages/APITraceWindow.aspx)
304
305
306 OpenGL
307 ------
308
309 Open-source:
310
311 * [BuGLe](http://www.opengl.org/sdk/tools/BuGLe/)
312
313 * [GLIntercept](http://code.google.com/p/glintercept/)
314
315 * [tracy](https://gitorious.org/tracy): OpenGL ES and OpenVG trace, retrace, and state inspection
316
317 Closed-source:
318
319 * [gDEBugger](http://www.gremedy.com/products.php)
320
321 * [glslDevil](http://cumbia.informatik.uni-stuttgart.de/glsldevil/index.html)
322
323 * [AMD GPU PerfStudio](http://developer.amd.com/gpu/PerfStudio/pages/APITraceWindow.aspx)
324