#!/usr/bin/env python3
from getopt import getopt, GetoptError
import re
import sys, os, time
import subprocess
from concurrent.futures import ThreadPoolExecutor
from multiprocessing import cpu_count
def usage():
USAGE = """\
Usage: %(progName)s
...
Options:
-h, --help Show this message
"""
print(USAGE % {'progName': sys.argv[0]})
sys.exit(1)
def process_directories(dirpath):
filenames = set()
if os.path.isdir(dirpath):
for filename in os.listdir(dirpath):
filenames.update(process_directories(os.path.join(dirpath, filename)))
else:
filenames.add(dirpath)
return filenames
def run_test(filename):
basename = os.path.basename(filename)
m = re.match('(.*).trace', basename)
if m is None:
return ""
command = ['apitrace',
'replay',
'-b',
filename]
progname = m.group(1)
timebefore = time.time()
out=""
try:
p = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate()
results = (stdout + stderr).decode("utf-8")
except KeyboardInterrupt:
exit(1)
except:
out += 'SHADER-DB: {0}: FAIL'.format(progname)
timeafter = time.time()
lines = list(results.split('\n'))
for line in lines:
m = re.match("SHADER-DB: (.*)", line)
if m != None:
out += 'SHADER-DB: {0}: {1}\n'.format(progname, m.group(1))
out += 'SHADER-DB: {}: {:.3f} secs\n'.format(progname, timeafter - timebefore)
return out
def main():
try:
option_list = [
"help",
]
options, args = getopt(sys.argv[1:], "h", option_list)
except GetoptError:
usage()
env_add = {}
env_add["VC4_DEBUG"] = "shaderdb,norast"
env_add["force_glsl_extensions_warn"] = "true"
os.environ.update(env_add)
for name, value in options:
if name in ('-h', '--help'):
usage()
if len(args) < 1:
args.append("traces")
runtimebefore = time.time()
filenames = set()
for i in args:
filenames.update(process_directories(i))
executor = ThreadPoolExecutor(cpu_count())
for t in executor.map(run_test, filenames):
sys.stdout.write(t)
runtimeafter = time.time()
print("shader-db run completed in {:.1f} secs".format(runtimeafter - runtimebefore))
if __name__ == "__main__":
main()