#!/usr/bin/env python # Copyright 2014 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Script to test out suitableForGpuRasterization (via gpuveto)""" import argparse import glob import os import re import subprocess import sys # Set the PYTHONPATH to include the tools directory. sys.path.append( os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)) import find_run_binary def list_files(dir_or_file): """Returns a list of all the files from the provided argument @param dir_or_file: either a directory or skp file @returns a list containing the files in the directory or a single file """ files = [] for globbedpath in glob.iglob(dir_or_file): # useful on win32 if os.path.isdir(globbedpath): for filename in os.listdir(globbedpath): newpath = os.path.join(globbedpath, filename) if os.path.isfile(newpath): files.append(newpath) elif os.path.isfile(globbedpath): files.append(globbedpath) return files def execute_program(args): """Executes a process and waits for it to complete. @param args: is passed into subprocess.Popen(). @returns a tuple of the process output (returncode, output) """ proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output, _ = proc.communicate() errcode = proc.returncode return (errcode, output) class GpuVeto(object): def __init__(self): self.bench_pictures = find_run_binary.find_path_to_program( 'bench_pictures') sys.stdout.write('Running: %s\n' % (self.bench_pictures)) self.gpuveto = find_run_binary.find_path_to_program('gpuveto') assert os.path.isfile(self.bench_pictures) assert os.path.isfile(self.gpuveto) self.indeterminate = 0 self.truePositives = 0 self.falsePositives = 0 self.trueNegatives = 0 self.falseNegatives = 0 def process_skps(self, dir_or_file): for skp in enumerate(dir_or_file): self.process_skp(skp[1]) sys.stdout.write('TP %d FP %d TN %d FN %d IND %d\n' % (self.truePositives, self.falsePositives, self.trueNegatives, self.falseNegatives, self.indeterminate)) def process_skp(self, skp_file): assert os.path.isfile(skp_file) #print skp_file # run gpuveto on the skp args = [self.gpuveto, '-r', skp_file] returncode, output = execute_program(args) if (returncode != 0): return if ('unsuitable' in output): suitable = False else: assert 'suitable' in output suitable = True # run raster config args = [self.bench_pictures, '-r', skp_file, '--repeat', '20', '--timers', 'w', '--config', '8888'] returncode, output = execute_program(args) if (returncode != 0): return matches = re.findall('[\d]+\.[\d]+', output) if len(matches) != 1: return rasterTime = float(matches[0]) # run gpu config args2 = [self.bench_pictures, '-r', skp_file, '--repeat', '20', '--timers', 'w', '--config', 'gpu'] returncode, output = execute_program(args2) if (returncode != 0): return matches = re.findall('[\d]+\.[\d]+', output) if len(matches) != 1: return gpuTime = float(matches[0]) # happens if page is too big it will not render if 0 == gpuTime: return tolerance = 0.05 tol_range = tolerance * gpuTime if rasterTime > gpuTime - tol_range and rasterTime < gpuTime + tol_range: result = "NONE" self.indeterminate += 1 elif suitable: if gpuTime < rasterTime: self.truePositives += 1 result = "TP" else: self.falsePositives += 1 result = "FP" else: if gpuTime < rasterTime: self.falseNegatives += 1 result = "FN" else: self.trueNegatives += 1 result = "TN" sys.stdout.write('%s: gpuveto: %d raster %.2f gpu: %.2f Result: %s\n' % ( skp_file, suitable, rasterTime, gpuTime, result)) def main(main_argv): parser = argparse.ArgumentParser() parser.add_argument('--skp_path', help='Path to the SKP(s). Can either be a directory ' \ 'containing SKPs or a single SKP.', required=True) args = parser.parse_args() GpuVeto().process_skps(list_files(args.skp_path)) if __name__ == '__main__': sys.exit(main(sys.argv[1]))