bench_pictures_main.cpp revision cf6c44cf9287af8b425fb0d9d286a6d57ad03897
1006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com/*
2006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * Copyright 2012 Google Inc.
3006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com *
4006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * Use of this source code is governed by a BSD-style license that can be
5006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * found in the LICENSE file.
6006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com */
7006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
8006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "BenchTimer.h"
9cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org#include "SamplePipeControllers.h"
10006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkBitmap.h"
11006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkCanvas.h"
12cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org#include "SkGPipe.h"
13006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkOSFile.h"
14006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkPicture.h"
15006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkStream.h"
16006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkTArray.h"
17006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "picture_utils.h"
18006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
19006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comconst int DEFAULT_REPEATS = 100;
20006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comconst int DEFAULT_TILE_WIDTH = 256;
21006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comconst int DEFAULT_TILE_HEIGHT = 256;
22006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
23006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstruct Options;
24006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void run_simple_benchmark(SkPicture* picture, const SkBitmap&,
25006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                                 const Options&);
26006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
27006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstruct Options {
28006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    int fRepeats;
29006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    void (*fBenchmark) (SkPicture*, const SkBitmap& bitmap,
30006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                        const Options& options);
31006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    int fTileWidth;
32006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    int fTileHeight;
33006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
34006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    Options() : fRepeats(DEFAULT_REPEATS), fBenchmark(run_simple_benchmark),
35006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    fTileWidth(DEFAULT_TILE_WIDTH), fTileHeight(DEFAULT_TILE_HEIGHT){}
36006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com};
37006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
38006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void usage(const char* argv0) {
39006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf("SkPicture benchmarking tool\n");
40006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf("\n"
41006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"Usage: \n"
42d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org"     %s <inputDir>...\n"
43006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"     [--repeat] [--tile width height]"
44006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com, argv0);
45006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf("\n\n");
46006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf(
47d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org"     inputDir:  A list of directories and files to use as input.\n"
48d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org"                    Files are expected to have the .skp extension.\n\n");
49006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf(
50cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org"     --pipe : "
51cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org"Set to use piping."
52cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org" Default is to not use piping.\n");
53cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    SkDebugf(
54006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"     --repeat : "
55006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"Set the number of times to repeat each test."
56006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com" Default is %i.\n", DEFAULT_REPEATS);
57006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf(
58006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"     --tile width height: "
59006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"Set to use the tiling size and specify the dimensions of each tile."
60006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com" Default is to not use tiling\n");
61006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
62006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
63006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void run_simple_benchmark(SkPicture* picture,
64006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                                 const SkBitmap& bitmap,
65006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                                 const Options& options) {
66006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkCanvas canvas(bitmap);
67006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
68006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    // We throw this away to remove first time effects (such as paging in this
69006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    // program)
70006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    canvas.drawPicture(*picture);
71006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
72006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    BenchTimer timer = BenchTimer(NULL);
73006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    timer.start();
74006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (int i = 0; i < options.fRepeats; ++i) {
75006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        canvas.drawPicture(*picture);
76006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
77006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    timer.end();
78006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
79006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    printf("simple: cmsecs = %6.2f\n", timer.fWall / options.fRepeats);
80006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
81006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
82006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstruct TileInfo {
83006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkBitmap* fBitmap;
84006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkCanvas* fCanvas;
85006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com};
86006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
87006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void setup_single_tile(const SkBitmap& bitmap, const Options& options,
88006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                              SkTArray<TileInfo>* tiles,
89006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                              int tile_x_start, int tile_y_start) {
90006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    TileInfo& tile = tiles->push_back();
91006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    tile.fBitmap = new SkBitmap();
92006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkIRect rect = SkIRect::MakeXYWH(tile_x_start, tile_y_start,
93006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                                             options.fTileWidth,
94006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                                             options.fTileHeight);
95006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    bitmap.extractSubset(tile.fBitmap, rect);
96006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    tile.fCanvas = new SkCanvas(*(tile.fBitmap));
97006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    tile.fCanvas->translate(-tile_x_start, -tile_y_start);
98006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
99006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
100006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void setup_tiles(SkPicture* picture, const SkBitmap& bitmap,
101006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                        const Options& options, SkTArray<TileInfo>* tiles) {
102006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (int tile_y_start = 0; tile_y_start < picture->height();
103006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com         tile_y_start += options.fTileHeight) {
104006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        for (int tile_x_start = 0; tile_x_start < picture->width();
105006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com             tile_x_start += options.fTileWidth) {
106006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            setup_single_tile(bitmap, options, tiles, tile_x_start,
107006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                              tile_y_start);
108006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        }
109006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
110006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
111006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
112006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
113006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void run_tile_benchmark(SkPicture* picture, const SkBitmap& bitmap,
114006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                               const Options& options) {
115006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkTArray<TileInfo> tiles;
116006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    setup_tiles(picture, bitmap, options, &tiles);
117006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
118006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    // We throw this away to remove first time effects (such as paging in this
119006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    // program)
120006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (int j = 0; j < tiles.count(); ++j) {
121006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        tiles[j].fCanvas->drawPicture(*picture);
122006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
123006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
124006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    BenchTimer timer = BenchTimer(NULL);
125006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    timer.start();
126006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (int i = 0; i < options.fRepeats; ++i) {
127006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        for (int j = 0; j < tiles.count(); ++j) {
128006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            tiles[j].fCanvas->drawPicture(*picture);
129006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        }
130006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
131006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    timer.end();
132006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
133006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (int i = 0; i < tiles.count(); ++i) {
134006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        delete tiles[i].fCanvas;
135006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        delete tiles[i].fBitmap;
136006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
137006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
138006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    printf("tile%ix%i: cmsecs = %6.2f\n", options.fTileWidth,
139006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com           options.fTileHeight, timer.fWall / options.fRepeats);
140006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
141006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
142cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.orgstatic void pipe_run(SkPicture* picture, SkCanvas* canvas) {
143cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    PipeController pipeController(canvas);
144cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    SkGPipeWriter writer;
145cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    SkCanvas* pipeCanvas = writer.startRecording(&pipeController);
146cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    pipeCanvas->drawPicture(*picture);
147cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    writer.endRecording();
148cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org}
149cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org
150cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.orgstatic void run_pipe_benchmark(SkPicture* picture, const SkBitmap& bitmap,
151cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org                                    const Options& options) {
152cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    SkCanvas canvas(bitmap);
153cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org
154cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    // We throw this away to remove first time effects (such as paging in this
155cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    // program)
156cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    pipe_run(picture, &canvas);
157cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org
158cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    BenchTimer timer = BenchTimer(NULL);
159cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    timer.start();
160cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    for (int i = 0; i < options.fRepeats; ++i) {
161cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org        pipe_run(picture, &canvas);
162cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    }
163cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    timer.end();
164cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org
165cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    printf("pipe: cmsecs = %6.2f\n", timer.fWall / options.fRepeats);
166cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org}
167cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org
168d1dc920097194e3342355185528c84408a9929c8keyar@chromium.orgstatic void run_single_benchmark(const SkString& inputPath,
169d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org                                 const Options& options) {
170006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkFILEStream inputStream;
171006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
172006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    inputStream.setPath(inputPath.c_str());
173006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    if (!inputStream.isValid()) {
174006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        SkDebugf("Could not open file %s\n", inputPath.c_str());
175006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        return;
176006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
177006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
178006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkPicture picture(&inputStream);
179006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkBitmap bitmap;
180006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    sk_tools::setup_bitmap(&bitmap, picture.width(), picture.height());
181006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
182d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkString filename;
183d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    sk_tools::get_basename(&filename, inputPath);
184006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    printf("running bench [%i %i] %s ", picture.width(), picture.height(),
185d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org           filename.c_str());
186d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org
187006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    options.fBenchmark(&picture, bitmap, options);
188006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
189006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
190006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void parse_commandline(int argc, char* const argv[],
191d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org                              SkTArray<SkString>* inputs, Options* options) {
192006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    const char* argv0 = argv[0];
193006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    char* const* stop = argv + argc;
194006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
195006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (++argv; argv < stop; ++argv) {
196006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        if (0 == strcmp(*argv, "--repeat")) {
197006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            ++argv;
198006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            if (argv < stop) {
199006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                options->fRepeats = atoi(*argv);
200006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                if (options->fRepeats < 1) {
201006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                    SkDebugf("--repeat must be given a value > 0\n");
202006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                    exit(-1);
203006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                }
204006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            } else {
205006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                SkDebugf("Missing arg for --repeat\n");
206006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                usage(argv0);
207006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                exit(-1);
208006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            }
209006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        } else if (0 == strcmp(*argv, "--tile")) {
210006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            options->fBenchmark = run_tile_benchmark;
211006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            ++argv;
212006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            if (argv < stop) {
213006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                options->fTileWidth = atoi(*argv);
214006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                if (options->fTileWidth < 1) {
215006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                    SkDebugf("--tile must be given a width with a value > 0\n");
216006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                    exit(-1);
217006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                }
218006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            } else {
219006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                SkDebugf("Missing width for --tile\n");
220006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                usage(argv0);
221006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                exit(-1);
222006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            }
223006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            ++argv;
224006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            if (argv < stop) {
225006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                options->fTileHeight = atoi(*argv);
226006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                if (options->fTileHeight < 1) {
227006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                    SkDebugf("--tile must be given a height with a value > 0"
228006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                             "\n");
229006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                    exit(-1);
230006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                }
231006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            } else {
232006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                SkDebugf("Missing height for --tile\n");
233006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                usage(argv0);\
234006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                exit(-1);
235006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            }
236cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org        } else if (0 == strcmp(*argv, "--pipe")) {
237cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org            options->fBenchmark = run_pipe_benchmark;
238006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        } else if (0 == strcmp(*argv, "--help") || 0 == strcmp(*argv, "-h")) {
239006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            usage(argv0);
240006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            exit(0);
241006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        } else {
242d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org            inputs->push_back(SkString(*argv));
243006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        }
244006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
245006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
246d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    if (inputs->count() < 1) {
247006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        usage(argv0);
248006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        exit(-1);
249006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
250d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org}
251d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org
252d1dc920097194e3342355185528c84408a9929c8keyar@chromium.orgstatic void process_input(const SkString& input, const Options& options) {
253d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkOSFile::Iter iter(input.c_str(), "skp");
254d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkString inputFilename;
255006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
256d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    if (iter.next(&inputFilename)) {
257d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org        do {
258d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org            SkString inputPath;
259d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org            sk_tools::make_filepath(&inputPath, input.c_str(),
260d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org                                    inputFilename);
261d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org            run_single_benchmark(inputPath, options);
262d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org        } while(iter.next(&inputFilename));
263d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    } else {
264d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org          run_single_benchmark(input, options);
265d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    }
266006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
267006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
268006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comint main(int argc, char* const argv[]) {
269d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkTArray<SkString> inputs;
270006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    Options options;
271006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
272d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    parse_commandline(argc, argv, &inputs, &options);
273006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
274d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    for (int i = 0; i < inputs.count(); ++i) {
275d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org        process_input(inputs[i], options);
276006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
277006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
278