]> git.cworth.org Git - apitrace-tests/blob - mesademos.py
Disable some tests.
[apitrace-tests] / mesademos.py
1 #!/usr/bin/env python
2 ##########################################################################
3 #
4 # Copyright 2011 Jose Fonseca
5 # All Rights Reserved.
6 #
7 # Permission is hereby granted, free of charge, to any person obtaining a copy
8 # of this software and associated documentation files (the "Software"), to deal
9 # in the Software without restriction, including without limitation the rights
10 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 # copies of the Software, and to permit persons to whom the Software is
12 # furnished to do so, subject to the following conditions:
13 #
14 # The above copyright notice and this permission notice shall be included in
15 # all copies or substantial portions of the Software.
16 #
17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 # THE SOFTWARE.
24 #
25 ##########################################################################/
26
27
28 '''Apitrace test suite based on Mesa demos.'''
29
30
31
32 import os.path
33 import optparse
34 import sys
35 import subprocess
36 import time
37 import re
38 import signal
39
40
41 ansi_re = re.compile('\x1b\[[0-9]{1,2}(;[0-9]{1,2}){0,2}m')
42
43
44 def ansi_strip(s):
45     # http://www.theeggeadventure.com/wikimedia/index.php/Linux_Tips#Use_sed_to_remove_ANSI_colors
46     return ansi_re.sub('', s)
47
48
49 def popen(command, *args, **kwargs):
50     if 'cwd' in kwargs:
51         sys.stdout.write('cd %s && ' % kwargs['cwd'])
52     if 'env' in kwargs:
53         for name, value in kwargs['env'].iteritems():
54             if value != os.environ.get(name, None):
55                 sys.stdout.write('%s=%s ' % (name, value))
56     sys.stdout.write(' '.join(command) + '\n')
57     sys.stdout.flush()
58     return subprocess.Popen(command, *args, **kwargs)
59
60
61 ignored_function_names = set([
62     'glGetString',
63     'glXGetCurrentDisplay',
64     'glXGetClientString',
65     'glXGetProcAddress',
66     'glXGetProcAddressARB',
67     'glXQueryVersion',
68     'glXGetVisualFromFBConfig',
69     'glXChooseFBConfig',
70     'glXCreateNewContext',
71     'glXMakeContextCurrent',
72     'glXQueryExtension',
73     'glXIsDirect',
74 ])
75
76
77 def image_tag(html, image):
78     url = os.path.relpath(image, options.results)
79     html.write('        <td><a href="%s"><img src="%s"/></a></td>\n' % (url, url))
80
81
82 def runtest(html, demo):
83
84     app = os.path.join(options.mesa_demos, 'src', demo)
85
86     dirname, basename = os.path.split(app)
87     
88     trace = os.path.abspath(os.path.join(options.results, demo.replace('/', '-') + '.trace'))
89
90     env = os.environ.copy()
91     env['LD_PRELOAD'] = os.path.abspath(os.path.join(options.build, 'glxtrace.so'))
92     env['TRACE_FILE'] = trace
93     
94     args = [os.path.join('.', basename)]
95     p = popen(args, env=env, cwd=dirname)
96     try:
97         window_name = args[0]
98
99         for i in range(10):
100             time.sleep(1)
101             if subprocess.call(['xwininfo', '-name', window_name], stdout=subprocess.PIPE) == 0:
102                 break
103
104         ref_image = os.path.join(options.results, demo.replace('/', '-') + '.ref.png')
105         subprocess.call("xwd -name '%s' | xwdtopnm | pnmtopng > '%s'" % (args[0], ref_image), shell=True)
106
107     finally:
108         p.send_signal(signal.SIGTERM)
109
110     p = popen([os.path.join(options.build, 'tracedump'), trace], stdout=subprocess.PIPE)
111     stdout, _ = p.communicate()
112
113     call_re = re.compile('^([0-9]+) (\w+)\(')
114     double_buffer = False
115     for orig_line in stdout.split('\n'):
116         line = ansi_strip(orig_line)
117         mo = call_re.match(line)
118         if mo:
119             call_no = int(mo.group(1))
120             function_name = mo.group(2)
121             if function_name in ignored_function_names:
122                 continue
123             if function_name == 'glXSwapBuffers':
124                 double_buffer = True
125         #print orig_line
126
127     args = [os.path.join(options.build, 'glretrace')]
128     if double_buffer:
129         args += ['-db']
130     else:
131         args += ['-sb']
132     snapshot_prefix = os.path.join(options.results, demo.replace('/', '-') + '.')
133     args += ['-s', snapshot_prefix]
134     args += [trace]
135     p = popen(args, stdout=subprocess.PIPE)
136     stdout, _ = p.communicate()
137     image_re = re.compile('^Wrote (.*\.png)$')
138     image = None
139     for line in stdout.split('\n'):
140         mo = image_re.match(line)
141         if mo:
142             image = mo.group(1)
143     
144     if image:
145         delta_image = os.path.join(options.results, demo.replace('/', '-') + '.diff.png')
146         p = popen([
147             'compare',
148             '-alpha', 'opaque',
149             '-metric', 'AE',
150             '-fuzz', '5%',
151             '-dissimilarity-threshold', '1',
152             ref_image, image, delta_image
153         ], stderr = subprocess.PIPE)
154         _, stderr = p.communicate()
155
156         try:
157             ae = int(stderr)
158         except ValueError:
159             ae = 9999
160         
161         if ae:
162             html.write('      <tr>\n')
163             image_tag(html, ref_image)
164             image_tag(html, image)
165             image_tag(html, delta_image)
166             html.write('      </tr>\n')
167             html.flush()
168
169             sys.stdout.write('FAIL\n')
170         else:
171             sys.stdout.write('PASS\n')
172
173
174 tests = [
175     'trivial/clear-color',
176     'trivial/clear-fbo',
177     'trivial/clear-fbo-scissor',
178     'trivial/clear-fbo-tex',
179     'trivial/clear-random',
180     #'trivial/clear-repeat', # XXX: animated
181     'trivial/clear-scissor',
182     'trivial/clear-undefined',
183     'trivial/createwin',
184     'trivial/dlist-begin-call-end',
185     'trivial/dlist-dangling',
186     'trivial/dlist-degenerate',
187     'trivial/dlist-edgeflag',
188     'trivial/dlist-edgeflag-dangling',
189     'trivial/dlist-flat-tri',
190     'trivial/dlist-mat-tri',
191     'trivial/dlist-recursive-call',
192     'trivial/dlist-tri-flat-tri',
193     'trivial/dlist-tri-mat-tri',
194     'trivial/draw2arrays',
195     'trivial/drawarrays',
196     'trivial/drawelements',
197     'trivial/drawelements-large',
198     'trivial/drawrange',
199     'trivial/flat-clip',
200     'trivial/fs-tri',
201     'trivial/line',
202     'trivial/line-clip',
203     'trivial/line-cull',
204     'trivial/line-flat',
205     'trivial/line-smooth',
206     'trivial/line-stipple-wide',
207     'trivial/line-userclip',
208     'trivial/line-userclip-clip',
209     'trivial/line-userclip-nop',
210     'trivial/line-userclip-nop-clip',
211     'trivial/line-wide',
212     'trivial/line-xor',
213     'trivial/lineloop',
214     'trivial/lineloop-clip',
215     'trivial/lineloop-elts',
216     'trivial/linestrip',
217     'trivial/linestrip-clip',
218     'trivial/linestrip-flat-stipple',
219     'trivial/linestrip-stipple',
220     'trivial/linestrip-stipple-wide',
221     'trivial/long-fixed-func',
222     'trivial/pgon-mode',
223     'trivial/point',
224     'trivial/point-clip',
225     'trivial/point-param',
226     'trivial/point-sprite',
227     'trivial/point-wide',
228     'trivial/point-wide-smooth',
229     'trivial/poly',
230     'trivial/poly-flat',
231     'trivial/poly-flat-clip',
232     'trivial/poly-flat-unfilled-clip',
233     'trivial/poly-unfilled',
234     'trivial/quad',
235     'trivial/quad-clip',
236     'trivial/quad-clip-all-vertices',
237     'trivial/quad-clip-nearplane',
238     'trivial/quad-degenerate',
239     'trivial/quad-flat',
240     'trivial/quad-offset-factor',
241     'trivial/quad-offset-unfilled',
242     'trivial/quad-offset-units',
243     'trivial/quad-tex-2d',
244     'trivial/quad-tex-3d',
245     'trivial/quad-tex-alpha',
246     'trivial/quad-tex-pbo',
247     'trivial/quad-tex-sub',
248     'trivial/quad-unfilled',
249     'trivial/quad-unfilled-clip',
250     'trivial/quad-unfilled-stipple',
251     'trivial/quads',
252     'trivial/quadstrip',
253     'trivial/quadstrip-clip',
254     #'trivial/quadstrip-cont', # XXX: animated
255     'trivial/quadstrip-flat',
256     'trivial/readpixels',
257     'trivial/sub-tex',
258     'trivial/tex-quads',
259     'trivial/tri',
260     'trivial/tri-alpha',
261     'trivial/tri-alpha-tex',
262     'trivial/tri-array-interleaved',
263     'trivial/tri-blend',
264     'trivial/tri-blend-color',
265     'trivial/tri-blend-max',
266     'trivial/tri-blend-min',
267     'trivial/tri-blend-revsub',
268     'trivial/tri-blend-sub',
269     'trivial/tri-clear',
270     'trivial/tri-clip',
271     'trivial/tri-cull',
272     'trivial/tri-cull-both',
273     'trivial/tri-dlist',
274     'trivial/tri-edgeflag',
275     'trivial/tri-edgeflag-array',
276     'trivial/tri-fbo',
277     'trivial/tri-fbo-tex',
278     'trivial/tri-fbo-tex-mip',
279     'trivial/tri-flat',
280     'trivial/tri-flat-clip',
281     'trivial/tri-fog',
282     'trivial/tri-fp',
283     'trivial/tri-fp-const-imm',
284     'trivial/tri-lit',
285     'trivial/tri-lit-material',
286     'trivial/tri-logicop-none',
287     'trivial/tri-logicop-xor',
288     'trivial/tri-mask-tri',
289     'trivial/tri-multitex-vbo',
290     'trivial/tri-orig',
291     'trivial/tri-point-line-clipped',
292     'trivial/tri-query',
293     #'trivial/tri-repeat', # XXX: animated
294     'trivial/tri-scissor-tri',
295     'trivial/tri-square',
296     'trivial/tri-stencil',
297     'trivial/tri-stipple',
298     'trivial/tri-tex',
299     'trivial/tri-tex-1d',
300     'trivial/tri-tex-3d',
301     'trivial/tri-tri',
302     'trivial/tri-unfilled',
303     'trivial/tri-unfilled-clip',
304     'trivial/tri-unfilled-edgeflag',
305     'trivial/tri-unfilled-fog',
306     'trivial/tri-unfilled-point',
307     'trivial/tri-unfilled-smooth',
308     'trivial/tri-unfilled-tri',
309     'trivial/tri-unfilled-tri-lit',
310     'trivial/tri-unfilled-userclip',
311     'trivial/tri-unfilled-userclip-stip',
312     'trivial/tri-userclip',
313     'trivial/tri-viewport',
314     'trivial/tri-z',
315     'trivial/tri-z-9',
316     'trivial/tri-z-eq',
317     'trivial/trifan',
318     'trivial/trifan-flat',
319     'trivial/trifan-flat-clip',
320     'trivial/trifan-flat-unfilled-clip',
321     'trivial/trifan-unfilled',
322     'trivial/tristrip',
323     'trivial/tristrip-clip',
324     'trivial/tristrip-flat',
325     'trivial/vbo-drawarrays',
326     'trivial/vbo-drawelements',
327     'trivial/vbo-drawrange',
328     'trivial/vbo-noninterleaved',
329     'trivial/vbo-tri',
330     'trivial/vp-array',
331     'trivial/vp-array-hf',
332     'trivial/vp-array-int',
333     'trivial/vp-clip',
334     'trivial/vp-line-clip',
335     'trivial/vp-tri',
336     'trivial/vp-tri-cb',
337     'trivial/vp-tri-cb-pos',
338     'trivial/vp-tri-cb-tex',
339     'trivial/vp-tri-imm',
340     'trivial/vp-tri-invariant',
341     'trivial/vp-tri-swap',
342     'trivial/vp-tri-tex',
343     'trivial/vp-unfilled',
344
345     #'demos/arbfplight',
346     #'demos/arbfslight',
347     #'demos/arbocclude',
348     #'demos/arbocclude2',
349     #'demos/bounce',
350     #'demos/clearspd',
351     #'demos/copypix',
352     #'demos/cubemap',
353     #'demos/dinoshade',
354     #'demos/dissolve',
355     #'demos/drawpix',
356     #'demos/engine',
357     #'demos/fbo_firecube',
358     #'demos/fbotexture',
359     #'demos/fire',
360     #'demos/fogcoord',
361     #'demos/fplight',
362     #'demos/fslight',
363     #'demos/gamma',
364     #'demos/gearbox',
365     #'demos/gears',
366     #'demos/geartrain',
367     #'demos/glinfo',
368     #'demos/gloss',
369     #'demos/gltestperf',
370     #'demos/ipers',
371     #'demos/isosurf',
372     #'demos/lodbias',
373     #'demos/morph3d',
374     #'demos/multiarb',
375     #'demos/paltex',
376     #'demos/pointblast',
377     #'demos/projtex',
378     #'demos/rain',
379     #'demos/ray',
380     #'demos/readpix',
381     #'demos/reflect',
382     #'demos/renormal',
383     #'demos/shadowtex',
384     #'demos/singlebuffer',
385     #'demos/spectex',
386     #'demos/spriteblast',
387     #'demos/stex3d',
388     #'demos/teapot',
389     #'demos/terrain',
390     #'demos/tessdemo',
391     #'demos/texcyl',
392     #'demos/texenv',
393     #'demos/textures',
394     #'demos/trispd',
395     #'demos/tunnel',
396     #'demos/tunnel2',
397     #'demos/vao_demo',
398     #'demos/winpos',
399     #'fp/fp-tri',
400     #'fp/point-position',
401     #'fp/tri-depth',
402     #'fp/tri-depth2',
403     #'fp/tri-depthwrite',
404     #'fp/tri-depthwrite2',
405     #'fp/tri-param',
406     #'fp/tri-tex',
407     #'fpglsl/fp-tri',
408     #'glsl/array',
409     #'glsl/bezier',
410     #'glsl/bitmap',
411     #'glsl/brick',
412     #'glsl/bump',
413     #'glsl/convolutions',
414     #'glsl/deriv',
415     #'glsl/fragcoord',
416     #'glsl/fsraytrace',
417     #'glsl/geom-sprites',
418     #'glsl/geom-stipple-lines',
419     #'glsl/geom-wide-lines',
420     #'glsl/identity',
421     #'glsl/linktest',
422     #'glsl/mandelbrot',
423     #'glsl/multinoise',
424     #'glsl/multitex',
425     #'glsl/noise',
426     #'glsl/noise2',
427     #'glsl/pointcoord',
428     #'glsl/points',
429     #'glsl/samplers',
430     #'glsl/shadow_sampler',
431     #'glsl/shtest',
432     #'glsl/skinning',
433     #'glsl/texaaline',
434     #'glsl/texdemo1',
435     #'glsl/toyball',
436     #'glsl/trirast',
437     #'glsl/twoside',
438     #'glsl/vert-or-frag-only',
439     #'glsl/vert-tex',
440     #'glsl/vsraytrace',
441     #'gs/gs-tri',
442     #'perf/copytex',
443     #'perf/drawoverhead',
444     #'perf/fbobind',
445     #'perf/fill',
446     #'perf/genmipmap',
447     #'perf/readpixels',
448     #'perf/swapbuffers',
449     #'perf/teximage',
450     #'perf/vbo',
451     #'perf/vertexrate',
452     #'redbook/aaindex',
453     #'redbook/aapoly',
454     #'redbook/aargb',
455     #'redbook/accanti',
456     #'redbook/accpersp',
457     #'redbook/alpha',
458     #'redbook/alpha3D',
459     #'redbook/anti',
460     #'redbook/bezcurve',
461     #'redbook/bezmesh',
462     #'redbook/checker',
463     #'redbook/clip',
464     #'redbook/colormat',
465     #'redbook/combiner',
466     #'redbook/convolution',
467     #'redbook/cube',
468     #'redbook/cubemap',
469     #'redbook/depthcue',
470     #'redbook/dof',
471     #'redbook/double',
472     #'redbook/drawf',
473     #'redbook/feedback',
474     #'redbook/fog',
475     #'redbook/fogcoord',
476     #'redbook/fogindex',
477     #'redbook/font',
478     #'redbook/hello',
479     #'redbook/histogram',
480     #'redbook/image',
481     #'redbook/light',
482     #'redbook/lines',
483     #'redbook/list',
484     #'redbook/material',
485     #'redbook/minmax',
486     #'redbook/mipmap',
487     #'redbook/model',
488     #'redbook/movelight',
489     #'redbook/multisamp',
490     #'redbook/multitex',
491     #'redbook/mvarray',
492     #'redbook/nurbs',
493     #'redbook/pickdepth',
494     #'redbook/picksquare',
495     #'redbook/plane',
496     #'redbook/planet',
497     #'redbook/pointp',
498     #'redbook/polyoff',
499     #'redbook/polys',
500     #'redbook/quadric',
501     #'redbook/robot',
502     #'redbook/sccolorlight',
503     #'redbook/scene',
504     #'redbook/scenebamb',
505     #'redbook/sceneflat',
506     #'redbook/select',
507     #'redbook/shadowmap',
508     #'redbook/smooth',
509     #'redbook/stencil',
510     #'redbook/stroke',
511     #'redbook/surface',
512     #'redbook/surfpoints',
513     #'redbook/teaambient',
514     #'redbook/teapots',
515     #'redbook/tess',
516     #'redbook/tesswind',
517     #'redbook/texbind',
518     #'redbook/texgen',
519     #'redbook/texprox',
520     #'redbook/texsub',
521     #'redbook/texture3d',
522     #'redbook/texturesurf',
523     #'redbook/torus',
524     #'redbook/trim',
525     #'redbook/unproject',
526     #'redbook/varray',
527     #'redbook/wrap',
528     #'samples/accum',
529     #'samples/bitmap1',
530     #'samples/bitmap2',
531     #'samples/blendeq',
532     #'samples/blendxor',
533     #'samples/copy',
534     #'samples/cursor',
535     #'samples/depth',
536     #'samples/eval',
537     #'samples/fog',
538     #'samples/font',
539     #'samples/line',
540     #'samples/logo',
541     #'samples/nurb',
542     #'samples/oglinfo',
543     #'samples/olympic',
544     #'samples/overlay',
545     #'samples/point',
546     #'samples/prim',
547     #'samples/quad',
548     #'samples/rgbtoppm',
549     #'samples/select',
550     #'samples/shape',
551     #'samples/sphere',
552     #'samples/star',
553     #'samples/stencil',
554     #'samples/stretch',
555     #'samples/texture',
556     #'samples/tri',
557     #'samples/wave',
558     #'slang/cltest',
559     #'slang/sotest',
560     #'slang/vstest',
561     #'tests/afsmultiarb', # XXX: animated
562     #'tests/antialias', # XXX: animated
563     'tests/arbfpspec',
564     'tests/arbfptest1',
565     'tests/arbfptexture',
566     'tests/arbfptrig',
567     'tests/arbgpuprog',
568     'tests/arbnpot',
569     'tests/arbnpot-mipmap',
570     'tests/arbvptest1',
571     'tests/arbvptest3',
572     #'tests/arbvptorus', # XXX: animated
573     #'tests/arbvpwarpmesh', # XXX: animated
574     'tests/arraytexture',
575     'tests/auxbuffer',
576     'tests/blendxor',
577     'tests/blitfb',
578     #'tests/bufferobj', # XXX: animated
579     'tests/bug_3050',
580     'tests/bug_3101',
581     #'tests/bug_3195', # XXX: animated
582     'tests/bug_texstore_i8',
583     'tests/bumpmap',
584     #'tests/calibrate_rast', # XXX: animated
585     'tests/condrender',
586     #'tests/copypixrate', # XXX: animated
587     'tests/cva',
588     'tests/cva_huge',
589     'tests/cylwrap',
590     'tests/drawbuffers',
591     'tests/drawbuffers2',
592     'tests/drawstencil',
593     'tests/exactrast',
594     'tests/ext422square',
595     'tests/fbotest1',
596     #'tests/fbotest2', # XXX: animated
597     'tests/fbotest3',
598     #'tests/fillrate', # XXX: animated
599     'tests/floattex',
600     'tests/fogcoord',
601     'tests/fptest1',
602     'tests/fptexture',
603     'tests/getteximage',
604     'tests/glutfx',
605     'tests/interleave',
606     'tests/invert',
607     'tests/jkrahntest',
608     'tests/lineclip',
609     #'tests/manytex', # XXX: animated
610     'tests/mapbufrange',
611     'tests/minmag',
612     'tests/mipgen',
613     'tests/mipmap_comp',
614     'tests/mipmap_comp_tests',
615     'tests/mipmap_limits',
616     'tests/mipmap_tunnel',
617     'tests/mipmap_view',
618     'tests/multipal',
619     'tests/multitexarray',
620     #'tests/multiwindow', # XXX: animated
621     'tests/no_s3tc',
622     'tests/occlude',
623     'tests/packedpixels',
624     'tests/pbo',
625     'tests/persp_hint',
626     'tests/prim',
627     'tests/prog_parameter',
628     #'tests/quads', # XXX: animated
629     #'tests/random', # XXX: animated
630     #'tests/readrate', # XXX: animated
631     'tests/rubberband',
632     'tests/scissor',
633     'tests/scissor-viewport',
634     'tests/seccolor',
635     'tests/shader-interp',
636     'tests/shader_api',
637     'tests/shadow-sample',
638     #'tests/sharedtex', # XXX: animated
639     'tests/stencilreaddraw',
640     #'tests/stencilwrap', # XXX: animated
641     'tests/step',
642     #'tests/streaming_rect', # XXX: animated
643     'tests/subtex',
644     #'tests/subtexrate', # XXX: animated
645     'tests/tex1d',
646     #'tests/texcmp', # XXX: animated
647     'tests/texcompress2',
648     'tests/texcompsub',
649     'tests/texdown',
650     'tests/texfilt',
651     'tests/texgenmix',
652     'tests/texleak',
653     'tests/texline',
654     #'tests/texobj', # XXX: animated
655     'tests/texobjshare',
656     'tests/texrect',
657     'tests/unfilledclip',
658     'tests/vparray',
659     'tests/vpeval',
660     'tests/vptest1',
661     'tests/vptest2',
662     'tests/vptest3',
663     'tests/vptorus',
664     'tests/vpwarpmesh',
665     'tests/yuvrect',
666     'tests/yuvsquare',
667     'tests/zbitmap',
668     'tests/zcomp',
669     'tests/zdrawpix',
670     'tests/zreaddraw',
671     #'vp/vp-tris',
672     #'vpglsl/vp-tris',
673     #'xdemos/corender',
674     #'xdemos/glsync',
675     #'xdemos/glthreads',
676     #'xdemos/glxcontexts',
677     #'xdemos/glxdemo',
678     #'xdemos/glxgears',
679     #'xdemos/glxgears_fbconfig',
680     #'xdemos/glxgears_pixmap',
681     #'xdemos/glxheads',
682     #'xdemos/glxinfo',
683     #'xdemos/glxpbdemo',
684     #'xdemos/glxpixmap',
685     #'xdemos/glxsnoop',
686     #'xdemos/glxswapcontrol',
687     #'xdemos/manywin',
688     #'xdemos/msctest',
689     #'xdemos/multictx',
690     #'xdemos/offset',
691     #'xdemos/omlsync',
692     #'xdemos/opencloseopen',
693     #'xdemos/overlay',
694     #'xdemos/pbdemo',
695     #'xdemos/pbinfo',
696     #'xdemos/shape',
697     #'xdemos/sharedtex',
698     #'xdemos/sharedtex_mt',
699     #'xdemos/texture_from_pixmap',
700     #'xdemos/wincopy',
701     #'xdemos/xfont',
702     #'xdemos/xrotfontdemo',
703     #'xdemos/yuvrect_client',
704 ]
705
706
707 _tests = [
708     'trivial/tri',
709     'trivial/tri-tex',
710 ]
711
712
713 def main():
714     global options
715
716     # Parse command line options
717     optparser = optparse.OptionParser(
718         usage='\n\t%prog [options] [demo] ...',
719         version='%%prog')
720     optparser.add_option(
721         '--build', metavar='PATH',
722         type='string', dest='build', default='.',
723         help='path to apitrace build [default=%default]')
724     optparser.add_option(
725         '--results', metavar='PATH',
726         type='string', dest='results', default='.',
727         help='results directory [default=%default]')
728     optparser.add_option(
729         '--mesa-demos', metavar='PATH',
730         type='string', dest='mesa_demos', default=os.environ.get('MESA_DEMOS'),
731         help='path to Mesa demos [default=%default]')
732
733     (options, args) = optparser.parse_args(sys.argv[1:])
734
735     if not options.mesa_demos:
736         optparser.error('path to Mesa demos not specified')
737     if not os.path.exists(options.results):
738         os.makedirs(options.results)
739
740     html = open(os.path.join(options.results, 'index.html'), 'wt')
741     html.write('<html>\n')
742     html.write('  <body>\n')
743     html.write('    <table border="1">\n')
744     html.write('      <tr><th>Ref</th><th>Src</th><th>&Delta;</th></tr>\n')
745     if not args:
746         args = tests
747     for test in args:
748        runtest(html, test)
749     html.write('    </table>\n')
750     html.write('  </body>\n')
751     html.write('</html>\n')
752
753
754 if __name__ == '__main__':
755     main()