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