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