bde3cd8f1d
This CL just sketches out the structure of the gpuveto testing process. Two big areas for improvement are: render the picture in tiles and label as unsuitable if any gpu tile is slower than raster decide on whether tilegrid is used or not As expected the current gpuveto heuristic isn't so good: predicted suitable unsuitable ------------------------------------------- actual suitable 10 17 actual unsuitable 15 27 R=rmistry@google.com, bsalomon@google.com Author: robertphillips@google.com Review URL: https://codereview.chromium.org/257723003 git-svn-id: http://skia.googlecode.com/svn/trunk@14416 2bbb7eff-a529-9590-31e7-b0007b416f81
148 lines
4.4 KiB
Python
148 lines
4.4 KiB
Python
#!/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')
|
|
self.gpuveto = find_run_binary.find_path_to_program('gpuveto')
|
|
assert os.path.isfile(self.bench_pictures)
|
|
assert os.path.isfile(self.gpuveto)
|
|
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\n' % (self.truePositives,
|
|
self.falsePositives,
|
|
self.trueNegatives,
|
|
self.falseNegatives))
|
|
|
|
|
|
def process_skp(self, skp_file):
|
|
assert os.path.isfile(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',
|
|
'--config', '8888']
|
|
returncode, output = execute_program(args)
|
|
if (returncode != 0):
|
|
return
|
|
|
|
matches = re.findall('[\d.]+', output)
|
|
if len(matches) != 4:
|
|
return
|
|
|
|
rasterTime = float(matches[3])
|
|
|
|
# run gpu config
|
|
args2 = [self.bench_pictures, '-r', skp_file,
|
|
'--repeat', '20',
|
|
'--config', 'gpu']
|
|
returncode, output = execute_program(args2)
|
|
if (returncode != 0):
|
|
return
|
|
|
|
matches = re.findall('[\d.]+', output)
|
|
if len(matches) != 4:
|
|
return
|
|
|
|
gpuTime = float(matches[3])
|
|
|
|
sys.stdout.write('%s: gpuveto: %d raster %.2f gpu: %.2f\n' % (
|
|
skp_file, suitable, rasterTime, gpuTime))
|
|
|
|
if suitable:
|
|
if gpuTime < rasterTime:
|
|
self.truePositives += 1
|
|
else:
|
|
self.falsePositives += 1
|
|
else:
|
|
if gpuTime < rasterTime:
|
|
self.falseNegatives += 1
|
|
else:
|
|
self.trueNegatives += 1
|
|
|
|
|
|
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]))
|