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