180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "BenchTimer.h" 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "CopyTilesRenderer.h" 1058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "LazyDecodeBitmap.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "PictureBenchmark.h" 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "PictureRenderingFlags.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchLogger.h" 14e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#include "SkCommandLineFlags.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkGraphics.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkImageDecoder.h" 17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#if LAZY_CACHE_STATS 18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger #include "SkLazyPixelRef.h" 19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkLruImageCache.h" 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMath.h" 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkOSFile.h" 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPicture.h" 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h" 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "picture_utils.h" 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 27096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerSkBenchLogger gLogger; 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Flags used by this file, in alphabetical order. 30096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_bool(countRAM, false, "Count the RAM used for bitmap pixels in each skp file"); 31096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDECLARE_bool(deferImageDecoding); 32096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_string(filter, "", 33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "type:flag : Enable canvas filtering to disable a paint flag, " 34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "use no blur or low quality blur, or use no hinting or " 35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "slight hinting. For all flags except AAClip, specify the " 36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "type of primitive to effect, or choose all. for AAClip " 37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "alone, the filter affects all clips independent of type. " 38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "Specific flags are listed above."); 39096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_string(logFile, "", "Destination for writing log output, in addition to stdout."); 40096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_bool(logPerIter, false, "Log each repeat timer instead of mean."); 41096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_bool(min, false, "Print the minimum times (instead of average)."); 42096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDECLARE_int32(multi); 437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerDECLARE_string(readPath); 44096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_int32(repeat, 1, "Set the number of times to repeat each test."); 45096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_bool(timeIndividualTiles, false, "Report times for drawing individual tiles, rather than " 46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "times for drawing the whole page. Requires tiled rendering."); 47e27eefc4844477cee5d32f51ab45ff62020cdb36Derek SollenbergerDEFINE_string(timers, "c", "[wcgWC]*: Display wall, cpu, gpu, truncated wall or truncated cpu time" 48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger " for each picture."); 49096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_bool(trackDeferredCaching, false, "Only meaningful with --deferImageDecoding and " 50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "LAZY_CACHE_STATS set to true. Report percentage of cache hits when using deferred " 51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "image decoding."); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic char const * const gFilterTypes[] = { 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "paint", 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "point", 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "line", 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "bitmap", 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "rect", 59d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger "oval", 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "path", 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "text", 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "all", 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic const size_t kFilterTypesCount = sizeof(gFilterTypes) / sizeof(gFilterTypes[0]); 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic char const * const gFilterFlags[] = { 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "antiAlias", 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "filterBitmap", 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "dither", 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "underlineText", 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "strikeThruText", 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "fakeBoldText", 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "linearText", 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "subpixelText", 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "devKernText", 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "LCDRenderText", 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "embeddedBitmapText", 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "autoHinting", 80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "verticalText", 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "genA8FromLCD", 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "blur", 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "hinting", 84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "slightHinting", 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "AAClip", 86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic const size_t kFilterFlagsCount = sizeof(gFilterFlags) / sizeof(gFilterFlags[0]); 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic SkString filtersName(sk_tools::PictureRenderer::DrawFilterFlags* drawFilters) { 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger int all = drawFilters[0]; 92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger size_t tIndex; 93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (tIndex = 1; tIndex < SkDrawFilter::kTypeCount; ++tIndex) { 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger all &= drawFilters[tIndex]; 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString result; 97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) { 98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString types; 99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (all & (1 << fIndex)) { 100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger types = gFilterTypes[SkDrawFilter::kTypeCount]; 101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else { 102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (tIndex = 0; tIndex < SkDrawFilter::kTypeCount; ++tIndex) { 103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (drawFilters[tIndex] & (1 << fIndex)) { 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger types += gFilterTypes[tIndex]; 105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (!types.size()) { 109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger continue; 110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += "_"; 112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += types; 113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += "."; 114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += gFilterFlags[fIndex]; 115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return result; 117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic SkString filterTypesUsage() { 120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString result; 121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t index = 0; index < kFilterTypesCount; ++index) { 122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += gFilterTypes[index]; 123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (index < kFilterTypesCount - 1) { 124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += " | "; 125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return result; 128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic SkString filterFlagsUsage() { 131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString result; 132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger size_t len = 0; 133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t index = 0; index < kFilterFlagsCount; ++index) { 134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += gFilterFlags[index]; 135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (result.size() - len >= 72) { 136096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger result += "\n\t\t"; 137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger len = result.size(); 138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (index < kFilterFlagsCount - 1) { 140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger result += " | "; 141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return result; 144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 14658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// Defined in LazyDecodeBitmap.cpp 147096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerextern SkLruImageCache gLruImageCache; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 149096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#if LAZY_CACHE_STATS 150096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic int32_t gTotalCacheHits; 151096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic int32_t gTotalCacheMisses; 152096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic bool run_single_benchmark(const SkString& inputPath, 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sk_tools::PictureBenchmark& benchmark) { 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkFILEStream inputStream; 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inputStream.setPath(inputPath.c_str()); 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!inputStream.isValid()) { 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString err; 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru err.printf("Could not open file %s\n", inputPath.c_str()); 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gLogger.logError(err); 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 166096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // Since the old picture has been deleted, all pixels should be cleared. 167096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkASSERT(gLruImageCache.getImageCacheUsed() == 0); 168096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_countRAM) { 169096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // Set the limit to zero, so all pixels will be kept 17058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger gLruImageCache.setImageCacheLimit(0); 171096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 172096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 17358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkPicture::InstallPixelRefProc proc; 174096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_deferImageDecoding) { 17558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger proc = &sk_tools::LazyDecodeBitmap; 176096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } else { 17758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger proc = &SkImageDecoder::DecodeMemory; 178096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 17958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, proc)); 180096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 18158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (NULL == picture.get()) { 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString err; 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gLogger.logError(err); 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString filename; 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sk_tools::get_basename(&filename, inputPath); 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString result; 192096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger result.printf("running bench [%i %i] %s ", picture->width(), picture->height(), 193096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger filename.c_str()); 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gLogger.logProgress(result); 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 196096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger benchmark.run(picture); 197096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 198096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#if LAZY_CACHE_STATS 199096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_trackDeferredCaching) { 200096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger int32_t cacheHits = SkLazyPixelRef::GetCacheHits(); 201096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger int32_t cacheMisses = SkLazyPixelRef::GetCacheMisses(); 202096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkLazyPixelRef::ResetCacheStats(); 203096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString hitString; 204096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger hitString.printf("Cache hit rate: %f\n", (double) cacheHits / (cacheHits + cacheMisses)); 205096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logProgress(hitString); 206096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gTotalCacheHits += cacheHits; 207096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gTotalCacheMisses += cacheMisses; 208096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 209096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 210096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_countRAM) { 211096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString ramCount("RAM used for bitmaps: "); 212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t bytes = gLruImageCache.getImageCacheUsed(); 213096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (bytes > 1024) { 214096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t kb = bytes / 1024; 215096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (kb > 1024) { 216096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t mb = kb / 1024; 217096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger ramCount.appendf("%zi MB\n", mb); 218096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } else { 219096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger ramCount.appendf("%zi KB\n", kb); 220096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 221096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } else { 222096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger ramCount.appendf("%zi bytes\n", bytes); 223096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 224096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logProgress(ramCount); 225096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 226096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 230096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void setup_benchmark(sk_tools::PictureBenchmark* benchmark) { 231363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger sk_tools::PictureRenderer::DrawFilterFlags drawFilters[SkDrawFilter::kTypeCount]; 232363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger sk_bzero(drawFilters, sizeof(drawFilters)); 233096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 234096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_filter.count() > 0) { 235096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger const char* filters = FLAGS_filter[0]; 236096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger const char* colon = strchr(filters, ':'); 237096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (colon) { 238096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger int32_t type = -1; 239096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t typeLen = colon - filters; 240096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (size_t tIndex = 0; tIndex < kFilterTypesCount; ++tIndex) { 241096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (typeLen == strlen(gFilterTypes[tIndex]) 242096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger && !strncmp(filters, gFilterTypes[tIndex], typeLen)) { 243096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger type = SkToS32(tIndex); 244096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 246363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 247096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (type < 0) { 248363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString err; 249096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger err.printf("Unknown type for --filter %s\n", filters); 250363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger gLogger.logError(err); 251096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 252096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 253096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger int flag = -1; 254096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t flagLen = strlen(filters) - typeLen - 1; 255096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) { 256096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (flagLen == strlen(gFilterFlags[fIndex]) 257096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger && !strncmp(colon + 1, gFilterFlags[fIndex], flagLen)) { 258096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger flag = 1 << fIndex; 259096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 261363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 262096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (flag < 0) { 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString err; 264096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger err.printf("Unknown flag for --filter %s\n", filters); 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gLogger.logError(err); 266096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 268096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (int index = 0; index < SkDrawFilter::kTypeCount; ++index) { 269096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (type != SkDrawFilter::kTypeCount && index != type) { 270096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger continue; 27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 272096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger drawFilters[index] = (sk_tools::PictureRenderer::DrawFilterFlags) 273096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger (drawFilters[index] | flag); 274363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 276096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString err; 277096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger err.printf("Unknown arg for --filter %s : missing colon\n", filters); 278096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError(err); 279096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 283096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_timers.count() > 0) { 284096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger size_t index = 0; 285096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool timerWall = false; 286096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool truncatedTimerWall = false; 287096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool timerCpu = false; 288096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool truncatedTimerCpu = false; 289096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool timerGpu = false; 290096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger while (index < strlen(FLAGS_timers[0])) { 291096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger switch (FLAGS_timers[0][index]) { 292096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger case 'w': 293096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger timerWall = true; 294096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 295096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger case 'c': 296096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger timerCpu = true; 297096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 298096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger case 'W': 299096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger truncatedTimerWall = true; 300096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 301096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger case 'C': 302096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger truncatedTimerCpu = true; 303096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 304096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger case 'g': 305096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger timerGpu = true; 306096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 307096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger default: 308096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkDebugf("mystery character\n"); 309096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger break; 310096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 311096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger index++; 312096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 313096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger benchmark->setTimersToShow(timerWall, truncatedTimerWall, timerCpu, truncatedTimerCpu, 314096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger timerGpu); 315363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 316363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 317096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString errorString; 318096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkAutoTUnref<sk_tools::PictureRenderer> renderer(parseRenderer(errorString, 319096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kBench_PictureTool)); 320363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 321096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (errorString.size() > 0) { 322096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError(errorString); 32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 325096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (NULL == renderer.get()) { 326096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 327096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 329096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_timeIndividualTiles) { 330096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_multi > 1) { 331096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError("Cannot time individual tiles with more than one thread.\n"); 332096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 33380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 334096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger sk_tools::TiledPictureRenderer* tiledRenderer = renderer->getTiledRenderer(); 335096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (NULL == tiledRenderer) { 336096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError("--timeIndividualTiles requires tiled rendering.\n"); 337096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 338363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 339096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (!tiledRenderer->supportsTimingIndividualTiles()) { 340096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError("This renderer does not support --timeIndividualTiles.\n"); 341096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 342363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 343096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger benchmark->setTimeIndividualTiles(true); 34480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (FLAGS_readPath.count() < 1) { 347096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError(".skp files or directories are required.\n"); 348096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 350363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 351363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger renderer->setDrawFilters(drawFilters, filtersName(drawFilters)); 352e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger if (FLAGS_logPerIter) { 353e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger benchmark->setTimerResultType(TimerData::kPerIter_Result); 354e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger } else if (FLAGS_min) { 355e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger benchmark->setTimerResultType(TimerData::kMin_Result); 356e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger } else { 357e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger benchmark->setTimerResultType(TimerData::kAvg_Result); 358e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger } 359363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger benchmark->setRenderer(renderer); 360096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger benchmark->setRepeats(FLAGS_repeat); 36180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru benchmark->setLogger(&gLogger); 36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 36380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 364096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic int process_input(const char* input, 36580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sk_tools::PictureBenchmark& benchmark) { 366096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString inputAsSkString(input); 367096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkOSFile::Iter iter(input, "skp"); 36880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString inputFilename; 36980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int failures = 0; 37080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (iter.next(&inputFilename)) { 37180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru do { 37280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString inputPath; 373096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger sk_tools::make_filepath(&inputPath, inputAsSkString, inputFilename); 37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!run_single_benchmark(inputPath, benchmark)) { 37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ++failures; 37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } while(iter.next(&inputFilename)); 378096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } else if (SkStrEndsWith(input, ".skp")) { 379096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (!run_single_benchmark(inputAsSkString, benchmark)) { 38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ++failures; 38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString warning; 384096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger warning.printf("Warning: skipping %s\n", input); 38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gLogger.logError(warning); 38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 38780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return failures; 38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint tool_main(int argc, char** argv); 39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint tool_main(int argc, char** argv) { 392096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString usage; 393096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger usage.printf("Time drawing .skp files.\n" 394096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger "\tPossible arguments for --filter: [%s]\n\t\t[%s]", 395096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger filterTypesUsage().c_str(), filterFlagsUsage().c_str()); 396e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger SkCommandLineFlags::SetUsage(usage.c_str()); 397e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger SkCommandLineFlags::Parse(argc, argv); 398096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 399096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_repeat < 1) { 400096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString error; 401096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger error.printf("--repeats must be >= 1. Was %i\n", FLAGS_repeat); 402096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError(error); 403096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger exit(-1); 404096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 405096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 406096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_logFile.count() == 1) { 407096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (!gLogger.SetLogFile(FLAGS_logFile[0])) { 408096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString str; 409096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger str.printf("Could not open %s for writing.\n", FLAGS_logFile[0]); 410096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gLogger.logError(str); 411096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // TODO(borenet): We're disabling this for now, due to 412096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // write-protected Android devices. The very short-term 413096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // solution is to ignore the fact that we have no log file. 414096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger //exit(-1); 415096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 416096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 417096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 418096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 419d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#if SK_ENABLE_INST_COUNT 42080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gPrintInstCount = true; 42180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 42280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAutoGraphics ag; 42380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 42480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sk_tools::PictureBenchmark benchmark; 42580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 426096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger setup_benchmark(&benchmark); 42780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 42880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int failures = 0; 4297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < FLAGS_readPath.count(); ++i) { 4307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger failures += process_input(FLAGS_readPath[i], benchmark); 43180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 43280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 43380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (failures != 0) { 43480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString err; 43580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru err.printf("Failed to run %i benchmarks.\n", failures); 43680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gLogger.logError(err); 43780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 1; 43880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 439096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#if LAZY_CACHE_STATS 440096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (FLAGS_trackDeferredCaching) { 441096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkDebugf("Total cache hit rate: %f\n", 442096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger (double) gTotalCacheHits / (gTotalCacheHits + gTotalCacheMisses)); 443096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 444096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 44580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 44680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 44780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 44880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if !defined SK_BUILD_FOR_IOS 44980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint main(int argc, char * const argv[]) { 45080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return tool_main(argc, (char**) argv); 45180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 45280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 453