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 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "BenchLogger.h" 99ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein#include "Timer.h" 104a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com#include "CopyTilesRenderer.h" 11f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "CrashHandler.h" 1256799e2ee6b74dacb74babeb5217b65367915ed8commit-bot@chromium.org#include "LazyDecodeBitmap.h" 13163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org#include "PictureBenchmark.h" 14161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com#include "PictureRenderingFlags.h" 15f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "PictureResultsWriter.h" 16d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com#include "SkCommandLineFlags.h" 1737c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org#include "SkData.h" 182c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com#include "SkDiscardableMemoryPool.h" 190a36f43d5f710c47b63bc4bbfde9bbb7d59a88d1scroggo@google.com#include "SkGraphics.h" 205a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com#include "SkImageDecoder.h" 21f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org#include "SkMath.h" 22006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkOSFile.h" 23006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkPicture.h" 24006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkStream.h" 25006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "picture_utils.h" 26006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 27f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaBenchLogger gLogger; 2837c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.orgPictureResultsLoggerWriter gLogWriter(&gLogger); 2937c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.orgPictureResultsMultiWriter gWriter; 30161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 31161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com// Flags used by this file, in alphabetical order. 32a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.comDEFINE_bool(countRAM, false, "Count the RAM used for bitmap pixels in each skp file"); 33161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDECLARE_bool(deferImageDecoding); 34161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDEFINE_string(filter, "", 35161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "type:flag : Enable canvas filtering to disable a paint flag, " 36161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "use no blur or low quality blur, or use no hinting or " 37161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "slight hinting. For all flags except AAClip, specify the " 38161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "type of primitive to effect, or choose all. for AAClip " 39161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "alone, the filter affects all clips independent of type. " 40161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "Specific flags are listed above."); 41161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDEFINE_string(logFile, "", "Destination for writing log output, in addition to stdout."); 42161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDEFINE_bool(logPerIter, false, "Log each repeat timer instead of mean."); 4337c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.orgDEFINE_string(jsonLog, "", "Destination for writing JSON data."); 44161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDEFINE_bool(min, false, "Print the minimum times (instead of average)."); 45161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDECLARE_int32(multi); 46604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.comDECLARE_string(readPath); 47161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDEFINE_int32(repeat, 1, "Set the number of times to repeat each test."); 48161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comDEFINE_bool(timeIndividualTiles, false, "Report times for drawing individual tiles, rather than " 49161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "times for drawing the whole page. Requires tiled rendering."); 5094d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.comDEFINE_bool(purgeDecodedTex, false, "Purge decoded and GPU-uploaded textures " 5194d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com "after each iteration."); 5265e508d0b1b0e532e2758a937bd565738dc89941scroggo@google.comDEFINE_string(timers, "c", "[wcgWC]*: Display wall, cpu, gpu, truncated wall or truncated cpu time" 53161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com " for each picture."); 54cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.comDEFINE_bool(trackDeferredCaching, false, "Only meaningful with --deferImageDecoding and " 55cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org "SK_LAZY_CACHE_STATS set to true. Report percentage of cache hits when using " 56cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org "deferred image decoding."); 57006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 58ba7aedd6eac1e48e1902f81fa8ea93bb28a81c5fcommit-bot@chromium.orgDEFINE_bool(preprocess, false, "If true, perform device specific preprocessing before timing."); 59c873329ae9ff00b0c45f7294172ad2e9b1ec44c8commit-bot@chromium.org 60a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic char const * const gFilterTypes[] = { 61a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "paint", 62a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "point", 63a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "line", 64a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "bitmap", 65a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "rect", 66d3c208c53eda490ed6445e39f467de288cf22d85jvanverth@google.com "oval", 67a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "path", 68a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "text", 69a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "all", 70a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}; 71a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 72a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic const size_t kFilterTypesCount = sizeof(gFilterTypes) / sizeof(gFilterTypes[0]); 73a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 74a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic char const * const gFilterFlags[] = { 75a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "antiAlias", 76a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "filterBitmap", 77a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "dither", 78a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "underlineText", 79a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "strikeThruText", 80a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "fakeBoldText", 81a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "linearText", 82a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "subpixelText", 83a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "devKernText", 84a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "LCDRenderText", 85a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "embeddedBitmapText", 86a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "autoHinting", 87a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "verticalText", 88a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "genA8FromLCD", 89a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "blur", 90a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "hinting", 91a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "slightHinting", 92e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com "AAClip", 93a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}; 94a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 95a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic const size_t kFilterFlagsCount = sizeof(gFilterFlags) / sizeof(gFilterFlags[0]); 96a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 97a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filtersName(sk_tools::PictureRenderer::DrawFilterFlags* drawFilters) { 98a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com int all = drawFilters[0]; 99a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com size_t tIndex; 100a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (tIndex = 1; tIndex < SkDrawFilter::kTypeCount; ++tIndex) { 101a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com all &= drawFilters[tIndex]; 102a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 103a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString result; 104a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) { 105a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString types; 106a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (all & (1 << fIndex)) { 107a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com types = gFilterTypes[SkDrawFilter::kTypeCount]; 108a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } else { 109a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (tIndex = 0; tIndex < SkDrawFilter::kTypeCount; ++tIndex) { 110a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (drawFilters[tIndex] & (1 << fIndex)) { 111a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com types += gFilterTypes[tIndex]; 112a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 113a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 114a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 115a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (!types.size()) { 116a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com continue; 117a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 118a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += "_"; 119a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += types; 120a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += "."; 121a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += gFilterFlags[fIndex]; 122a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 123a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com return result; 124a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com} 125a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 126a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filterTypesUsage() { 127a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString result; 128a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t index = 0; index < kFilterTypesCount; ++index) { 129a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += gFilterTypes[index]; 130a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (index < kFilterTypesCount - 1) { 131a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += " | "; 132a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 133a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 134a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com return result; 135a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com} 136a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 137a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filterFlagsUsage() { 138a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString result; 139a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com size_t len = 0; 140a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t index = 0; index < kFilterFlagsCount; ++index) { 141a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += gFilterFlags[index]; 142a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (result.size() - len >= 72) { 143161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com result += "\n\t\t"; 144a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com len = result.size(); 145a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 146a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (index < kFilterFlagsCount - 1) { 147a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += " | "; 148a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 149a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 150a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com return result; 151a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com} 152a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 153cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org#if SK_LAZY_CACHE_STATS 154cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.comstatic int32_t gTotalCacheHits; 155cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.comstatic int32_t gTotalCacheMisses; 156cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com#endif 157cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com 15866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.comstatic bool run_single_benchmark(const SkString& inputPath, 159163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org sk_tools::PictureBenchmark& benchmark) { 160006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkFILEStream inputStream; 161006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 162006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com inputStream.setPath(inputPath.c_str()); 163006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com if (!inputStream.isValid()) { 1649a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 1659a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com err.printf("Could not open file %s\n", inputPath.c_str()); 1669a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 16766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return false; 168006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 169006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 1702c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com SkDiscardableMemoryPool* pool = SkGetGlobalDiscardableMemoryPool(); 171a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com // Since the old picture has been deleted, all pixels should be cleared. 1722c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com SkASSERT(pool->getRAMUsed() == 0); 173a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com if (FLAGS_countRAM) { 1742c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com pool->setRAMBudget(SK_MaxU32); 1752c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com // Set the limit to max, so all pixels will be kept 176a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com } 177a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com 178f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com SkPicture::InstallPixelRefProc proc; 179161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_deferImageDecoding) { 18056799e2ee6b74dacb74babeb5217b65367915ed8commit-bot@chromium.org proc = &sk_tools::LazyDecodeBitmap; 181f8d7d2731318cdf510ab68e6b3f5ec68ab22c8e2scroggo@google.com } else { 182f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com proc = &SkImageDecoder::DecodeMemory; 183f8d7d2731318cdf510ab68e6b3f5ec68ab22c8e2scroggo@google.com } 184f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, proc)); 185f8d7d2731318cdf510ab68e6b3f5ec68ab22c8e2scroggo@google.com 186f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com if (NULL == picture.get()) { 18766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com SkString err; 18866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); 18966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com gLogger.logError(err); 19066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return false; 19166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com } 192006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 1931c99ea8ed80ca492397717b57e2735869be38c69tfarina SkString filename = SkOSPath::SkBasename(inputPath.c_str()); 194db9a5fb55f77935774f21e07a04b6d1350ca54cckeyar@chromium.org 19537c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org gWriter.bench(filename.c_str(), picture->width(), picture->height()); 196d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org 197f8d7d2731318cdf510ab68e6b3f5ec68ab22c8e2scroggo@google.com benchmark.run(picture); 198cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com 199cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org#if SK_LAZY_CACHE_STATS 200cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com if (FLAGS_trackDeferredCaching) { 201cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org int cacheHits = pool->getCacheHits(); 202cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org int cacheMisses = pool->getCacheMisses(); 203cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org pool->resetCacheHitsAndMisses(); 204a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com SkString hitString; 205a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com hitString.printf("Cache hit rate: %f\n", (double) cacheHits / (cacheHits + cacheMisses)); 206a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com gLogger.logProgress(hitString); 207cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com gTotalCacheHits += cacheHits; 208cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com gTotalCacheMisses += cacheMisses; 209cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com } 210cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com#endif 211a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com if (FLAGS_countRAM) { 212a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com SkString ramCount("RAM used for bitmaps: "); 2132c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com size_t bytes = pool->getRAMUsed(); 214a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com if (bytes > 1024) { 215a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com size_t kb = bytes / 1024; 216a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com if (kb > 1024) { 217a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com size_t mb = kb / 1024; 218a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com ramCount.appendf("%zi MB\n", mb); 219a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com } else { 220a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com ramCount.appendf("%zi KB\n", kb); 221a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com } 222a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com } else { 223a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com ramCount.appendf("%zi bytes\n", bytes); 224a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com } 225a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com gLogger.logProgress(ramCount); 226a560d00ba5005ded8094a307ca41365bdf47cd50scroggo@google.com } 227cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com 22866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return true; 229006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 230006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 231161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comstatic void setup_benchmark(sk_tools::PictureBenchmark* benchmark) { 232a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com sk_tools::PictureRenderer::DrawFilterFlags drawFilters[SkDrawFilter::kTypeCount]; 233a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com sk_bzero(drawFilters, sizeof(drawFilters)); 234161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 235161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_filter.count() > 0) { 236161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com const char* filters = FLAGS_filter[0]; 237161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com const char* colon = strchr(filters, ':'); 238161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (colon) { 239cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com int32_t type = -1; 240161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com size_t typeLen = colon - filters; 241161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com for (size_t tIndex = 0; tIndex < kFilterTypesCount; ++tIndex) { 242161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (typeLen == strlen(gFilterTypes[tIndex]) 243161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com && !strncmp(filters, gFilterTypes[tIndex], typeLen)) { 244cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com type = SkToS32(tIndex); 245161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 2469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } 2479313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } 248161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (type < 0) { 2499313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org SkString err; 250161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com err.printf("Unknown type for --filter %s\n", filters); 2519313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org gLogger.logError(err); 252161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 253161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } 254161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com int flag = -1; 255161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com size_t flagLen = strlen(filters) - typeLen - 1; 256161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) { 257161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (flagLen == strlen(gFilterFlags[fIndex]) 258161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com && !strncmp(colon + 1, gFilterFlags[fIndex], flagLen)) { 259161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com flag = 1 << fIndex; 260161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 261795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org } 262c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com } 263161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (flag < 0) { 2649a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 265161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com err.printf("Unknown flag for --filter %s\n", filters); 2669a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 267161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 268c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org } 269161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com for (int index = 0; index < SkDrawFilter::kTypeCount; ++index) { 270161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (type != SkDrawFilter::kTypeCount && index != type) { 271161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com continue; 2725239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 273161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com drawFilters[index] = (sk_tools::PictureRenderer::DrawFilterFlags) 274161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com (drawFilters[index] | flag); 2755239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 276006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } else { 277161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkString err; 278161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com err.printf("Unknown arg for --filter %s : missing colon\n", filters); 279161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError(err); 280161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 281006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 282006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 283006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 284161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_timers.count() > 0) { 285161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com size_t index = 0; 286161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com bool timerWall = false; 287161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com bool truncatedTimerWall = false; 288161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com bool timerCpu = false; 289161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com bool truncatedTimerCpu = false; 290161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com bool timerGpu = false; 291161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com while (index < strlen(FLAGS_timers[0])) { 292161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com switch (FLAGS_timers[0][index]) { 293161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com case 'w': 294161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com timerWall = true; 295161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 296161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com case 'c': 297161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com timerCpu = true; 298161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 299161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com case 'W': 300161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com truncatedTimerWall = true; 301161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 302161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com case 'C': 303161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com truncatedTimerCpu = true; 304161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 305161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com case 'g': 306161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com timerGpu = true; 307161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 308161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com default: 309161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkDebugf("mystery character\n"); 310161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com break; 311161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } 312161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com index++; 313161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } 314161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com benchmark->setTimersToShow(timerWall, truncatedTimerWall, timerCpu, truncatedTimerCpu, 315161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com timerGpu); 316bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 317bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com 318161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkString errorString; 319161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkAutoTUnref<sk_tools::PictureRenderer> renderer(parseRenderer(errorString, 320161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com kBench_PictureTool)); 321161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 322161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (errorString.size() > 0) { 323161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError(errorString); 3249313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } 3259313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 326161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (NULL == renderer.get()) { 327161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 3287b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } 3297b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org 330161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_timeIndividualTiles) { 331161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_multi > 1) { 332161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError("Cannot time individual tiles with more than one thread.\n"); 333161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 334a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } 335161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com sk_tools::TiledPictureRenderer* tiledRenderer = renderer->getTiledRenderer(); 336161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (NULL == tiledRenderer) { 337161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError("--timeIndividualTiles requires tiled rendering.\n"); 338161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 33958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 340161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (!tiledRenderer->supportsTimingIndividualTiles()) { 341161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError("This renderer does not support --timeIndividualTiles.\n"); 342161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 343bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 344161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com benchmark->setTimeIndividualTiles(true); 345006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 346163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org 34794d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com benchmark->setPurgeDecodedTex(FLAGS_purgeDecodedTex); 348c873329ae9ff00b0c45f7294172ad2e9b1ec44c8commit-bot@chromium.org benchmark->setPreprocess(FLAGS_preprocess); 34994d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com 350604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com if (FLAGS_readPath.count() < 1) { 351161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError(".skp files or directories are required.\n"); 352161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 353163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org } 3549313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 355a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com renderer->setDrawFilters(drawFilters, filtersName(drawFilters)); 35655fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org if (FLAGS_logPerIter) { 35755fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org benchmark->setTimerResultType(TimerData::kPerIter_Result); 35855fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org } else if (FLAGS_min) { 35955fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org benchmark->setTimerResultType(TimerData::kMin_Result); 36055fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org } else { 36155fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org benchmark->setTimerResultType(TimerData::kAvg_Result); 36255fd612adfd08f5c64fb728bc37a2cb4ae224656commit-bot@chromium.org } 363a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com benchmark->setRenderer(renderer); 364161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com benchmark->setRepeats(FLAGS_repeat); 36537c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org benchmark->setWriter(&gWriter); 366d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org} 367d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org 368161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.comstatic int process_input(const char* input, 36966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com sk_tools::PictureBenchmark& benchmark) { 370161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkString inputAsSkString(input); 371161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkOSFile::Iter iter(input, "skp"); 372d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org SkString inputFilename; 37366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com int failures = 0; 374d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org if (iter.next(&inputFilename)) { 375d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org do { 376da4ed3289ec05a7155d5669c90a743a829574ea6tfarina SkString inputPath = SkOSPath::SkPathJoin(input, inputFilename.c_str()); 37757837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com if (!run_single_benchmark(inputPath, benchmark)) { 37866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com ++failures; 37957837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } 380d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org } while(iter.next(&inputFilename)); 381161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } else if (SkStrEndsWith(input, ".skp")) { 382161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (!run_single_benchmark(inputAsSkString, benchmark)) { 38366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com ++failures; 38457837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } 38557837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } else { 38657837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com SkString warning; 387161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com warning.printf("Warning: skipping %s\n", input); 38857837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com gLogger.logError(warning); 389d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org } 39066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return failures; 391006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 392006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 3935987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv); 3945987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) { 39530e6e2af14e84216b1c113fd7500d0822bc81daamtklein SetupCrashHandler(); 396161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkString usage; 397161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com usage.printf("Time drawing .skp files.\n" 398161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com "\tPossible arguments for --filter: [%s]\n\t\t[%s]", 399161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com filterTypesUsage().c_str(), filterFlagsUsage().c_str()); 400d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com SkCommandLineFlags::SetUsage(usage.c_str()); 401d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com SkCommandLineFlags::Parse(argc, argv); 402161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 403161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_repeat < 1) { 404161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkString error; 405161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com error.printf("--repeats must be >= 1. Was %i\n", FLAGS_repeat); 406161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError(error); 407161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com exit(-1); 408161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } 409161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 410161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (FLAGS_logFile.count() == 1) { 411161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com if (!gLogger.SetLogFile(FLAGS_logFile[0])) { 412161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com SkString str; 413161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com str.printf("Could not open %s for writing.\n", FLAGS_logFile[0]); 414161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com gLogger.logError(str); 415161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com // TODO(borenet): We're disabling this for now, due to 416161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com // write-protected Android devices. The very short-term 417161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com // solution is to ignore the fact that we have no log file. 418161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com //exit(-1); 419161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } 420161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com } 421161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 42237c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org SkAutoTDelete<PictureJSONResultsWriter> jsonWriter; 42337c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org if (FLAGS_jsonLog.count() == 1) { 42437c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org jsonWriter.reset(SkNEW(PictureJSONResultsWriter(FLAGS_jsonLog[0]))); 42537c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org gWriter.add(jsonWriter.get()); 42637c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org } 42737c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org 42837c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org gWriter.add(&gLogWriter); 42937c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org 430161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 4314e23068b374023d43c4c725138d523721d975892bsalomon@google.com#if SK_ENABLE_INST_COUNT 4325239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com gPrintInstCount = true; 4335239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com#endif 4340a36f43d5f710c47b63bc4bbfde9bbb7d59a88d1scroggo@google.com SkAutoGraphics ag; 4355239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com 4365239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com sk_tools::PictureBenchmark benchmark; 437006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 438161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com setup_benchmark(&benchmark); 439006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 44066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com int failures = 0; 441604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com for (int i = 0; i < FLAGS_readPath.count(); ++i) { 442604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com failures += process_input(FLAGS_readPath[i], benchmark); 44366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com } 44466bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com 44566bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com if (failures != 0) { 44666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com SkString err; 44766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com err.printf("Failed to run %i benchmarks.\n", failures); 44866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com gLogger.logError(err); 44966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return 1; 450006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 451cf2f00872c559c892bb4b466bf678c7667490ccecommit-bot@chromium.org#if SK_LAZY_CACHE_STATS 452cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com if (FLAGS_trackDeferredCaching) { 453cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com SkDebugf("Total cache hit rate: %f\n", 454cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com (double) gTotalCacheHits / (gTotalCacheHits + gTotalCacheMisses)); 455cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com } 456cc690201d2538a7ec2dbec7040064c8d3c42c613scroggo@google.com#endif 45737c772ae2d96dad9b6e430e9bb6450193a545021commit-bot@chromium.org gWriter.end(); 458868e1f682eaff0a78ba61b3f1612cc6e7dd9c885caryclark@google.com return 0; 459006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 4605987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com 4615987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#if !defined SK_BUILD_FOR_IOS 4625987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) { 4635987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com return tool_main(argc, (char**) argv); 4645987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com} 4655987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif 466