bbh_shootout.cpp revision 1d38ae9162d9702a8999e1fe872ead3e0a3f1181
16645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/*
26645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Copyright 2013 Google Inc.
36645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org *
46645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
56645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * found in the LICENSE file.
66645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */
76645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
86645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "BenchTimer.h"
96645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "LazyDecodeBitmap.h"
106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "PictureBenchmark.h"
116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "PictureRenderer.h"
126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkBenchmark.h"
136645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkForceLinking.h"
146645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkGraphics.h"
156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkStream.h"
166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkString.h"
176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "TimerData.h"
186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const int kNumNormalRecordings = SkBENCHLOOP(10);
206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const int kNumRTreeRecordings = SkBENCHLOOP(10);
216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const int kNumPlaybacks = SkBENCHLOOP(4);
226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumBaseBenchmarks = 3;
236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumTileSizes = 3;
246645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumBbhPlaybackBenchmarks = 3;
256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumBenchmarks = kNumBaseBenchmarks + kNumBbhPlaybackBenchmarks;
266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
276645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgenum BenchmarkType {
286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    kNormal_BenchmarkType = 0,
296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    kRTree_BenchmarkType,
306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org};
316645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstruct Histogram {
336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    Histogram() {
346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Make fCpuTime negative so that we don't mess with stats:
356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        fCpuTime = SkIntToScalar(-1);
366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkScalar fCpuTime;
386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkString fPath;
396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org};
406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgtypedef void (*BenchmarkFunction)
426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    (BenchmarkType, const SkISize&, const SkString&, SkPicture*, BenchTimer*);
436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org// Defined below.
456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_playback(
466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        BenchmarkType, const SkISize&, const SkString&, SkPicture*, BenchTimer*);
476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_recording(
486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        BenchmarkType, const SkISize&, const SkString&, SkPicture*, BenchTimer*);
496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/**
516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Acts as a POD containing information needed to run a benchmark.
526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Provides static methods to poll benchmark info from an index.
536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */
546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstruct BenchmarkControl {
556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkISize fTileSize;
566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    BenchmarkType fType;
576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    BenchmarkFunction fFunction;
586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkString fName;
596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    /**
616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org     * Will construct a BenchmarkControl instance from an index between 0 an kNumBenchmarks.
626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org     */
636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static BenchmarkControl Make(size_t i) {
646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkASSERT(kNumBenchmarks > i);
656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        BenchmarkControl benchControl;
666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        benchControl.fTileSize = getTileSize(i);
676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        benchControl.fType = getBenchmarkType(i);
686645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        benchControl.fFunction = getBenchmarkFunc(i);
696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        benchControl.fName = getBenchmarkName(i);
706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return benchControl;
716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    enum BaseBenchmarks {
746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        kNormalRecord = 0,
756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        kRTreeRecord,
766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        kNormalPlayback,
776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    };
786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static SkISize fTileSizes[kNumTileSizes];
806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static SkISize getTileSize(size_t i) {
826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Two of the base benchmarks don't need a tile size. But to maintain simplicity
836645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // down the pipeline we have to let a couple of values unused.
846645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (i < kNumBaseBenchmarks) {
856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            return SkISize::Make(256, 256);
866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
876645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (i >= kNumBaseBenchmarks && i < kNumBenchmarks) {
886645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            return fTileSizes[i - kNumBaseBenchmarks];
896645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
906645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkASSERT(0);
916645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return SkISize::Make(0, 0);
926645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
936645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
946645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static BenchmarkType getBenchmarkType(size_t i) {
956645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (i < kNumBaseBenchmarks) {
966645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            switch (i) {
976645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                case kNormalRecord:
986645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                    return kNormal_BenchmarkType;
996645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                case kNormalPlayback:
1006645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                    return kNormal_BenchmarkType;
1016645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                case kRTreeRecord:
1026645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                    return kRTree_BenchmarkType;
1036645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            }
1046645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
1056645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (i < kNumBenchmarks) {
1066645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            return kRTree_BenchmarkType;
1076645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
1086645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkASSERT(0);
1096645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return kRTree_BenchmarkType;
1106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
1116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static BenchmarkFunction getBenchmarkFunc(size_t i) {
1136645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Base functions.
1146645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        switch (i) {
1156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            case kNormalRecord:
1166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                return benchmark_recording;
1176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            case kNormalPlayback:
1186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                return benchmark_playback;
1196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            case kRTreeRecord:
1206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                return benchmark_recording;
1216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
1226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // RTree playbacks
1236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (i < kNumBenchmarks) {
1246645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            return benchmark_playback;
1256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
1266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkASSERT(0);
1276645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return NULL;
1286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
1296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static SkString getBenchmarkName(size_t i) {
1316645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Base benchmark names
1326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        switch (i) {
1336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            case kNormalRecord:
1346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                return SkString("normal_recording");
1356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            case kNormalPlayback:
1366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                return SkString("normal_playback");
1376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            case kRTreeRecord:
1386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                return SkString("rtree_recording");
1396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
1406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // RTree benchmark names.
1416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (i < kNumBenchmarks) {
1426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkASSERT(i >= kNumBaseBenchmarks);
1436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkString name;
1446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            name.printf("rtree_playback_%dx%d",
1456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                    fTileSizes[i - kNumBaseBenchmarks].fWidth,
1466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                    fTileSizes[i - kNumBaseBenchmarks].fHeight);
1476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            return name;
1486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        } else {
1506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkASSERT(0);
1516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
1526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return SkString("");
1536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
1546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org};
1566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgSkISize BenchmarkControl::fTileSizes[kNumTileSizes] = {
1586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkISize::Make(256, 256),
1596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkISize::Make(512, 512),
1606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkISize::Make(1024, 1024),
1616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org};
1626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic SkPicture* pic_from_path(const char path[]) {
1646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkFILEStream stream(path);
1656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    if (!stream.isValid()) {
1666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkDebugf("-- Can't open '%s'\n", path);
1676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return NULL;
1686645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
1696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    return SkPicture::CreateFromStream(&stream, &sk_tools::LazyDecodeBitmap);
1706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
1716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/**
1736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * This function is the sink to which all work ends up going.
1746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Renders the picture into the renderer. It may or may not use an RTree.
1756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * The renderer is chosen upstream. If we want to measure recording, we will
1766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * use a RecordPictureRenderer. If we want to measure rendering, we eill use a
1776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * TiledPictureRenderer.
1786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */
1796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void do_benchmark_work(sk_tools::PictureRenderer* renderer,
1806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        int benchmarkType, const SkString& path, SkPicture* pic,
1816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        const int numRepeats, const char *msg, BenchTimer* timer) {
1826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkString msgPrefix;
1836645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1846645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    switch (benchmarkType){
1856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        case kNormal_BenchmarkType:
1866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            msgPrefix.set("Normal");
1876645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            renderer->setBBoxHierarchyType(sk_tools::PictureRenderer::kNone_BBoxHierarchyType);
1886645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            break;
1896645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        case kRTree_BenchmarkType:
1906645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            msgPrefix.set("RTree");
1916645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            renderer->setBBoxHierarchyType(sk_tools::PictureRenderer::kRTree_BBoxHierarchyType);
1926645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            break;
1936645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        default:
1946645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkASSERT(0);
1956645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            break;
1966645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
1976645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
1986645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    renderer->init(pic);
1996645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2006645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    /**
2016645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org     * If the renderer is not tiled, assume we are measuring recording.
2026645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org     */
2036645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    bool isPlayback = (NULL != renderer->getTiledRenderer());
2046645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2056645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkDebugf("%s %s %s %d times...\n", msgPrefix.c_str(), msg, path.c_str(), numRepeats);
2066645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    for (int i = 0; i < numRepeats; ++i) {
2076645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        renderer->setup();
2086645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Render once to fill caches.
2096645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        renderer->render(NULL);
2106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Render again to measure
2116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        timer->start();
2126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        bool result = renderer->render(NULL);
2136645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        timer->end();
2146645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // We only care about a false result on playback. RecordPictureRenderer::render will always
2156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // return false because we are passing a NULL file name on purpose; which is fine.
2166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if(isPlayback && !result) {
2176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkDebugf("Error rendering during playback.\n");
2186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
2196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
2206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    renderer->end();
2216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
2226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/**
2246645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Call do_benchmark_work with a tiled renderer using the default tile dimensions.
2256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */
2266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_playback(
2276645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        BenchmarkType benchmarkType, const SkISize& tileSize,
2286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        const SkString& path, SkPicture* pic, BenchTimer* timer) {
2296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    sk_tools::TiledPictureRenderer renderer;
2306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2316645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkString message("tiled_playback");
2326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    message.appendf("_%dx%d", tileSize.fWidth, tileSize.fHeight);
2336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    do_benchmark_work(&renderer, benchmarkType,
2346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            path, pic, kNumPlaybacks, message.c_str(), timer);
2356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
2366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/**
2386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Call do_benchmark_work with a RecordPictureRenderer.
2396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */
2406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_recording(
2416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        BenchmarkType benchmarkType, const SkISize& tileSize,
2426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        const SkString& path, SkPicture* pic, BenchTimer* timer) {
2436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    sk_tools::RecordPictureRenderer renderer;
2446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    int numRecordings = 0;
2456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    switch(benchmarkType) {
2466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        case kRTree_BenchmarkType:
2476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            numRecordings = kNumRTreeRecordings;
2486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            break;
2496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        case kNormal_BenchmarkType:
2506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            numRecordings = kNumNormalRecordings;
2516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            break;
2526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
2536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    do_benchmark_work(&renderer, benchmarkType, path, pic, numRecordings, "recording", timer);
2546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
2556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/**
2576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Takes argc,argv along with one of the benchmark functions defined above.
2586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Will loop along all skp files and perform measurments.
2596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org *
2606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Returns a SkScalar representing CPU time taken during benchmark.
2616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * As a side effect, it spits the timer result to stdout.
2626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Will return -1.0 on error.
2636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */
2646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic bool benchmark_loop(
2656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        int argc,
2666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        char **argv,
2676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        const BenchmarkControl& benchControl,
268fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com        Histogram** histogram) {
2696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    static const SkString timeFormat("%f");
2716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    TimerData timerData(timeFormat, timeFormat);
2726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    for (int index = 1; index < argc; ++index) {
2736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        BenchTimer timer;
2746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkString path(argv[index]);
2756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkAutoTUnref<SkPicture> pic(pic_from_path(path.c_str()));
2766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (NULL == pic) {
2776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkDebugf("Couldn't create picture. Ignoring path: %s\n", path.c_str());
2786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            continue;
2796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
2806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        benchControl.fFunction(benchControl.fType, benchControl.fTileSize, path, pic, &timer);
2816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        timerData.appendTimes(&timer, argc - 1 == index);
2826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
283fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com        histogram[index - 1]->fPath = path;
284fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com        histogram[index - 1]->fCpuTime = SkDoubleToScalar(timer.fCpu);
2856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
2866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2876645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    const SkString timerResult = timerData.getResult(
2886645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*logPerIter = */ false,
2896645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*printMin = */ false,
2906645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*repeatDraw = */ 1,
2916645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*configName = */ benchControl.fName.c_str(),
2926645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*showWallTime = */ false,
2936645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*showTruncatedWallTime = */ false,
2946645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*showCpuTime = */ true,
2956645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*showTruncatedCpuTime = */ false,
2966645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            /*showGpuTime = */ false);
2976645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
2986645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    const char findStr[] = "= ";
2996645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    int pos = timerResult.find(findStr);
3006645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    if (-1 == pos) {
3016645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkDebugf("Unexpected output from TimerData::getResult(...). Unable to parse.");
3026645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return false;
3036645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
3046645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3056645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkScalar cpuTime = SkDoubleToScalar(atof(timerResult.c_str() + pos + sizeof(findStr) - 1));
3066645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    if (cpuTime == 0) {  // atof returns 0.0 on error.
3076645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkDebugf("Unable to read value from timer result.\n");
3086645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return false;
3096645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
3106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    return true;
3116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
3126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3131d38ae9162d9702a8999e1fe872ead3e0a3f1181sglez@google.comint tool_main(int argc, char** argv);
3141d38ae9162d9702a8999e1fe872ead3e0a3f1181sglez@google.comint tool_main(int argc, char** argv) {
3156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkAutoGraphics ag;
3166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkString usage;
3176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    usage.printf("Usage: filename [filename]*\n");
3186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    if (argc < 2) {
3206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkDebugf("%s\n", usage.c_str());
3216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        return -1;
3226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
3236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
324fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com    Histogram* histograms[kNumBenchmarks];
3256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    for (size_t i = 0; i < kNumBenchmarks; ++i) {
327fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com        histograms[i] = SkNEW_ARRAY(Histogram, argc - 1);
3286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        bool success = benchmark_loop(
3296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                argc, argv,
3306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org                BenchmarkControl::Make(i),
331fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com                &histograms[i]);
3326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (!success) {
3336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            SkDebugf("benchmark_loop failed at index %d", i);
3346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
3356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
3366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    // Output gnuplot readable histogram data..
3386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    const char* pbTitle = "bbh_shootout_playback.dat";
3396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    const char* recTitle = "bbh_shootout_record.dat";
3406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkFILEWStream playbackOut(pbTitle);
3416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkFILEWStream recordOut(recTitle);
3426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    recordOut.writeText("# ");
3436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    playbackOut.writeText("# ");
3446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    for (size_t i = 0; i < kNumBenchmarks; ++i) {
3456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkString out;
3466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        out.printf("%s ", BenchmarkControl::getBenchmarkName(i).c_str());
3476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (BenchmarkControl::getBenchmarkFunc(i) == &benchmark_recording) {
3486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            recordOut.writeText(out.c_str());
3496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
3506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        if (BenchmarkControl::getBenchmarkFunc(i) == &benchmark_playback) {
3516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            playbackOut.writeText(out.c_str());
3526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
3536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
3546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    recordOut.writeText("\n");
3556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    playbackOut.writeText("\n");
3566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    for (int i = 0; i < argc - 1; ++i) {
3586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkString pbLine;
3596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        SkString recLine;
3606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // ==== Write record info
3616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        recLine.printf("%d ", i);
3626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        recLine.appendf("%f ", histograms[0][i].fCpuTime);  // Append normal_record time
3636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        recLine.appendf("%f", histograms[1][i].fCpuTime);  // Append rtree_record time
3646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // ==== Write playback info
3666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        pbLine.printf("%d ", i);
3676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        pbLine.appendf("%f ", histograms[2][i].fCpuTime);  // Start with normal playback time.
3686645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        // Append all playback benchmark times.
3696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        for (size_t j = kNumBbhPlaybackBenchmarks; j < kNumBenchmarks; ++j) {
3706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org            pbLine.appendf("%f ", histograms[j][i].fCpuTime);
3716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        }
3726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        pbLine.remove(pbLine.size() - 1, 1);  // Remove trailing space from line.
3736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        pbLine.appendf("\n");
3746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        recLine.appendf("\n");
3756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        playbackOut.writeText(pbLine.c_str());
3766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org        recordOut.writeText(recLine.c_str());
3776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    }
3786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    SkDebugf("\nWrote data to gnuplot-readable files: %s %s\n", pbTitle, recTitle);
3796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    return 0;
3816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
3826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
3836645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgint main(int argc, char** argv) {
3846645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org    return tool_main(argc, argv);
3856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}
3866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org
387