1bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org#!/usr/bin/env python
2bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
3bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org# Copyright 2014 Google Inc.
4bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org#
5bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org# Use of this source code is governed by a BSD-style license that can be
6bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org# found in the LICENSE file.
7bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
8bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org"""Script to test out suitableForGpuRasterization (via gpuveto)"""
9bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
10bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport argparse
11bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport glob
12bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport os
13bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport re
14bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport subprocess
15bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport sys
16bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
17bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org# Set the PYTHONPATH to include the tools directory.
18bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgsys.path.append(
19bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
20bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgimport find_run_binary
21bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
22bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgdef list_files(dir_or_file):
23bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    """Returns a list of all the files from the provided argument
24bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
25bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    @param dir_or_file: either a directory or skp file
26bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
27bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    @returns a list containing the files in the directory or a single file
28bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    """
29bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    files = []
30bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    for globbedpath in glob.iglob(dir_or_file): # useful on win32
31bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        if os.path.isdir(globbedpath):
32bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            for filename in os.listdir(globbedpath):
33bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                newpath = os.path.join(globbedpath, filename)
34bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                if os.path.isfile(newpath):
35bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                    files.append(newpath)
36bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        elif os.path.isfile(globbedpath):
37bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            files.append(globbedpath)
38bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    return files
39bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
40bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
41bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgdef execute_program(args):
42bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    """Executes a process and waits for it to complete.
43bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
44bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    @param args: is passed into subprocess.Popen().
45bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
46bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    @returns a tuple of the process output (returncode, output)
47bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    """
48bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    proc = subprocess.Popen(args, stdout=subprocess.PIPE,
49bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                            stderr=subprocess.STDOUT)
50bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    output, _ = proc.communicate()
51bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    errcode = proc.returncode
52bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    return (errcode, output)
53bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
54bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
55bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgclass GpuVeto(object):
56bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
57bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    def __init__(self):
58bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        self.bench_pictures = find_run_binary.find_path_to_program(
59bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            'bench_pictures')
6012c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        sys.stdout.write('Running: %s\n' % (self.bench_pictures))
61bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        self.gpuveto = find_run_binary.find_path_to_program('gpuveto')
62bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        assert os.path.isfile(self.bench_pictures)
63bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        assert os.path.isfile(self.gpuveto)
6412c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        self.indeterminate = 0
65bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        self.truePositives = 0
66bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        self.falsePositives = 0
67bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        self.trueNegatives = 0
68bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        self.falseNegatives = 0
69bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
70bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    def process_skps(self, dir_or_file):
71bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        for skp in enumerate(dir_or_file):
72bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            self.process_skp(skp[1])
73bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
7412c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        sys.stdout.write('TP %d FP %d TN %d FN %d IND %d\n' % (self.truePositives,
7512c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                                               self.falsePositives,
7612c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                                               self.trueNegatives,
7712c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                                               self.falseNegatives,
7812c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                                               self.indeterminate))
79bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
80bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
81bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    def process_skp(self, skp_file):
82bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        assert os.path.isfile(skp_file)
8312c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        #print skp_file
84bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
85bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        # run gpuveto on the skp
86bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        args = [self.gpuveto, '-r', skp_file]
87bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        returncode, output = execute_program(args)
88bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        if (returncode != 0):
89bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            return
90bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
91bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        if ('unsuitable' in output):
92bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            suitable = False
93bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        else:
94bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            assert 'suitable' in output
95bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            suitable = True
96bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
97bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        # run raster config
98bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        args = [self.bench_pictures, '-r', skp_file,
9912c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                     '--repeat', '20',
10012c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                     '--timers', 'w',
101bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                                     '--config', '8888']
102bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        returncode, output = execute_program(args)
103bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        if (returncode != 0):
104bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            return
105bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
10612c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        matches = re.findall('[\d]+\.[\d]+', output)
10712c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        if len(matches) != 1:
108bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            return
109bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
11012c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        rasterTime = float(matches[0])
111bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
112bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        # run gpu config
113bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        args2 = [self.bench_pictures, '-r', skp_file,
11412c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                      '--repeat', '20',
11512c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                                      '--timers', 'w',
116bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                                      '--config', 'gpu']
117bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        returncode, output = execute_program(args2)
118bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        if (returncode != 0):
119bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            return
120bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
12112c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        matches = re.findall('[\d]+\.[\d]+', output)
12212c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        if len(matches) != 1:
123bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            return
124bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
12512c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        gpuTime = float(matches[0])
12612c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel
12712c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        # happens if page is too big it will not render
12812c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        if 0 == gpuTime:
12912c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel            return
13012c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel
13112c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        tolerance = 0.05
13212c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        tol_range = tolerance * gpuTime
133bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
134bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
13512c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        if rasterTime > gpuTime - tol_range and rasterTime < gpuTime + tol_range:
13612c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel            result = "NONE"
13712c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel            self.indeterminate += 1
13812c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        elif suitable:
139bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            if gpuTime < rasterTime:
140bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                self.truePositives += 1
14112c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                result = "TP"
142bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            else:
143bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                self.falsePositives += 1
14412c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                result = "FP"
145bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org        else:
146bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            if gpuTime < rasterTime:
147bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                self.falseNegatives += 1
14812c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                result = "FN"
149bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org            else:
150bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                self.trueNegatives += 1
15112c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel                result = "TN"
15212c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel
153bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
15412c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel        sys.stdout.write('%s: gpuveto: %d raster %.2f gpu: %.2f  Result: %s\n' % (
15512c2198535759ee9aae91ec385e8e31e5dbc12d7egdaniel            skp_file, suitable, rasterTime, gpuTime, result))
156bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
157bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgdef main(main_argv):
158bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    parser = argparse.ArgumentParser()
159bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    parser.add_argument('--skp_path',
160bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                        help='Path to the SKP(s). Can either be a directory ' \
161bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                        'containing SKPs or a single SKP.',
162bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org                        required=True)
163bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
164bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    args = parser.parse_args()
165bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    GpuVeto().process_skps(list_files(args.skp_path))
166bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org
167bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.orgif __name__ == '__main__':
168bde3cd8f1d0c57fc2831f1ada4c55fca60233a88commit-bot@chromium.org    sys.exit(main(sys.argv[1]))
169