OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "BenchTimer.h" | 8 #include "BenchTimer.h" |
9 #include "CopyTilesRenderer.h" | 9 #include "CopyTilesRenderer.h" |
10 #include "LazyDecodeBitmap.h" | 10 #include "LazyDecodeBitmap.h" |
11 #include "PictureBenchmark.h" | 11 #include "PictureBenchmark.h" |
12 #include "PictureRenderingFlags.h" | 12 #include "PictureRenderingFlags.h" |
13 #include "SkBenchLogger.h" | 13 #include "SkBenchLogger.h" |
14 #include "SkCommandLineFlags.h" | 14 #include "SkCommandLineFlags.h" |
15 #include "SkData.h" | |
16 #include "SkDiscardableMemoryPool.h" | 15 #include "SkDiscardableMemoryPool.h" |
17 #include "SkGraphics.h" | 16 #include "SkGraphics.h" |
18 #include "SkImageDecoder.h" | 17 #include "SkImageDecoder.h" |
19 #include "SkMath.h" | 18 #include "SkMath.h" |
20 #include "SkOSFile.h" | 19 #include "SkOSFile.h" |
21 #include "SkPicture.h" | 20 #include "SkPicture.h" |
22 #include "SkStream.h" | 21 #include "SkStream.h" |
23 #include "picture_utils.h" | 22 #include "picture_utils.h" |
24 #include "PictureResultsWriter.h" | |
25 | 23 |
26 SkBenchLogger gLogger; | 24 SkBenchLogger gLogger; |
27 PictureResultsLoggerWriter gLogWriter(&gLogger); | |
28 PictureResultsMultiWriter gWriter; | |
29 | 25 |
30 // Flags used by this file, in alphabetical order. | 26 // Flags used by this file, in alphabetical order. |
31 DEFINE_bool(countRAM, false, "Count the RAM used for bitmap pixels in each skp f
ile"); | 27 DEFINE_bool(countRAM, false, "Count the RAM used for bitmap pixels in each skp f
ile"); |
32 DECLARE_bool(deferImageDecoding); | 28 DECLARE_bool(deferImageDecoding); |
33 DEFINE_string(filter, "", | 29 DEFINE_string(filter, "", |
34 "type:flag : Enable canvas filtering to disable a paint flag, " | 30 "type:flag : Enable canvas filtering to disable a paint flag, " |
35 "use no blur or low quality blur, or use no hinting or " | 31 "use no blur or low quality blur, or use no hinting or " |
36 "slight hinting. For all flags except AAClip, specify the " | 32 "slight hinting. For all flags except AAClip, specify the " |
37 "type of primitive to effect, or choose all. for AAClip " | 33 "type of primitive to effect, or choose all. for AAClip " |
38 "alone, the filter affects all clips independent of type. " | 34 "alone, the filter affects all clips independent of type. " |
39 "Specific flags are listed above."); | 35 "Specific flags are listed above."); |
40 DEFINE_string(logFile, "", "Destination for writing log output, in addition to s
tdout."); | 36 DEFINE_string(logFile, "", "Destination for writing log output, in addition to s
tdout."); |
41 DEFINE_bool(logPerIter, false, "Log each repeat timer instead of mean."); | 37 DEFINE_bool(logPerIter, false, "Log each repeat timer instead of mean."); |
42 #ifdef SK_BUILD_JSON_WRITER | |
43 DEFINE_string(jsonLog, "", "Destination for writing JSON data."); | |
44 #endif | |
45 DEFINE_bool(min, false, "Print the minimum times (instead of average)."); | 38 DEFINE_bool(min, false, "Print the minimum times (instead of average)."); |
46 DECLARE_int32(multi); | 39 DECLARE_int32(multi); |
47 DECLARE_string(readPath); | 40 DECLARE_string(readPath); |
48 DEFINE_int32(repeat, 1, "Set the number of times to repeat each test."); | 41 DEFINE_int32(repeat, 1, "Set the number of times to repeat each test."); |
49 DEFINE_bool(timeIndividualTiles, false, "Report times for drawing individual til
es, rather than " | 42 DEFINE_bool(timeIndividualTiles, false, "Report times for drawing individual til
es, rather than " |
50 "times for drawing the whole page. Requires tiled rendering."); | 43 "times for drawing the whole page. Requires tiled rendering."); |
51 DEFINE_bool(purgeDecodedTex, false, "Purge decoded and GPU-uploaded textures " | 44 DEFINE_bool(purgeDecodedTex, false, "Purge decoded and GPU-uploaded textures " |
52 "after each iteration."); | 45 "after each iteration."); |
53 DEFINE_string(timers, "c", "[wcgWC]*: Display wall, cpu, gpu, truncated wall or
truncated cpu time" | 46 DEFINE_string(timers, "c", "[wcgWC]*: Display wall, cpu, gpu, truncated wall or
truncated cpu time" |
54 " for each picture."); | 47 " for each picture."); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 if (NULL == picture.get()) { | 180 if (NULL == picture.get()) { |
188 SkString err; | 181 SkString err; |
189 err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); | 182 err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); |
190 gLogger.logError(err); | 183 gLogger.logError(err); |
191 return false; | 184 return false; |
192 } | 185 } |
193 | 186 |
194 SkString filename; | 187 SkString filename; |
195 sk_tools::get_basename(&filename, inputPath); | 188 sk_tools::get_basename(&filename, inputPath); |
196 | 189 |
197 gWriter.bench(filename.c_str(), picture->width(), picture->height()); | 190 SkString result; |
| 191 result.printf("running bench [%i %i] %s ", picture->width(), picture->height
(), |
| 192 filename.c_str()); |
| 193 gLogger.logProgress(result); |
198 | 194 |
199 benchmark.run(picture); | 195 benchmark.run(picture); |
200 | 196 |
201 #if SK_LAZY_CACHE_STATS | 197 #if SK_LAZY_CACHE_STATS |
202 if (FLAGS_trackDeferredCaching) { | 198 if (FLAGS_trackDeferredCaching) { |
203 int cacheHits = pool->getCacheHits(); | 199 int cacheHits = pool->getCacheHits(); |
204 int cacheMisses = pool->getCacheMisses(); | 200 int cacheMisses = pool->getCacheMisses(); |
205 pool->resetCacheHitsAndMisses(); | 201 pool->resetCacheHitsAndMisses(); |
206 SkString hitString; | 202 SkString hitString; |
207 hitString.printf("Cache hit rate: %f\n", (double) cacheHits / (cacheHits
+ cacheMisses)); | 203 hitString.printf("Cache hit rate: %f\n", (double) cacheHits / (cacheHits
+ cacheMisses)); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 renderer->setDrawFilters(drawFilters, filtersName(drawFilters)); | 353 renderer->setDrawFilters(drawFilters, filtersName(drawFilters)); |
358 if (FLAGS_logPerIter) { | 354 if (FLAGS_logPerIter) { |
359 benchmark->setTimerResultType(TimerData::kPerIter_Result); | 355 benchmark->setTimerResultType(TimerData::kPerIter_Result); |
360 } else if (FLAGS_min) { | 356 } else if (FLAGS_min) { |
361 benchmark->setTimerResultType(TimerData::kMin_Result); | 357 benchmark->setTimerResultType(TimerData::kMin_Result); |
362 } else { | 358 } else { |
363 benchmark->setTimerResultType(TimerData::kAvg_Result); | 359 benchmark->setTimerResultType(TimerData::kAvg_Result); |
364 } | 360 } |
365 benchmark->setRenderer(renderer); | 361 benchmark->setRenderer(renderer); |
366 benchmark->setRepeats(FLAGS_repeat); | 362 benchmark->setRepeats(FLAGS_repeat); |
367 benchmark->setWriter(&gWriter); | 363 benchmark->setLogger(&gLogger); |
368 } | 364 } |
369 | 365 |
370 static int process_input(const char* input, | 366 static int process_input(const char* input, |
371 sk_tools::PictureBenchmark& benchmark) { | 367 sk_tools::PictureBenchmark& benchmark) { |
372 SkString inputAsSkString(input); | 368 SkString inputAsSkString(input); |
373 SkOSFile::Iter iter(input, "skp"); | 369 SkOSFile::Iter iter(input, "skp"); |
374 SkString inputFilename; | 370 SkString inputFilename; |
375 int failures = 0; | 371 int failures = 0; |
376 if (iter.next(&inputFilename)) { | 372 if (iter.next(&inputFilename)) { |
377 do { | 373 do { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 SkString str; | 410 SkString str; |
415 str.printf("Could not open %s for writing.\n", FLAGS_logFile[0]); | 411 str.printf("Could not open %s for writing.\n", FLAGS_logFile[0]); |
416 gLogger.logError(str); | 412 gLogger.logError(str); |
417 // TODO(borenet): We're disabling this for now, due to | 413 // TODO(borenet): We're disabling this for now, due to |
418 // write-protected Android devices. The very short-term | 414 // write-protected Android devices. The very short-term |
419 // solution is to ignore the fact that we have no log file. | 415 // solution is to ignore the fact that we have no log file. |
420 //exit(-1); | 416 //exit(-1); |
421 } | 417 } |
422 } | 418 } |
423 | 419 |
424 #ifdef SK_BUILD_JSON_WRITER | |
425 SkAutoTDelete<PictureJSONResultsWriter> jsonWriter; | |
426 if (FLAGS_jsonLog.count() == 1) { | |
427 jsonWriter.reset(SkNEW(PictureJSONResultsWriter(FLAGS_jsonLog[0]))); | |
428 gWriter.add(jsonWriter.get()); | |
429 } | |
430 | |
431 #endif | |
432 gWriter.add(&gLogWriter); | |
433 | |
434 | 420 |
435 #if SK_ENABLE_INST_COUNT | 421 #if SK_ENABLE_INST_COUNT |
436 gPrintInstCount = true; | 422 gPrintInstCount = true; |
437 #endif | 423 #endif |
438 SkAutoGraphics ag; | 424 SkAutoGraphics ag; |
439 | 425 |
440 sk_tools::PictureBenchmark benchmark; | 426 sk_tools::PictureBenchmark benchmark; |
441 | 427 |
442 setup_benchmark(&benchmark); | 428 setup_benchmark(&benchmark); |
443 | 429 |
444 int failures = 0; | 430 int failures = 0; |
445 for (int i = 0; i < FLAGS_readPath.count(); ++i) { | 431 for (int i = 0; i < FLAGS_readPath.count(); ++i) { |
446 failures += process_input(FLAGS_readPath[i], benchmark); | 432 failures += process_input(FLAGS_readPath[i], benchmark); |
447 } | 433 } |
448 | 434 |
449 if (failures != 0) { | 435 if (failures != 0) { |
450 SkString err; | 436 SkString err; |
451 err.printf("Failed to run %i benchmarks.\n", failures); | 437 err.printf("Failed to run %i benchmarks.\n", failures); |
452 gLogger.logError(err); | 438 gLogger.logError(err); |
453 return 1; | 439 return 1; |
454 } | 440 } |
455 #if SK_LAZY_CACHE_STATS | 441 #if SK_LAZY_CACHE_STATS |
456 if (FLAGS_trackDeferredCaching) { | 442 if (FLAGS_trackDeferredCaching) { |
457 SkDebugf("Total cache hit rate: %f\n", | 443 SkDebugf("Total cache hit rate: %f\n", |
458 (double) gTotalCacheHits / (gTotalCacheHits + gTotalCacheMisses
)); | 444 (double) gTotalCacheHits / (gTotalCacheHits + gTotalCacheMisses
)); |
459 } | 445 } |
460 #endif | 446 #endif |
461 gWriter.end(); | |
462 return 0; | 447 return 0; |
463 } | 448 } |
464 | 449 |
465 #if !defined SK_BUILD_FOR_IOS | 450 #if !defined SK_BUILD_FOR_IOS |
466 int main(int argc, char * const argv[]) { | 451 int main(int argc, char * const argv[]) { |
467 return tool_main(argc, (char**) argv); | 452 return tool_main(argc, (char**) argv); |
468 } | 453 } |
469 #endif | 454 #endif |
OLD | NEW |