bench_pictures_main.cpp revision c0d5e549ab8d594a5da8db417db39622e9491fff
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"
94a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com#include "CopyTilesRenderer.h"
10163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org#include "PictureBenchmark.h"
119a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#include "SkBenchLogger.h"
12006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkCanvas.h"
130a36f43d5f710c47b63bc4bbfde9bbb7d59a88d1scroggo@google.com#include "SkGraphics.h"
145a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com#include "SkImageDecoder.h"
15f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org#include "SkMath.h"
16006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkOSFile.h"
17006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkPicture.h"
18006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkStream.h"
19006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkTArray.h"
20006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "picture_utils.h"
21006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
2213fd5a15a170c0d024f4907991d8a57d8adf755eborenet@google.comconst int DEFAULT_REPEATS = 1;
23006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
24a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic char const * const gFilterTypes[] = {
25a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "paint",
26a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "point",
27a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "line",
28a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "bitmap",
29a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "rect",
30a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "path",
31a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "text",
32a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "all",
33a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com};
34a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
35a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic const size_t kFilterTypesCount = sizeof(gFilterTypes) / sizeof(gFilterTypes[0]);
36a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
37a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic char const * const gFilterFlags[] = {
38a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "antiAlias",
39a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "filterBitmap",
40a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "dither",
41a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "underlineText",
42a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "strikeThruText",
43a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "fakeBoldText",
44a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "linearText",
45a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "subpixelText",
46a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "devKernText",
47a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "LCDRenderText",
48a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "embeddedBitmapText",
49a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "autoHinting",
50a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "verticalText",
51a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "genA8FromLCD",
52a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "blur",
53e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com    "lowBlur",
54a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "hinting",
55a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    "slightHinting",
56e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com    "AAClip",
57a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com};
58a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
59a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic const size_t kFilterFlagsCount = sizeof(gFilterFlags) / sizeof(gFilterFlags[0]);
60a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
61a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filtersName(sk_tools::PictureRenderer::DrawFilterFlags* drawFilters) {
62a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    int all = drawFilters[0];
63a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    size_t tIndex;
64a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    for (tIndex = 1; tIndex < SkDrawFilter::kTypeCount; ++tIndex) {
65a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        all &= drawFilters[tIndex];
66a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    }
67a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SkString result;
68a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) {
69a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        SkString types;
70a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        if (all & (1 << fIndex)) {
71a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            types = gFilterTypes[SkDrawFilter::kTypeCount];
72a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        } else {
73a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            for (tIndex = 0; tIndex < SkDrawFilter::kTypeCount; ++tIndex) {
74a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                if (drawFilters[tIndex] & (1 << fIndex)) {
75a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    types += gFilterTypes[tIndex];
76a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                }
77a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            }
78a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        }
79a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        if (!types.size()) {
80a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            continue;
81a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        }
82a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        result += "_";
83a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        result += types;
84a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        result += ".";
85a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        result += gFilterFlags[fIndex];
86a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    }
87a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    return result;
88a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}
89a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
90a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filterTypesUsage() {
91a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SkString result;
92a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    for (size_t index = 0; index < kFilterTypesCount; ++index) {
93a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        result += gFilterTypes[index];
94a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        if (index < kFilterTypesCount - 1) {
95a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            result += " | ";
96a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        }
97a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    }
98a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    return result;
99a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}
100a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
101a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filterFlagsUsage() {
102a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SkString result;
103a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    size_t len = 0;
104a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    for (size_t index = 0; index < kFilterFlagsCount; ++index) {
105a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        result += gFilterFlags[index];
106a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        if (result.size() - len >= 72) {
107a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            result += "\n           ";
108a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            len = result.size();
109a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        }
110a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        if (index < kFilterFlagsCount - 1) {
111a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            result += " | ";
112a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        }
113a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    }
114a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    return result;
115a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}
116a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
117006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void usage(const char* argv0) {
118006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf("SkPicture benchmarking tool\n");
119006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf("\n"
120006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"Usage: \n"
121d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org"     %s <inputDir>...\n"
1225239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com"     [--logFile filename][--timers [wcgWC]*][--logPerIter 1|0][--min]\n"
123795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"     [--repeat] \n"
1244a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"     [--mode pow2tile minWidth height | record | simple\n"
1254a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"             | tile width height | playbackCreation]\n"
12658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"     [--pipe]\n"
1279313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org"     [--bbh bbhType]\n"
128bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com"     [--multi numThreads]\n"
129c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com"     [--viewport width height]\n"
130c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org"     [--device bitmap"
131c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU
132c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" | gpu"
133c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif
134a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com"]\n"
135a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com"     [--filter [%s]:\n            [%s]]\n"
136a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com, argv0, filterTypesUsage().c_str(), filterFlagsUsage().c_str());
137a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SkDebugf("\n");
138006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf(
139795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"     inputDir:  A list of directories and files to use as input. Files are\n"
1409a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com"                expected to have the .skp extension.\n\n"
1419a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com"     --logFile filename : destination for writing log output, in addition to stdout.\n");
1425239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    SkDebugf("     --logPerIter 1|0 : "
1435239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com             "Log each repeat timer instead of mean, default is disabled.\n");
1445239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    SkDebugf("     --min : Print the minimum times (instead of average).\n");
1455239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    SkDebugf("     --timers [wcgWC]* : "
1465239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com             "Display wall, cpu, gpu, truncated wall or truncated cpu time for each picture.\n");
147006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf(
1484a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"     --mode pow2tile minWidth height | copyTile width height | record | simple\n"
1494a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"            | tile width height | playbackCreation:\n"
15058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"            Run in the corresponding mode.\n"
15158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"            Default is simple.\n");
152cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org    SkDebugf(
1534a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                     pow2tile minWidth height, Creates tiles with widths\n"
15458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 that are all a power of two\n"
15558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 such that they minimize the\n"
15658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 amount of wasted tile space.\n"
15758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 minWidth is the minimum width\n"
15858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 of these tiles and must be a\n"
15958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 power of two. Simple\n"
16058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com"                                                 rendering using these tiles\n"
161bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com"                                                 is benchmarked.\n");
162f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org    SkDebugf(
163795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"                     record, Benchmark picture to picture recording.\n");
164795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org    SkDebugf(
165795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"                     simple, Benchmark a simple rendering.\n");
166795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org    SkDebugf(
1674a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                     tile width height, Benchmark simple rendering using\n"
1684a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                            tiles with the given dimensions.\n"
1694a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                     copyTile width height, Draw the picture, then copy it into tiles.\n"
1704a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                                Does not support percentages.\n"
1714a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                                If the picture is large enough, breaks it into\n"
1724a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                                larger tiles (and draws the picture once per\n"
1734a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                                larger tile) to avoid creating a large canvas.\n"
1744a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                                Add --tiles x y to specify the number of tiles\n"
1754a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com"                                                per larger tile in the x and y direction.\n"
1764a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com             );
177006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkDebugf(
1789a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com"                     playbackCreation, Benchmark creation of the SkPicturePlayback.\n");
179795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org    SkDebugf("\n");
1804916971526d53d873179ba1377e128a3a38a0056keyar@chromium.org    SkDebugf(
181bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com"     --multi numThreads : Set the number of threads for multi threaded drawing. Must be greater\n"
182bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com"                          than 1. Only works with tiled rendering.\n"
183c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com"     --viewport width height : Set the viewport.\n"
184a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com"     --pipe: Benchmark SkGPipe rendering. Currently incompatible with \"mode\".\n");
18558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    SkDebugf(
1867b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org"     --bbh bbhType [width height]: Set the bounding box hierarchy type to\n"
1877b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org"                     be used. Accepted values are: none, rtree, grid. Default\n"
1887b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org"                     value is none. Not compatible with --pipe. With value\n"
1897b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org"                     'grid', width and height must be specified. 'grid' can\n"
1907b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org"                     only be used with modes tile, record, and\n"
1917b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org"                     playbackCreation.");
1929313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    SkDebugf(
193c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org"     --device bitmap"
194c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU
195c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" | gpu"
196c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif
197c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org": Use the corresponding device. Default is bitmap.\n");
198c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    SkDebugf(
199c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org"                     bitmap, Render to a bitmap.\n");
200c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU
201a40c20df0e4c5d04acb0841d70127778c0a779eckeyar@chromium.org    SkDebugf(
202c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org"                     gpu, Render to the GPU.\n");
203c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif
204c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    SkDebugf("\n");
205c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    SkDebugf(
206795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"     --repeat:  "
207795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"Set the number of times to repeat each test."
208795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" Default is %i.\n", DEFAULT_REPEATS);
209a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SkDebugf(
210e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com"     --filter type:flag : Enable canvas filtering to disable a paint flag,\n"
211e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com"                     use no blur or low quality blur, or use no hinting or\n"
212e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com"                     slight hinting. For all flags except AAClip, specify the\n"
213e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com"                     type of primitive to effect, or choose all. for AAClip\n"
214e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com"                     alone, the filter affects all clips independent of type.\n");
215006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
216006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
2179a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comSkBenchLogger gLogger;
2189a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
21966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.comstatic bool run_single_benchmark(const SkString& inputPath,
220163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org                                 sk_tools::PictureBenchmark& benchmark) {
221006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    SkFILEStream inputStream;
222006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
223006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    inputStream.setPath(inputPath.c_str());
224006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    if (!inputStream.isValid()) {
2259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        SkString err;
2269a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        err.printf("Could not open file %s\n", inputPath.c_str());
2279a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        gLogger.logError(err);
22866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        return false;
229006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
230006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
23166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    bool success = false;
2325a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com    SkPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream);
23366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    if (!success) {
23466bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        SkString err;
23566bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        err.printf("Could not read an SkPicture from %s\n", inputPath.c_str());
23666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        gLogger.logError(err);
23766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        return false;
23866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    }
239006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
240d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkString filename;
241d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    sk_tools::get_basename(&filename, inputPath);
242db9a5fb55f77935774f21e07a04b6d1350ca54cckeyar@chromium.org
243db9a5fb55f77935774f21e07a04b6d1350ca54cckeyar@chromium.org    SkString result;
2442d2b9a0d8c78c62565e8eedeca3c337827d795c1borenet@google.com    result.printf("running bench [%i %i] %s ", picture.width(),
2452d2b9a0d8c78c62565e8eedeca3c337827d795c1borenet@google.com                  picture.height(), filename.c_str());
2469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    gLogger.logProgress(result);
247d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org
2482d2b9a0d8c78c62565e8eedeca3c337827d795c1borenet@google.com    benchmark.run(&picture);
24966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    return true;
250006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
251006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
252a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#define PRINT_USAGE_AND_EXIT \
253a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    do {                     \
254a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        usage(argv0);        \
255a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        exit(-1);            \
256a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    } while (0)
257a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
258163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.orgstatic void parse_commandline(int argc, char* const argv[], SkTArray<SkString>* inputs,
2595239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                              sk_tools::PictureBenchmark* benchmark) {
260006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    const char* argv0 = argv[0];
261006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    char* const* stop = argv + argc;
262006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
263163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org    int repeats = DEFAULT_REPEATS;
264c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    sk_tools::PictureRenderer::SkDeviceTypes deviceType =
265c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org        sk_tools::PictureRenderer::kBitmap_DeviceType;
266163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org
267a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    SkAutoTUnref<sk_tools::PictureRenderer> renderer(NULL);
2685239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com
2699a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    // Create a string to show our current settings.
2709a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    // TODO: Make it prettier. Currently it just repeats the command line.
2719a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    SkString commandLine("bench_pictures:");
2729a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    for (int i = 1; i < argc; i++) {
2739a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        commandLine.appendf(" %s", *(argv+i));
2749a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    }
2759a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    commandLine.append("\n");
2769a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
27758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    bool usePipe = false;
278bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com    int numThreads = 1;
27958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    bool useTiles = false;
28058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    const char* widthString = NULL;
28158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    const char* heightString = NULL;
2827b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    int gridWidth = 0;
2837b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    int gridHeight = 0;
28458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    bool isPowerOf2Mode = false;
2854a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com    bool isCopyMode = false;
2864a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com    const char* xTilesString = NULL;
2874a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com    const char* yTilesString = NULL;
28858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    const char* mode = NULL;
2897b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    bool gridSupported = false;
2901aa90cf11e136a722bce71dd77f4bb03cc2b56f8skia.committer@gmail.com    sk_tools::PictureRenderer::BBoxHierarchyType bbhType =
2919313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org        sk_tools::PictureRenderer::kNone_BBoxHierarchyType;
292a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    sk_tools::PictureRenderer::DrawFilterFlags drawFilters[SkDrawFilter::kTypeCount];
293a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    sk_bzero(drawFilters, sizeof(drawFilters));
294c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    SkISize viewport;
295c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    viewport.setEmpty();
296006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    for (++argv; argv < stop; ++argv) {
297006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        if (0 == strcmp(*argv, "--repeat")) {
298006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            ++argv;
299006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            if (argv < stop) {
300163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org                repeats = atoi(*argv);
301163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org                if (repeats < 1) {
3029a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    gLogger.logError("--repeat must be given a value > 0\n");
303a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                    PRINT_USAGE_AND_EXIT;
304006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com                }
305006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            } else {
3069a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                gLogger.logError("Missing arg for --repeat\n");
307a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
308006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            }
30958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        } else if (0 == strcmp(*argv, "--pipe")) {
31058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            usePipe = true;
3119a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        } else if (0 == strcmp(*argv, "--logFile")) {
3129a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com            argv++;
3139a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com            if (argv < stop) {
3149a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                if (!gLogger.SetLogFile(*argv)) {
3159a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    SkString str;
3169a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    str.printf("Could not open %s for writing.", *argv);
3179a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    gLogger.logError(str);
3189a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    usage(argv0);
319a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com                    // TODO(borenet): We're disabling this for now, due to
320a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com                    // write-protected Android devices.  The very short-term
321a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com                    // solution is to ignore the fact that we have no log file.
322a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com                    //exit(-1);
3239a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                }
3249a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com            } else {
3259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                gLogger.logError("Missing arg for --logFile\n");
326a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
3279a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com            }
328bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com        } else if (0 == strcmp(*argv, "--multi")) {
329bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            ++argv;
330bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            if (argv >= stop) {
331bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com                gLogger.logError("Missing arg for --multi\n");
332a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
333bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            }
334bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            numThreads = atoi(*argv);
335bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            if (numThreads < 2) {
336bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com                gLogger.logError("Number of threads must be at least 2.\n");
337a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
338bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            }
3399313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org        } else if (0 == strcmp(*argv, "--bbh")) {
3409313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            ++argv;
3419313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            if (argv >= stop) {
3429313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org                gLogger.logError("Missing value for --bbh\n");
343a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
3449313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            }
3459313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            if (0 == strcmp(*argv, "none")) {
3469313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org                bbhType = sk_tools::PictureRenderer::kNone_BBoxHierarchyType;
3479313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            } else if (0 == strcmp(*argv, "rtree")) {
3489313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org                bbhType = sk_tools::PictureRenderer::kRTree_BBoxHierarchyType;
3497b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org            } else if (0 == strcmp(*argv, "grid")) {
3507b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                bbhType = sk_tools::PictureRenderer::kTileGrid_BBoxHierarchyType;
3517b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                ++argv;
3527b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                if (argv >= stop) {
3537b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                    gLogger.logError("Missing width for --bbh grid\n");
3547b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                    PRINT_USAGE_AND_EXIT;
3557b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                }
3567b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                gridWidth = atoi(*argv);
3577b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                ++argv;
3587b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                if (argv >= stop) {
3597b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                    gLogger.logError("Missing height for --bbh grid\n");
3607b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                    PRINT_USAGE_AND_EXIT;
3617b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                }
3627b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                gridHeight = atoi(*argv);
3639313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            } else {
3649313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org                SkString err;
3659313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org                err.printf("%s is not a valid value for --bbhType\n", *argv);
3669313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org                gLogger.logError(err);
367a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
3689313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org            }
3699313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org
370795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org        } else if (0 == strcmp(*argv, "--mode")) {
371a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            if (renderer.get() != NULL) {
372a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                SkDebugf("Cannot combine modes.\n");
373a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
374a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            }
375795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org
376006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            ++argv;
377795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org            if (argv >= stop) {
3789a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                gLogger.logError("Missing mode for --mode\n");
379a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
380795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org            }
381795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org
38258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            if (0 == strcmp(*argv, "record")) {
383a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                renderer.reset(SkNEW(sk_tools::RecordPictureRenderer));
3847b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                gridSupported = true;
3855a34fd3f9876174aea8b22e1b585b4244e71b0b1reed@google.com            } else if (0 == strcmp(*argv, "clone")) {
3865a34fd3f9876174aea8b22e1b585b4244e71b0b1reed@google.com                renderer.reset(sk_tools::CreatePictureCloneRenderer());
387795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org            } else if (0 == strcmp(*argv, "simple")) {
388a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                renderer.reset(SkNEW(sk_tools::SimplePictureRenderer));
3894a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            } else if ((0 == strcmp(*argv, "tile")) || (0 == strcmp(*argv, "pow2tile"))
3904a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                       || 0 == strcmp(*argv, "copyTile")) {
39158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com                useTiles = true;
39258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com                mode = *argv;
393f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org
394f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org                if (0 == strcmp(*argv, "pow2tile")) {
395f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org                    isPowerOf2Mode = true;
3964a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                } else if (0 == strcmp(*argv, "copyTile")) {
3974a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                    isCopyMode = true;
3987b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                } else {
3997b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                    gridSupported = true;
400f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org                }
401f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org
402795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org                ++argv;
403795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org                if (argv >= stop) {
4049a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    SkString err;
4059a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    err.printf("Missing width for --mode %s\n", mode);
4069a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                    gLogger.logError(err);
407a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                    PRINT_USAGE_AND_EXIT;
408795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org                }
409795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org
41058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com                widthString = *argv;
411795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org                ++argv;
412795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org                if (argv >= stop) {
4134a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                    SkString err;
4144a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                    err.appendf("Missing height for --mode %s\n", mode);
4154a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                    gLogger.logError(err);
416a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                    PRINT_USAGE_AND_EXIT;
417795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org                }
41858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com                heightString = *argv;
4199a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com            } else if (0 == strcmp(*argv, "playbackCreation")) {
420a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                renderer.reset(SkNEW(sk_tools::PlaybackCreationRenderer));
4217b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org                gridSupported = true;
422fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com            } else if (0 == strcmp(*argv, "gatherPixelRefs")) {
423fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com                renderer.reset(sk_tools::CreateGatherPixelRefsRenderer());
424006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            } else {
4259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                SkString err;
4269a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                err.printf("%s is not a valid mode for --mode\n", *argv);
4279a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                gLogger.logError(err);
428a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
429006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com            }
430c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com        } else if (0 == strcmp(*argv, "--viewport")) {
431c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            ++argv;
432c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            if (argv >= stop) {
433c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com                gLogger.logError("Missing width for --viewport\n");
434c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com                PRINT_USAGE_AND_EXIT;
435c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            }
436c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            viewport.fWidth = atoi(*argv);
437c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            ++argv;
438c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            if (argv >= stop) {
439c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com                gLogger.logError("Missing height for --viewport\n");
440c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com                PRINT_USAGE_AND_EXIT;
441c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            }
442c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            viewport.fHeight = atoi(*argv);
4434a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com        } else if (0 == strcmp(*argv, "--tiles")) {
4444a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            ++argv;
4454a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            if (argv >= stop) {
4464a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError("Missing x for --tiles\n");
4474a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                PRINT_USAGE_AND_EXIT;
4484a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            }
4494a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            xTilesString = *argv;
4504a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            ++argv;
4514a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            if (argv >= stop) {
4524a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError("Missing y for --tiles\n");
4534a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                PRINT_USAGE_AND_EXIT;
4544a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            }
4554a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            yTilesString = *argv;
456c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org        }  else if (0 == strcmp(*argv, "--device")) {
457c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            ++argv;
458c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            if (argv >= stop) {
459a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com                gLogger.logError("Missing mode for --device\n");
460a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
461c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            }
462c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org
463c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            if (0 == strcmp(*argv, "bitmap")) {
464c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org                deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType;
465c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            }
466c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU
467c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            else if (0 == strcmp(*argv, "gpu")) {
468c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org                deviceType = sk_tools::PictureRenderer::kGPU_DeviceType;
469c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            }
470c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif
471c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            else {
4729a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                SkString err;
4739a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                err.printf("%s is not a valid mode for --device\n", *argv);
4749a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                gLogger.logError(err);
475a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
476c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org            }
4775239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com        } else if (0 == strcmp(*argv, "--timers")) {
4785239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            ++argv;
4795239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            if (argv < stop) {
4805239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                bool timerWall = false;
4815239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                bool truncatedTimerWall = false;
4825239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                bool timerCpu = false;
4835239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                bool truncatedTimerCpu = false;
4845239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                bool timerGpu = false;
4855239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                for (char* t = *argv; *t; ++t) {
4865239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                    switch (*t) {
4875239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        case 'w':
4885239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            timerWall = true;
4895239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            break;
4905239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        case 'c':
4915239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            timerCpu = true;
4925239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            break;
4935239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        case 'W':
4945239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            truncatedTimerWall = true;
4955239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            break;
4965239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        case 'C':
4975239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            truncatedTimerCpu = true;
4985239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            break;
4995239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        case 'g':
5005239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            timerGpu = true;
5015239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            break;
5025239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        default: {
5035239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                            break;
5045239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                        }
5055239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                    }
5065239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                }
5075239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                benchmark->setTimersToShow(timerWall, truncatedTimerWall, timerCpu,
5085239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                                           truncatedTimerCpu, timerGpu);
5095239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            } else {
5105239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                gLogger.logError("Missing arg for --timers\n");
511a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
5125239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            }
5135239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com        } else if (0 == strcmp(*argv, "--min")) {
5145239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            benchmark->setPrintMin(true);
5155239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com        } else if (0 == strcmp(*argv, "--logPerIter")) {
5165239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            ++argv;
5175239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            if (argv < stop) {
5185239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                bool log = atoi(*argv) != 0;
5195239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                benchmark->setLogPerIter(log);
5205239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            } else {
5215239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                gLogger.logError("Missing arg for --logPerIter\n");
522a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
5235239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            }
524a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        } else if (0 == strcmp(*argv, "--filter")) {
525a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            ++argv;
526a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            if (argv < stop) {
527a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                const char* colon = strchr(*argv, ':');
528a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                if (colon) {
529a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    int type = -1;
530a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    size_t typeLen = colon - *argv;
531a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    for (size_t tIndex = 0; tIndex < kFilterTypesCount; ++tIndex) {
532a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        if (typeLen == strlen(gFilterTypes[tIndex])
533a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                                && !strncmp(*argv, gFilterTypes[tIndex], typeLen)) {
534a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                            type = tIndex;
535a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                            break;
536a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        }
537a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    }
538a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    if (type < 0) {
539a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        SkString err;
540a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        err.printf("Unknown type for --filter %s\n", *argv);
541a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        gLogger.logError(err);
542a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        PRINT_USAGE_AND_EXIT;
543a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    }
544a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    int flag = -1;
545a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    size_t flagLen = strlen(*argv) - typeLen - 1;
546a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) {
547a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        if (flagLen == strlen(gFilterFlags[fIndex])
548a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                                && !strncmp(colon + 1, gFilterFlags[fIndex], flagLen)) {
549a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                            flag = 1 << fIndex;
550a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                            break;
551a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        }
552a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    }
553a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    if (flag < 0) {
554a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        SkString err;
555a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        err.printf("Unknown flag for --filter %s\n", *argv);
556a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        gLogger.logError(err);
557a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        PRINT_USAGE_AND_EXIT;
558a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    }
559a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    for (int index = 0; index < SkDrawFilter::kTypeCount; ++index) {
560a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        if (type != SkDrawFilter::kTypeCount && index != type) {
561a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                            continue;
562a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        }
563a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                        drawFilters[index] = (sk_tools::PictureRenderer::DrawFilterFlags)
564a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                                (drawFilters[index] | flag);
565a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    }
566a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                } else {
567a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    SkString err;
568a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    err.printf("Unknown arg for --filter %s : missing colon\n", *argv);
569a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    gLogger.logError(err);
570a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                    PRINT_USAGE_AND_EXIT;
571a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                }
572a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            } else {
573a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                gLogger.logError("Missing arg for --filter\n");
574a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com                PRINT_USAGE_AND_EXIT;
575a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            }
576006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        } else if (0 == strcmp(*argv, "--help") || 0 == strcmp(*argv, "-h")) {
577a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            PRINT_USAGE_AND_EXIT;
578006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        } else {
579d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org            inputs->push_back(SkString(*argv));
580006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com        }
581006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
582006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
583bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com    if (numThreads > 1 && !useTiles) {
584bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com        gLogger.logError("Multithreaded drawing requires tiled rendering.\n");
585a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        PRINT_USAGE_AND_EXIT;
586bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com    }
587bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com
5889313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    if (usePipe && sk_tools::PictureRenderer::kNone_BBoxHierarchyType != bbhType) {
5899313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org        gLogger.logError("--pipe and --bbh cannot be used together\n");
590a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        PRINT_USAGE_AND_EXIT;
5919313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    }
5929313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org
5937b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    if (sk_tools::PictureRenderer::kTileGrid_BBoxHierarchyType == bbhType &&
5947b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org        !gridSupported) {
5957b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org        gLogger.logError("'--bbh grid' is not compatible with specified --mode.\n");
5967b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org        PRINT_USAGE_AND_EXIT;
5977b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    }
5987b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
59958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    if (useTiles) {
6005239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com        SkASSERT(NULL == renderer);
601a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        sk_tools::TiledPictureRenderer* tiledRenderer;
6024a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com        if (isCopyMode) {
6034a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            int x, y;
6044a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            if (xTilesString != NULL) {
6054a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkASSERT(yTilesString != NULL);
6064a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                x = atoi(xTilesString);
6074a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                y = atoi(yTilesString);
6084a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                if (x <= 0 || y <= 0) {
6094a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                    gLogger.logError("--tiles must be given values > 0\n");
6104a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                    PRINT_USAGE_AND_EXIT;
6114a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                }
6124a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            } else {
6134a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                x = y = 4;
6144a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            }
6154a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            tiledRenderer = SkNEW_ARGS(sk_tools::CopyTilesRenderer, (x, y));
6164a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com        } else if (numThreads > 1) {
617a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            tiledRenderer = SkNEW_ARGS(sk_tools::MultiCorePictureRenderer, (numThreads));
618a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        } else {
619a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            tiledRenderer = SkNEW(sk_tools::TiledPictureRenderer);
620a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        }
62158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        if (isPowerOf2Mode) {
62258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            int minWidth = atoi(widthString);
62358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            if (!SkIsPow2(minWidth) || minWidth < 0) {
6245239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                tiledRenderer->unref();
6259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                SkString err;
6265239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                err.printf("-mode %s must be given a width"
62758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com                         " value that is a power of two\n", mode);
6289a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com                gLogger.logError(err);
629a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
63058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            }
6315239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            tiledRenderer->setTileMinPowerOf2Width(minWidth);
63258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        } else if (sk_tools::is_percentage(widthString)) {
6334a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            if (isCopyMode) {
6344a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                tiledRenderer->unref();
6354a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkString err;
6364a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                err.printf("--mode %s does not support percentages.\n", mode);
6374a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError(err.c_str());
6384a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                PRINT_USAGE_AND_EXIT;
6394a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            }
6405239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            tiledRenderer->setTileWidthPercentage(atof(widthString));
6415239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            if (!(tiledRenderer->getTileWidthPercentage() > 0)) {
6425239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                tiledRenderer->unref();
6434a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkString err;
6444a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                err.appendf("--mode %s must be given a width percentage > 0\n", mode);
6454a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError(err);
646a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
64758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            }
64858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        } else {
6495239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            tiledRenderer->setTileWidth(atoi(widthString));
6505239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            if (!(tiledRenderer->getTileWidth() > 0)) {
6515239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                tiledRenderer->unref();
6524a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkString err;
6534a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                err.appendf("--mode %s must be given a width > 0\n", mode);
6544a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError(err);
655a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
65658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            }
65758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        }
65858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com
65958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        if (sk_tools::is_percentage(heightString)) {
6604a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            if (isCopyMode) {
6614a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                tiledRenderer->unref();
6624a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkString err;
6634a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                err.printf("--mode %s does not support percentages.\n", mode);
6644a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError(err.c_str());
6654a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                PRINT_USAGE_AND_EXIT;
6664a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com            }
6675239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            tiledRenderer->setTileHeightPercentage(atof(heightString));
6685239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            if (!(tiledRenderer->getTileHeightPercentage() > 0)) {
6695239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                tiledRenderer->unref();
6704a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkString err;
6714a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                err.appendf("--mode %s must be given a height percentage > 0\n", mode);
6724a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError(err);
673a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
67458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            }
67558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        } else {
6765239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            tiledRenderer->setTileHeight(atoi(heightString));
6775239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com            if (!(tiledRenderer->getTileHeight() > 0)) {
6785239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com                tiledRenderer->unref();
6794a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                SkString err;
6804a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                err.appendf("--mode %s must be given a height > 0\n", mode);
6814a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com                gLogger.logError(err);
682a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
68358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com            }
68458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com        }
685bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com        if (numThreads > 1) {
686bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com#if SK_SUPPORT_GPU
687bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            if (sk_tools::PictureRenderer::kGPU_DeviceType == deviceType) {
688bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com                tiledRenderer->unref();
689bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com                gLogger.logError("GPU not compatible with multithreaded tiling.\n");
690a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                PRINT_USAGE_AND_EXIT;
691bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com            }
692bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com#endif
693bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com        }
694a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        renderer.reset(tiledRenderer);
695a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        if (usePipe) {
696a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            SkDebugf("Pipe rendering is currently not compatible with tiling.\n"
697a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com                     "Turning off pipe.\n");
698a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        }
69958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    } else if (usePipe) {
700a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        if (renderer.get() != NULL) {
701a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            SkDebugf("Pipe is incompatible with other modes.\n");
702a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com            PRINT_USAGE_AND_EXIT;
703a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        }
704a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        renderer.reset(SkNEW(sk_tools::PipePictureRenderer));
70558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com    }
706d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    if (inputs->count() < 1) {
707a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        PRINT_USAGE_AND_EXIT;
708006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
709163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org
7105239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    if (NULL == renderer) {
711a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com        renderer.reset(SkNEW(sk_tools::SimplePictureRenderer));
712163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org    }
7139313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org
7149313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    renderer->setBBoxHierarchyType(bbhType);
715a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    renderer->setDrawFilters(drawFilters, filtersName(drawFilters));
7167b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    renderer->setGridSize(gridWidth, gridHeight);
717c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    renderer->setViewport(viewport);
718a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    benchmark->setRenderer(renderer);
719163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org    benchmark->setRepeats(repeats);
720c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    benchmark->setDeviceType(deviceType);
7219a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    benchmark->setLogger(&gLogger);
7229a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    // Report current settings:
7239a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    gLogger.logProgress(commandLine);
724d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org}
725d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org
72666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.comstatic int process_input(const SkString& input,
72766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com                         sk_tools::PictureBenchmark& benchmark) {
728d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkOSFile::Iter iter(input.c_str(), "skp");
729d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkString inputFilename;
73066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    int failures = 0;
731d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    if (iter.next(&inputFilename)) {
732d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org        do {
733d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org            SkString inputPath;
734163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org            sk_tools::make_filepath(&inputPath, input, inputFilename);
73557837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com            if (!run_single_benchmark(inputPath, benchmark)) {
73666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com                ++failures;
73757837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com            }
738d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org        } while(iter.next(&inputFilename));
73957837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com    } else if (SkStrEndsWith(input.c_str(), ".skp")) {
74057837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com        if (!run_single_benchmark(input, benchmark)) {
74166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com            ++failures;
74257837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com        }
74357837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com    } else {
74457837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com        SkString warning;
74557837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com        warning.printf("Warning: skipping %s\n", input.c_str());
74657837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com        gLogger.logError(warning);
747d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    }
74866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    return failures;
749006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
750006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
7515987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv);
7525987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) {
7535239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com#ifdef SK_ENABLE_INST_COUNT
7545239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    gPrintInstCount = true;
7555239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com#endif
7560a36f43d5f710c47b63bc4bbfde9bbb7d59a88d1scroggo@google.com    SkAutoGraphics ag;
7575239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com
758d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    SkTArray<SkString> inputs;
7595239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    sk_tools::PictureBenchmark benchmark;
760006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
7615239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com    parse_commandline(argc, argv, &inputs, &benchmark);
762006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com
76366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    int failures = 0;
764d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org    for (int i = 0; i < inputs.count(); ++i) {
76566bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        failures += process_input(inputs[i], benchmark);
76666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    }
76766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com
76866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com    if (failures != 0) {
76966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        SkString err;
77066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        err.printf("Failed to run %i benchmarks.\n", failures);
77166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        gLogger.logError(err);
77266bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com        return 1;
773006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com    }
774868e1f682eaff0a78ba61b3f1612cc6e7dd9c885caryclark@google.com    return 0;
775006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com}
7765987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com
7775987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#if !defined SK_BUILD_FOR_IOS
7785987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) {
7795987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com    return tool_main(argc, (char**) argv);
7805987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com}
7815987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif
782