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