blob: 87149e9af9c430cb2c6d622e9f7cea9e05a4c209 [file] [log] [blame]
reed@google.com006db0f2012-06-27 19:33:29 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "BenchTimer.h"
keyar@chromium.org163b5672012-08-01 17:53:29 +00009#include "PictureBenchmark.h"
scroggo@google.com9a412522012-09-07 15:21:18 +000010#include "SkBenchLogger.h"
reed@google.com006db0f2012-06-27 19:33:29 +000011#include "SkCanvas.h"
scroggo@google.com0a36f432012-09-10 20:29:13 +000012#include "SkGraphics.h"
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000013#include "SkImageDecoder.h"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000014#include "SkMath.h"
reed@google.com006db0f2012-06-27 19:33:29 +000015#include "SkOSFile.h"
16#include "SkPicture.h"
17#include "SkStream.h"
18#include "SkTArray.h"
19#include "picture_utils.h"
20
borenet@google.com13fd5a12012-09-17 21:10:05 +000021const int DEFAULT_REPEATS = 1;
reed@google.com006db0f2012-06-27 19:33:29 +000022
23static void usage(const char* argv0) {
24 SkDebugf("SkPicture benchmarking tool\n");
25 SkDebugf("\n"
26"Usage: \n"
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +000027" %s <inputDir>...\n"
scroggo@google.com5239c322012-09-11 19:15:32 +000028" [--logFile filename][--timers [wcgWC]*][--logPerIter 1|0][--min]\n"
keyar@chromium.org795cd472012-08-02 18:57:53 +000029" [--repeat] \n"
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000030" [--mode pow2tile minWidth height[] | record | simple\n"
31" | tile width[] height[] | playbackCreation]\n"
scroggo@google.com58b4ead2012-08-31 16:15:22 +000032" [--pipe]\n"
junov@chromium.org9313ca42012-11-02 18:11:49 +000033" [--bbh bbhType]\n"
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000034" [--multi numThreads]\n"
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000035" [--device bitmap"
36#if SK_SUPPORT_GPU
37" | gpu"
38#endif
39"]"
reed@google.com006db0f2012-06-27 19:33:29 +000040, argv0);
41 SkDebugf("\n\n");
42 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000043" inputDir: A list of directories and files to use as input. Files are\n"
scroggo@google.com9a412522012-09-07 15:21:18 +000044" expected to have the .skp extension.\n\n"
45" --logFile filename : destination for writing log output, in addition to stdout.\n");
scroggo@google.com5239c322012-09-11 19:15:32 +000046 SkDebugf(" --logPerIter 1|0 : "
47 "Log each repeat timer instead of mean, default is disabled.\n");
48 SkDebugf(" --min : Print the minimum times (instead of average).\n");
49 SkDebugf(" --timers [wcgWC]* : "
50 "Display wall, cpu, gpu, truncated wall or truncated cpu time for each picture.\n");
reed@google.com006db0f2012-06-27 19:33:29 +000051 SkDebugf(
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000052" --mode pow2tile minWidht height[] | record | simple\n"
53" | tile width[] height[] | playbackCreation:\n"
scroggo@google.com58b4ead2012-08-31 16:15:22 +000054" Run in the corresponding mode.\n"
55" Default is simple.\n");
keyar@chromium.orgcf6c44c2012-07-09 19:37:40 +000056 SkDebugf(
scroggo@google.com58b4ead2012-08-31 16:15:22 +000057" pow2tile minWidth height[], Creates tiles with widths\n"
58" that are all a power of two\n"
59" such that they minimize the\n"
60" amount of wasted tile space.\n"
61" minWidth is the minimum width\n"
62" of these tiles and must be a\n"
63" power of two. Simple\n"
64" rendering using these tiles\n"
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000065" is benchmarked.\n");
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000066 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000067" record, Benchmark picture to picture recording.\n");
68 SkDebugf(
69" simple, Benchmark a simple rendering.\n");
70 SkDebugf(
scroggo@google.com58b4ead2012-08-31 16:15:22 +000071" tile width[] height[], Benchmark simple rendering using\n"
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000072" tiles with the given dimensions.\n");
keyar@chromium.org795cd472012-08-02 18:57:53 +000073 SkDebugf(
scroggo@google.com9a412522012-09-07 15:21:18 +000074" playbackCreation, Benchmark creation of the SkPicturePlayback.\n");
keyar@chromium.org795cd472012-08-02 18:57:53 +000075 SkDebugf("\n");
76 SkDebugf(
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000077" --multi numThreads : Set the number of threads for multi threaded drawing. Must be greater\n"
78" than 1. Only works with tiled rendering.\n"
scroggo@google.coma62da2f2012-11-02 21:28:12 +000079" --pipe: Benchmark SkGPipe rendering. Currently incompatible with \"mode\".\n");
scroggo@google.com58b4ead2012-08-31 16:15:22 +000080 SkDebugf(
junov@chromium.org9313ca42012-11-02 18:11:49 +000081" --bbh bbhType: Set the bounding box hierarchy type to be used. Accepted\n"
82" values are: none, rtree. Default value is none.\n"
83" Not compatible with --pipe.\n");
84 SkDebugf(
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000085" --device bitmap"
86#if SK_SUPPORT_GPU
87" | gpu"
88#endif
89": Use the corresponding device. Default is bitmap.\n");
90 SkDebugf(
91" bitmap, Render to a bitmap.\n");
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000092#if SK_SUPPORT_GPU
keyar@chromium.orga40c20d2012-08-20 15:04:12 +000093 SkDebugf(
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000094" gpu, Render to the GPU.\n");
95#endif
96 SkDebugf("\n");
97 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000098" --repeat: "
reed@google.com006db0f2012-06-27 19:33:29 +000099"Set the number of times to repeat each test."
100" Default is %i.\n", DEFAULT_REPEATS);
reed@google.com006db0f2012-06-27 19:33:29 +0000101}
102
scroggo@google.com9a412522012-09-07 15:21:18 +0000103SkBenchLogger gLogger;
104
borenet@google.com66bcbd12012-09-17 18:26:06 +0000105static bool run_single_benchmark(const SkString& inputPath,
keyar@chromium.org163b5672012-08-01 17:53:29 +0000106 sk_tools::PictureBenchmark& benchmark) {
reed@google.com006db0f2012-06-27 19:33:29 +0000107 SkFILEStream inputStream;
108
reed@google.com006db0f2012-06-27 19:33:29 +0000109 inputStream.setPath(inputPath.c_str());
110 if (!inputStream.isValid()) {
scroggo@google.com9a412522012-09-07 15:21:18 +0000111 SkString err;
112 err.printf("Could not open file %s\n", inputPath.c_str());
113 gLogger.logError(err);
borenet@google.com66bcbd12012-09-17 18:26:06 +0000114 return false;
reed@google.com006db0f2012-06-27 19:33:29 +0000115 }
116
borenet@google.com66bcbd12012-09-17 18:26:06 +0000117 bool success = false;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000118 SkPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream);
borenet@google.com66bcbd12012-09-17 18:26:06 +0000119 if (!success) {
120 SkString err;
121 err.printf("Could not read an SkPicture from %s\n", inputPath.c_str());
122 gLogger.logError(err);
123 return false;
124 }
reed@google.com006db0f2012-06-27 19:33:29 +0000125
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000126 SkString filename;
127 sk_tools::get_basename(&filename, inputPath);
keyar@chromium.orgdb9a5fb2012-08-21 17:57:59 +0000128
129 SkString result;
borenet@google.com2d2b9a02012-09-20 18:54:04 +0000130 result.printf("running bench [%i %i] %s ", picture.width(),
131 picture.height(), filename.c_str());
scroggo@google.com9a412522012-09-07 15:21:18 +0000132 gLogger.logProgress(result);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000133
borenet@google.com2d2b9a02012-09-20 18:54:04 +0000134 benchmark.run(&picture);
borenet@google.com66bcbd12012-09-17 18:26:06 +0000135 return true;
keyar@chromium.org0665f252012-07-10 18:30:18 +0000136}
137
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000138#define PRINT_USAGE_AND_EXIT \
139 do { \
140 usage(argv0); \
141 exit(-1); \
142 } while (0)
143
keyar@chromium.org163b5672012-08-01 17:53:29 +0000144static void parse_commandline(int argc, char* const argv[], SkTArray<SkString>* inputs,
scroggo@google.com5239c322012-09-11 19:15:32 +0000145 sk_tools::PictureBenchmark* benchmark) {
reed@google.com006db0f2012-06-27 19:33:29 +0000146 const char* argv0 = argv[0];
147 char* const* stop = argv + argc;
148
keyar@chromium.org163b5672012-08-01 17:53:29 +0000149 int repeats = DEFAULT_REPEATS;
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000150 sk_tools::PictureRenderer::SkDeviceTypes deviceType =
151 sk_tools::PictureRenderer::kBitmap_DeviceType;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000152
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000153 SkAutoTUnref<sk_tools::PictureRenderer> renderer(NULL);
scroggo@google.com5239c322012-09-11 19:15:32 +0000154
scroggo@google.com9a412522012-09-07 15:21:18 +0000155 // Create a string to show our current settings.
156 // TODO: Make it prettier. Currently it just repeats the command line.
157 SkString commandLine("bench_pictures:");
158 for (int i = 1; i < argc; i++) {
159 commandLine.appendf(" %s", *(argv+i));
160 }
161 commandLine.append("\n");
162
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000163 bool usePipe = false;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000164 int numThreads = 1;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000165 bool useTiles = false;
166 const char* widthString = NULL;
167 const char* heightString = NULL;
168 bool isPowerOf2Mode = false;
169 const char* mode = NULL;
junov@chromium.org9313ca42012-11-02 18:11:49 +0000170 sk_tools::PictureRenderer::BBoxHierarchyType bbhType =
171 sk_tools::PictureRenderer::kNone_BBoxHierarchyType;
reed@google.com006db0f2012-06-27 19:33:29 +0000172 for (++argv; argv < stop; ++argv) {
173 if (0 == strcmp(*argv, "--repeat")) {
174 ++argv;
175 if (argv < stop) {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000176 repeats = atoi(*argv);
177 if (repeats < 1) {
scroggo@google.com9a412522012-09-07 15:21:18 +0000178 gLogger.logError("--repeat must be given a value > 0\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000179 PRINT_USAGE_AND_EXIT;
reed@google.com006db0f2012-06-27 19:33:29 +0000180 }
181 } else {
scroggo@google.com9a412522012-09-07 15:21:18 +0000182 gLogger.logError("Missing arg for --repeat\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000183 PRINT_USAGE_AND_EXIT;
reed@google.com006db0f2012-06-27 19:33:29 +0000184 }
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000185 } else if (0 == strcmp(*argv, "--pipe")) {
186 usePipe = true;
scroggo@google.com9a412522012-09-07 15:21:18 +0000187 } else if (0 == strcmp(*argv, "--logFile")) {
188 argv++;
189 if (argv < stop) {
190 if (!gLogger.SetLogFile(*argv)) {
191 SkString str;
192 str.printf("Could not open %s for writing.", *argv);
193 gLogger.logError(str);
194 usage(argv0);
borenet@google.coma49bffd2012-09-13 18:54:48 +0000195 // TODO(borenet): We're disabling this for now, due to
196 // write-protected Android devices. The very short-term
197 // solution is to ignore the fact that we have no log file.
198 //exit(-1);
scroggo@google.com9a412522012-09-07 15:21:18 +0000199 }
200 } else {
201 gLogger.logError("Missing arg for --logFile\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000202 PRINT_USAGE_AND_EXIT;
scroggo@google.com9a412522012-09-07 15:21:18 +0000203 }
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000204 } else if (0 == strcmp(*argv, "--multi")) {
205 ++argv;
206 if (argv >= stop) {
207 gLogger.logError("Missing arg for --multi\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000208 PRINT_USAGE_AND_EXIT;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000209 }
210 numThreads = atoi(*argv);
211 if (numThreads < 2) {
212 gLogger.logError("Number of threads must be at least 2.\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000213 PRINT_USAGE_AND_EXIT;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000214 }
junov@chromium.org9313ca42012-11-02 18:11:49 +0000215 } else if (0 == strcmp(*argv, "--bbh")) {
216 ++argv;
217 if (argv >= stop) {
218 gLogger.logError("Missing value for --bbh\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000219 PRINT_USAGE_AND_EXIT;
junov@chromium.org9313ca42012-11-02 18:11:49 +0000220 }
221 if (0 == strcmp(*argv, "none")) {
222 bbhType = sk_tools::PictureRenderer::kNone_BBoxHierarchyType;
223 } else if (0 == strcmp(*argv, "rtree")) {
224 bbhType = sk_tools::PictureRenderer::kRTree_BBoxHierarchyType;
225 } else {
226 SkString err;
227 err.printf("%s is not a valid value for --bbhType\n", *argv);
228 gLogger.logError(err);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000229 PRINT_USAGE_AND_EXIT;
junov@chromium.org9313ca42012-11-02 18:11:49 +0000230 }
231
keyar@chromium.org795cd472012-08-02 18:57:53 +0000232 } else if (0 == strcmp(*argv, "--mode")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000233 if (renderer.get() != NULL) {
234 SkDebugf("Cannot combine modes.\n");
235 PRINT_USAGE_AND_EXIT;
236 }
keyar@chromium.org795cd472012-08-02 18:57:53 +0000237
reed@google.com006db0f2012-06-27 19:33:29 +0000238 ++argv;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000239 if (argv >= stop) {
scroggo@google.com9a412522012-09-07 15:21:18 +0000240 gLogger.logError("Missing mode for --mode\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000241 PRINT_USAGE_AND_EXIT;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000242 }
243
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000244 if (0 == strcmp(*argv, "record")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000245 renderer.reset(SkNEW(sk_tools::RecordPictureRenderer));
keyar@chromium.org795cd472012-08-02 18:57:53 +0000246 } else if (0 == strcmp(*argv, "simple")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000247 renderer.reset(SkNEW(sk_tools::SimplePictureRenderer));
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000248 } else if ((0 == strcmp(*argv, "tile")) || (0 == strcmp(*argv, "pow2tile"))) {
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000249 useTiles = true;
250 mode = *argv;
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000251
252 if (0 == strcmp(*argv, "pow2tile")) {
253 isPowerOf2Mode = true;
254 }
255
keyar@chromium.org795cd472012-08-02 18:57:53 +0000256 ++argv;
257 if (argv >= stop) {
scroggo@google.com9a412522012-09-07 15:21:18 +0000258 SkString err;
259 err.printf("Missing width for --mode %s\n", mode);
260 gLogger.logError(err);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000261 PRINT_USAGE_AND_EXIT;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000262 }
263
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000264 widthString = *argv;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000265 ++argv;
266 if (argv >= stop) {
scroggo@google.com9a412522012-09-07 15:21:18 +0000267 gLogger.logError("Missing height for --mode tile\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000268 PRINT_USAGE_AND_EXIT;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000269 }
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000270 heightString = *argv;
scroggo@google.com9a412522012-09-07 15:21:18 +0000271 } else if (0 == strcmp(*argv, "playbackCreation")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000272 renderer.reset(SkNEW(sk_tools::PlaybackCreationRenderer));
reed@google.com006db0f2012-06-27 19:33:29 +0000273 } else {
scroggo@google.com9a412522012-09-07 15:21:18 +0000274 SkString err;
275 err.printf("%s is not a valid mode for --mode\n", *argv);
276 gLogger.logError(err);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000277 PRINT_USAGE_AND_EXIT;
reed@google.com006db0f2012-06-27 19:33:29 +0000278 }
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000279 } else if (0 == strcmp(*argv, "--device")) {
280 ++argv;
281 if (argv >= stop) {
borenet@google.coma49bffd2012-09-13 18:54:48 +0000282 gLogger.logError("Missing mode for --device\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000283 PRINT_USAGE_AND_EXIT;
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000284 }
285
286 if (0 == strcmp(*argv, "bitmap")) {
287 deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType;
288 }
289#if SK_SUPPORT_GPU
290 else if (0 == strcmp(*argv, "gpu")) {
291 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType;
292 }
293#endif
294 else {
scroggo@google.com9a412522012-09-07 15:21:18 +0000295 SkString err;
296 err.printf("%s is not a valid mode for --device\n", *argv);
297 gLogger.logError(err);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000298 PRINT_USAGE_AND_EXIT;
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000299 }
scroggo@google.com5239c322012-09-11 19:15:32 +0000300 } else if (0 == strcmp(*argv, "--timers")) {
301 ++argv;
302 if (argv < stop) {
303 bool timerWall = false;
304 bool truncatedTimerWall = false;
305 bool timerCpu = false;
306 bool truncatedTimerCpu = false;
307 bool timerGpu = false;
308 for (char* t = *argv; *t; ++t) {
309 switch (*t) {
310 case 'w':
311 timerWall = true;
312 break;
313 case 'c':
314 timerCpu = true;
315 break;
316 case 'W':
317 truncatedTimerWall = true;
318 break;
319 case 'C':
320 truncatedTimerCpu = true;
321 break;
322 case 'g':
323 timerGpu = true;
324 break;
325 default: {
326 break;
327 }
328 }
329 }
330 benchmark->setTimersToShow(timerWall, truncatedTimerWall, timerCpu,
331 truncatedTimerCpu, timerGpu);
332 } else {
333 gLogger.logError("Missing arg for --timers\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000334 PRINT_USAGE_AND_EXIT;
scroggo@google.com5239c322012-09-11 19:15:32 +0000335 }
336 } else if (0 == strcmp(*argv, "--min")) {
337 benchmark->setPrintMin(true);
338 } else if (0 == strcmp(*argv, "--logPerIter")) {
339 ++argv;
340 if (argv < stop) {
341 bool log = atoi(*argv) != 0;
342 benchmark->setLogPerIter(log);
343 } else {
344 gLogger.logError("Missing arg for --logPerIter\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000345 PRINT_USAGE_AND_EXIT;
scroggo@google.com5239c322012-09-11 19:15:32 +0000346 }
reed@google.com006db0f2012-06-27 19:33:29 +0000347 } else if (0 == strcmp(*argv, "--help") || 0 == strcmp(*argv, "-h")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000348 PRINT_USAGE_AND_EXIT;
reed@google.com006db0f2012-06-27 19:33:29 +0000349 } else {
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000350 inputs->push_back(SkString(*argv));
reed@google.com006db0f2012-06-27 19:33:29 +0000351 }
352 }
353
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000354 if (numThreads > 1 && !useTiles) {
355 gLogger.logError("Multithreaded drawing requires tiled rendering.\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000356 PRINT_USAGE_AND_EXIT;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000357 }
358
junov@chromium.org9313ca42012-11-02 18:11:49 +0000359 if (usePipe && sk_tools::PictureRenderer::kNone_BBoxHierarchyType != bbhType) {
360 gLogger.logError("--pipe and --bbh cannot be used together\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000361 PRINT_USAGE_AND_EXIT;
junov@chromium.org9313ca42012-11-02 18:11:49 +0000362 }
363
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000364 if (useTiles) {
scroggo@google.com5239c322012-09-11 19:15:32 +0000365 SkASSERT(NULL == renderer);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000366 sk_tools::TiledPictureRenderer* tiledRenderer;
367 if (numThreads > 1) {
368 tiledRenderer = SkNEW_ARGS(sk_tools::MultiCorePictureRenderer, (numThreads));
369 } else {
370 tiledRenderer = SkNEW(sk_tools::TiledPictureRenderer);
371 }
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000372 if (isPowerOf2Mode) {
373 int minWidth = atoi(widthString);
374 if (!SkIsPow2(minWidth) || minWidth < 0) {
scroggo@google.com5239c322012-09-11 19:15:32 +0000375 tiledRenderer->unref();
scroggo@google.com9a412522012-09-07 15:21:18 +0000376 SkString err;
scroggo@google.com5239c322012-09-11 19:15:32 +0000377 err.printf("-mode %s must be given a width"
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000378 " value that is a power of two\n", mode);
scroggo@google.com9a412522012-09-07 15:21:18 +0000379 gLogger.logError(err);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000380 PRINT_USAGE_AND_EXIT;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000381 }
scroggo@google.com5239c322012-09-11 19:15:32 +0000382 tiledRenderer->setTileMinPowerOf2Width(minWidth);
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000383 } else if (sk_tools::is_percentage(widthString)) {
scroggo@google.com5239c322012-09-11 19:15:32 +0000384 tiledRenderer->setTileWidthPercentage(atof(widthString));
385 if (!(tiledRenderer->getTileWidthPercentage() > 0)) {
386 tiledRenderer->unref();
scroggo@google.com9a412522012-09-07 15:21:18 +0000387 gLogger.logError("--mode tile must be given a width percentage > 0\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000388 PRINT_USAGE_AND_EXIT;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000389 }
390 } else {
scroggo@google.com5239c322012-09-11 19:15:32 +0000391 tiledRenderer->setTileWidth(atoi(widthString));
392 if (!(tiledRenderer->getTileWidth() > 0)) {
393 tiledRenderer->unref();
scroggo@google.com9a412522012-09-07 15:21:18 +0000394 gLogger.logError("--mode tile must be given a width > 0\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000395 PRINT_USAGE_AND_EXIT;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000396 }
397 }
398
399 if (sk_tools::is_percentage(heightString)) {
scroggo@google.com5239c322012-09-11 19:15:32 +0000400 tiledRenderer->setTileHeightPercentage(atof(heightString));
401 if (!(tiledRenderer->getTileHeightPercentage() > 0)) {
402 tiledRenderer->unref();
scroggo@google.com9a412522012-09-07 15:21:18 +0000403 gLogger.logError("--mode tile must be given a height percentage > 0\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000404 PRINT_USAGE_AND_EXIT;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000405 }
406 } else {
scroggo@google.com5239c322012-09-11 19:15:32 +0000407 tiledRenderer->setTileHeight(atoi(heightString));
408 if (!(tiledRenderer->getTileHeight() > 0)) {
409 tiledRenderer->unref();
scroggo@google.com9a412522012-09-07 15:21:18 +0000410 gLogger.logError("--mode tile must be given a height > 0\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000411 PRINT_USAGE_AND_EXIT;
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000412 }
413 }
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000414 if (numThreads > 1) {
415#if SK_SUPPORT_GPU
416 if (sk_tools::PictureRenderer::kGPU_DeviceType == deviceType) {
417 tiledRenderer->unref();
418 gLogger.logError("GPU not compatible with multithreaded tiling.\n");
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000419 PRINT_USAGE_AND_EXIT;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000420 }
421#endif
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000422 }
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000423 renderer.reset(tiledRenderer);
424 if (usePipe) {
425 SkDebugf("Pipe rendering is currently not compatible with tiling.\n"
426 "Turning off pipe.\n");
427 }
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000428 } else if (usePipe) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000429 if (renderer.get() != NULL) {
430 SkDebugf("Pipe is incompatible with other modes.\n");
431 PRINT_USAGE_AND_EXIT;
432 }
433 renderer.reset(SkNEW(sk_tools::PipePictureRenderer));
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000434 }
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000435 if (inputs->count() < 1) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000436 PRINT_USAGE_AND_EXIT;
reed@google.com006db0f2012-06-27 19:33:29 +0000437 }
keyar@chromium.org163b5672012-08-01 17:53:29 +0000438
scroggo@google.com5239c322012-09-11 19:15:32 +0000439 if (NULL == renderer) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000440 renderer.reset(SkNEW(sk_tools::SimplePictureRenderer));
keyar@chromium.org163b5672012-08-01 17:53:29 +0000441 }
junov@chromium.org9313ca42012-11-02 18:11:49 +0000442
443 renderer->setBBoxHierarchyType(bbhType);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000444 benchmark->setRenderer(renderer);
keyar@chromium.org163b5672012-08-01 17:53:29 +0000445 benchmark->setRepeats(repeats);
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000446 benchmark->setDeviceType(deviceType);
scroggo@google.com9a412522012-09-07 15:21:18 +0000447 benchmark->setLogger(&gLogger);
448 // Report current settings:
449 gLogger.logProgress(commandLine);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000450}
reed@google.com006db0f2012-06-27 19:33:29 +0000451
borenet@google.com66bcbd12012-09-17 18:26:06 +0000452static int process_input(const SkString& input,
453 sk_tools::PictureBenchmark& benchmark) {
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000454 SkOSFile::Iter iter(input.c_str(), "skp");
455 SkString inputFilename;
borenet@google.com66bcbd12012-09-17 18:26:06 +0000456 int failures = 0;
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000457 if (iter.next(&inputFilename)) {
458 do {
459 SkString inputPath;
keyar@chromium.org163b5672012-08-01 17:53:29 +0000460 sk_tools::make_filepath(&inputPath, input, inputFilename);
borenet@google.com57837bf2012-09-19 17:28:29 +0000461 if (!run_single_benchmark(inputPath, benchmark)) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000462 ++failures;
borenet@google.com57837bf2012-09-19 17:28:29 +0000463 }
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000464 } while(iter.next(&inputFilename));
borenet@google.com57837bf2012-09-19 17:28:29 +0000465 } else if (SkStrEndsWith(input.c_str(), ".skp")) {
466 if (!run_single_benchmark(input, benchmark)) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000467 ++failures;
borenet@google.com57837bf2012-09-19 17:28:29 +0000468 }
469 } else {
470 SkString warning;
471 warning.printf("Warning: skipping %s\n", input.c_str());
472 gLogger.logError(warning);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000473 }
borenet@google.com66bcbd12012-09-17 18:26:06 +0000474 return failures;
reed@google.com006db0f2012-06-27 19:33:29 +0000475}
476
caryclark@google.com5987f582012-10-02 18:33:14 +0000477int tool_main(int argc, char** argv);
478int tool_main(int argc, char** argv) {
scroggo@google.com5239c322012-09-11 19:15:32 +0000479#ifdef SK_ENABLE_INST_COUNT
480 gPrintInstCount = true;
481#endif
scroggo@google.com0a36f432012-09-10 20:29:13 +0000482 SkAutoGraphics ag;
reed@google.com006db0f2012-06-27 19:33:29 +0000483
scroggo@google.com5239c322012-09-11 19:15:32 +0000484 SkTArray<SkString> inputs;
485 sk_tools::PictureBenchmark benchmark;
486
487 parse_commandline(argc, argv, &inputs, &benchmark);
reed@google.com006db0f2012-06-27 19:33:29 +0000488
borenet@google.com66bcbd12012-09-17 18:26:06 +0000489 int failures = 0;
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000490 for (int i = 0; i < inputs.count(); ++i) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000491 failures += process_input(inputs[i], benchmark);
492 }
493
494 if (failures != 0) {
495 SkString err;
496 err.printf("Failed to run %i benchmarks.\n", failures);
497 gLogger.logError(err);
498 return 1;
reed@google.com006db0f2012-06-27 19:33:29 +0000499 }
caryclark@google.com868e1f62012-10-02 20:00:03 +0000500 return 0;
reed@google.com006db0f2012-06-27 19:33:29 +0000501}
caryclark@google.com5987f582012-10-02 18:33:14 +0000502
503#if !defined SK_BUILD_FOR_IOS
504int main(int argc, char * const argv[]) {
505 return tool_main(argc, (char**) argv);
506}
507#endif