benchmain.cpp revision 56c69773aea56c6c6bd47bc7e7970dd081205184
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
9971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
10971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "BenchTimer.h"
11971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
12971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "GrContext.h"
13971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "GrRenderTarget.h"
14971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
15971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "SkBenchmark.h"
16bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkCanvas.h"
17f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com#include "SkColorPriv.h"
18971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "SkGpuDevice.h"
193a859a00342ed078af683fd1901fd26c93dd40f0reed@android.com#include "SkGraphics.h"
20b398fe863860b072306b5297c8095c6d973aba06reed@android.com#include "SkImageEncoder.h"
2174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com#include "SkNativeGLContext.h"
2274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com#include "SkNullGLContext.h"
236c924ad46c89955e78e071c792ef00df9910b42freed@android.com#include "SkNWayCanvas.h"
246c924ad46c89955e78e071c792ef00df9910b42freed@android.com#include "SkPicture.h"
25bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkString.h"
26bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
2756c69773aea56c6c6bd47bc7e7970dd081205184djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
2829348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic void log_error(const char msg[]) { SkDebugf("%s", msg); }
2929348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic void log_progress(const char msg[]) { SkDebugf("%s", msg); }
3029348cb0612e19030d979156860946241e2ff4bdreed@android.com#else
3129348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic void log_error(const char msg[]) { fprintf(stderr, "%s", msg); }
3229348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic void log_progress(const char msg[]) { printf("%s", msg); }
3329348cb0612e19030d979156860946241e2ff4bdreed@android.com#endif
3429348cb0612e19030d979156860946241e2ff4bdreed@android.com
3529348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic void log_error(const SkString& str) { log_error(str.c_str()); }
3629348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic void log_progress(const SkString& str) { log_progress(str.c_str()); }
3729348cb0612e19030d979156860946241e2ff4bdreed@android.com
3829348cb0612e19030d979156860946241e2ff4bdreed@android.com///////////////////////////////////////////////////////////////////////////////
3929348cb0612e19030d979156860946241e2ff4bdreed@android.com
406c924ad46c89955e78e071c792ef00df9910b42freed@android.comstatic void erase(SkBitmap& bm) {
416c924ad46c89955e78e071c792ef00df9910b42freed@android.com    if (bm.config() == SkBitmap::kA8_Config) {
426c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm.eraseColor(0);
436c924ad46c89955e78e071c792ef00df9910b42freed@android.com    } else {
446c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm.eraseColor(SK_ColorWHITE);
456c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
466c924ad46c89955e78e071c792ef00df9910b42freed@android.com}
476c924ad46c89955e78e071c792ef00df9910b42freed@android.com
48a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org#if 0
496c924ad46c89955e78e071c792ef00df9910b42freed@android.comstatic bool equal(const SkBitmap& bm1, const SkBitmap& bm2) {
506c924ad46c89955e78e071c792ef00df9910b42freed@android.com    if (bm1.width() != bm2.width() ||
516c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm1.height() != bm2.height() ||
526c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm1.config() != bm2.config()) {
536c924ad46c89955e78e071c792ef00df9910b42freed@android.com        return false;
546c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
556c924ad46c89955e78e071c792ef00df9910b42freed@android.com
566c924ad46c89955e78e071c792ef00df9910b42freed@android.com    size_t pixelBytes = bm1.width() * bm1.bytesPerPixel();
576c924ad46c89955e78e071c792ef00df9910b42freed@android.com    for (int y = 0; y < bm1.height(); y++) {
586c924ad46c89955e78e071c792ef00df9910b42freed@android.com        if (memcmp(bm1.getAddr(0, y), bm2.getAddr(0, y), pixelBytes)) {
596c924ad46c89955e78e071c792ef00df9910b42freed@android.com            return false;
606c924ad46c89955e78e071c792ef00df9910b42freed@android.com        }
616c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
626c924ad46c89955e78e071c792ef00df9910b42freed@android.com    return true;
636c924ad46c89955e78e071c792ef00df9910b42freed@android.com}
64a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org#endif
656c924ad46c89955e78e071c792ef00df9910b42freed@android.com
66bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass Iter {
67bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
68e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com    Iter(void* param) {
69bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        fBench = BenchRegistry::Head();
70e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com        fParam = param;
71bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
72bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
73bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkBenchmark* next() {
74bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        if (fBench) {
75bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            BenchRegistry::Factory f = fBench->factory();
76bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            fBench = fBench->next();
77e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com            return f(fParam);
78bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
79bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        return NULL;
80bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
81d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
82bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprivate:
83bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    const BenchRegistry* fBench;
84e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com    void* fParam;
85bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
86bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
87bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comstatic void make_filename(const char name[], SkString* path) {
88bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    path->set(name);
89bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    for (int i = 0; name[i]; i++) {
90bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        switch (name[i]) {
91bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case '/':
92bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case '\\':
93bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case ' ':
94bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case ':':
95bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com                path->writable_str()[i] = '-';
96bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com                break;
97bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            default:
98bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com                break;
99bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
100bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
101bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com}
102bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
1034c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic void saveFile(const char name[], const char config[], const char dir[],
1044c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                     const SkBitmap& bm) {
1054c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkBitmap copy;
1064c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    if (!bm.copyTo(&copy, SkBitmap::kARGB_8888_Config)) {
1074c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        return;
1084c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    }
109f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
110f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com    if (bm.config() == SkBitmap::kA8_Config) {
111f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        // turn alpha into gray-scale
112f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        size_t size = copy.getSize() >> 2;
113f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        SkPMColor* p = copy.getAddr32(0, 0);
114f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        for (size_t i = 0; i < size; i++) {
115f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            int c = (*p >> SK_A32_SHIFT) & 0xFF;
116f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            c = 255 - c;
117f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            c |= (c << 24) | (c << 16) | (c << 8);
118f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            *p++ = c | (SK_A32_MASK << SK_A32_SHIFT);
119f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        }
120f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com    }
121d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
1224c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkString str;
1234c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    make_filename(name, &str);
1244c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    str.appendf("_%s.png", config);
1254c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    str.prepend(dir);
1264c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    ::remove(str.c_str());
1274c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkImageEncoder::EncodeFile(str.c_str(), copy, SkImageEncoder::kPNG_Type,
1284c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                               100);
1294c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
1304c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1314c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic void performClip(SkCanvas* canvas, int w, int h) {
1324c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkRect r;
1334c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1344c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    r.set(SkIntToScalar(10), SkIntToScalar(10),
1354c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com          SkIntToScalar(w*2/3), SkIntToScalar(h*2/3));
1364c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->clipRect(r, SkRegion::kIntersect_Op);
137d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
1384c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    r.set(SkIntToScalar(w/3), SkIntToScalar(h/3),
1394c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com          SkIntToScalar(w-10), SkIntToScalar(h-10));
1404c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->clipRect(r, SkRegion::kXOR_Op);
1414c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
1424c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1434c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic void performRotate(SkCanvas* canvas, int w, int h) {
1444c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    const SkScalar x = SkIntToScalar(w) / 2;
1454c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    const SkScalar y = SkIntToScalar(h) / 2;
1464c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1474c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->translate(x, y);
1484c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->rotate(SkIntToScalar(35));
1494c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->translate(-x, -y);
1504c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
1514c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
152387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.comstatic void performScale(SkCanvas* canvas, int w, int h) {
153387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const SkScalar x = SkIntToScalar(w) / 2;
154387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const SkScalar y = SkIntToScalar(h) / 2;
155387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com
156387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    canvas->translate(x, y);
157387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    // just enough so we can't take the sprite case
158387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100);
159387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    canvas->translate(-x, -y);
160387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com}
161387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com
16229348cb0612e19030d979156860946241e2ff4bdreed@android.comstatic bool parse_bool_arg(char * const* argv, char* const* stop, bool* var) {
16329348cb0612e19030d979156860946241e2ff4bdreed@android.com    if (argv < stop) {
16429348cb0612e19030d979156860946241e2ff4bdreed@android.com        *var = atoi(*argv) != 0;
16529348cb0612e19030d979156860946241e2ff4bdreed@android.com        return true;
16629348cb0612e19030d979156860946241e2ff4bdreed@android.com    }
16729348cb0612e19030d979156860946241e2ff4bdreed@android.com    return false;
16829348cb0612e19030d979156860946241e2ff4bdreed@android.com}
16929348cb0612e19030d979156860946241e2ff4bdreed@android.com
170a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.orgenum Backend {
171a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    kRaster_Backend,
172a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    kGPU_Backend,
173a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    kPDF_Backend,
174a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org};
175a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org
176a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.orgstatic SkDevice* make_device(SkBitmap::Config config, const SkIPoint& size,
177971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com                             Backend backend, GrContext* context,
178971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com                             GrRenderTarget* rt) {
179a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    SkDevice* device = NULL;
180a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    SkBitmap bitmap;
181a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    bitmap.setConfig(config, size.fX, size.fY);
182d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
183a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    switch (backend) {
184a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org        case kRaster_Backend:
185a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            bitmap.allocPixels();
186a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            erase(bitmap);
187af951c9bc4cbb6e60b430194fe5127ebe99c53fbreed@google.com            device = new SkDevice(bitmap);
188a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            break;
189a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org        case kGPU_Backend:
190971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com            device = new SkGpuDevice(context, rt);
191a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org//            device->clear(0xFFFFFFFF);
192a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            break;
193a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org        case kPDF_Backend:
194a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org        default:
195a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            SkASSERT(!"unsupported");
196a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    }
197a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    return device;
198a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org}
199a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org
2004bc1983e01d756ae9c91fd380758457f579d26eareed@android.comstatic const struct {
2014bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    SkBitmap::Config    fConfig;
2024bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    const char*         fName;
203a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    Backend             fBackend;
2044bc1983e01d756ae9c91fd380758457f579d26eareed@android.com} gConfigs[] = {
205a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    { SkBitmap::kARGB_8888_Config,  "8888",     kRaster_Backend },
206a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    { SkBitmap::kRGB_565_Config,    "565",      kRaster_Backend },
207a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    { SkBitmap::kARGB_8888_Config,  "GPU",      kGPU_Backend },
2084bc1983e01d756ae9c91fd380758457f579d26eareed@android.com};
2094bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
2104c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic int findConfig(const char config[]) {
2114c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
2124c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        if (!strcmp(config, gConfigs[i].fName)) {
2134c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            return i;
2144c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        }
2154c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    }
2164c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    return -1;
2174c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
2184c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
2198382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.comstatic void determine_gpu_context_size(SkTDict<const char*>& defineDict,
2208382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com                                       int* contextWidth,
2218382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com                                       int* contextHeight) {
2228382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    Iter iter(&defineDict);
2238382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    SkBenchmark* bench;
2248382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    while ((bench = iter.next()) != NULL) {
2258382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com        SkIPoint dim = bench->getSize();
2268382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com        if (*contextWidth < dim.fX) {
2278382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com            *contextWidth = dim.fX;
2288382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com        }
2298382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com        if (*contextHeight < dim.fY) {
2308382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com            *contextHeight = dim.fY;
2318382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com        }
2328382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    }
2338382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com}
2348382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com
2351a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.comstatic bool skip_name(const SkTDArray<const char*> array, const char name[]) {
2361a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com    if (0 == array.count()) {
2371a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com        // no names, so don't skip anything
2381a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com        return false;
2391a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com    }
2401a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com    for (int i = 0; i < array.count(); ++i) {
2411a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com        if (strstr(name, array[i])) {
2421a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com            // found the name, so don't skip
2431a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com            return false;
2441a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com        }
2451a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com    }
2461a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com    return true;
2471a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com}
2481a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com
249bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comint main (int argc, char * const argv[]) {
2503a859a00342ed078af683fd1901fd26c93dd40f0reed@android.com    SkAutoGraphics ag;
251d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
252e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com    SkTDict<const char*> defineDict(1024);
2534bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    int repeatDraw = 1;
2544bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    int forceAlpha = 0xFF;
2554bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    bool forceAA = true;
25629348cb0612e19030d979156860946241e2ff4bdreed@android.com    bool forceFilter = false;
2574e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    SkTriState::State forceDither = SkTriState::kDefault;
258be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    bool timerWall = false;
259be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    bool timerCpu = true;
260be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    bool timerGpu = true;
261387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    bool doScale = false;
2624c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    bool doRotate = false;
2634c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    bool doClip = false;
264652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org    bool hasStrokeWidth = false;
265652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org    float strokeWidth;
26674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    bool useNullGL = false;
2671a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com    SkTDArray<const char*> fMatches;
268d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
269b398fe863860b072306b5297c8095c6d973aba06reed@android.com    SkString outDir;
270387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    SkBitmap::Config outConfig = SkBitmap::kNo_Config;
271387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const char* configName = "";
272a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    Backend backend = kRaster_Backend;  // for warning
273387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    int configCount = SK_ARRAY_COUNT(gConfigs);
274d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
275b398fe863860b072306b5297c8095c6d973aba06reed@android.com    char* const* stop = argv + argc;
276b398fe863860b072306b5297c8095c6d973aba06reed@android.com    for (++argv; argv < stop; ++argv) {
277b398fe863860b072306b5297c8095c6d973aba06reed@android.com        if (strcmp(*argv, "-o") == 0) {
278b398fe863860b072306b5297c8095c6d973aba06reed@android.com            argv++;
279b398fe863860b072306b5297c8095c6d973aba06reed@android.com            if (argv < stop && **argv) {
280b398fe863860b072306b5297c8095c6d973aba06reed@android.com                outDir.set(*argv);
281b398fe863860b072306b5297c8095c6d973aba06reed@android.com                if (outDir.c_str()[outDir.size() - 1] != '/') {
282b398fe863860b072306b5297c8095c6d973aba06reed@android.com                    outDir.append("/");
283b398fe863860b072306b5297c8095c6d973aba06reed@android.com                }
284b398fe863860b072306b5297c8095c6d973aba06reed@android.com            }
2854bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-repeat") == 0) {
2864bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            argv++;
2874bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            if (argv < stop) {
2884bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                repeatDraw = atoi(*argv);
2894bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                if (repeatDraw < 1) {
2904bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                    repeatDraw = 1;
2914bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                }
2924bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            } else {
29329348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_error("missing arg for -repeat\n");
2944bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                return -1;
2954bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
296be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        } else if (strcmp(*argv, "-timers") == 0) {
297be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com            argv++;
298be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com            if (argv < stop) {
299be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                timerWall = false;
300be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                timerCpu = false;
301be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                timerGpu = false;
302be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                for (char* t = *argv; *t; ++t) {
303be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    switch (*t) {
304be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    case 'w': timerWall = true; break;
305be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    case 'c': timerCpu = true; break;
306be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    case 'g': timerGpu = true; break;
307be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    }
308be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                }
309be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com            } else {
310be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                log_error("missing arg for -timers\n");
311be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                return -1;
312be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com            }
3134c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        } else if (!strcmp(*argv, "-rotate")) {
3144c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            doRotate = true;
315387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else if (!strcmp(*argv, "-scale")) {
316387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            doScale = true;
3174c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        } else if (!strcmp(*argv, "-clip")) {
3184c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            doClip = true;
3194bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-forceAA") == 0) {
32029348cb0612e19030d979156860946241e2ff4bdreed@android.com            if (!parse_bool_arg(++argv, stop, &forceAA)) {
32129348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_error("missing arg for -forceAA\n");
32229348cb0612e19030d979156860946241e2ff4bdreed@android.com                return -1;
32329348cb0612e19030d979156860946241e2ff4bdreed@android.com            }
32429348cb0612e19030d979156860946241e2ff4bdreed@android.com        } else if (strcmp(*argv, "-forceFilter") == 0) {
32529348cb0612e19030d979156860946241e2ff4bdreed@android.com            if (!parse_bool_arg(++argv, stop, &forceFilter)) {
32629348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_error("missing arg for -forceFilter\n");
32729348cb0612e19030d979156860946241e2ff4bdreed@android.com                return -1;
32829348cb0612e19030d979156860946241e2ff4bdreed@android.com            }
3294e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        } else if (strcmp(*argv, "-forceDither") == 0) {
3304e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com            bool tmp;
3314e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com            if (!parse_bool_arg(++argv, stop, &tmp)) {
3324e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com                log_error("missing arg for -forceDither\n");
3334e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com                return -1;
3344e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com            }
3354e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com            forceDither = tmp ? SkTriState::kTrue : SkTriState::kFalse;
3364bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-forceBlend") == 0) {
33729348cb0612e19030d979156860946241e2ff4bdreed@android.com            bool wantAlpha = false;
33829348cb0612e19030d979156860946241e2ff4bdreed@android.com            if (!parse_bool_arg(++argv, stop, &wantAlpha)) {
33929348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_error("missing arg for -forceBlend\n");
34029348cb0612e19030d979156860946241e2ff4bdreed@android.com                return -1;
34129348cb0612e19030d979156860946241e2ff4bdreed@android.com            }
34229348cb0612e19030d979156860946241e2ff4bdreed@android.com            forceAlpha = wantAlpha ? 0x80 : 0xFF;
343652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        } else if (strcmp(*argv, "-strokeWidth") == 0) {
344652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            argv++;
345652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            if (argv < stop) {
346652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                const char *strokeWidthStr = *argv;
347652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                if (sscanf(strokeWidthStr, "%f", &strokeWidth) != 1) {
348652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                  log_error("bad arg for -strokeWidth\n");
349652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                  return -1;
350652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                }
351652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                hasStrokeWidth = true;
352652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            } else {
353652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                log_error("missing arg for -strokeWidth\n");
354652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org                return -1;
355652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            }
356387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else if (strcmp(*argv, "-match") == 0) {
357387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            argv++;
358387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            if (argv < stop) {
3591a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com                *fMatches.append() = *argv;
360387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            } else {
36129348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_error("missing arg for -match\n");
362387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                return -1;
363387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            }
364387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else if (strcmp(*argv, "-config") == 0) {
365387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            argv++;
366387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            if (argv < stop) {
367387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                int index = findConfig(*argv);
368387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                if (index >= 0) {
369387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    outConfig = gConfigs[index].fConfig;
370387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    configName = gConfigs[index].fName;
371a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                    backend = gConfigs[index].fBackend;
372387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    configCount = 1;
373387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                } else {
37429348cb0612e19030d979156860946241e2ff4bdreed@android.com                    SkString str;
37529348cb0612e19030d979156860946241e2ff4bdreed@android.com                    str.printf("unrecognized config %s\n", *argv);
37629348cb0612e19030d979156860946241e2ff4bdreed@android.com                    log_error(str);
377387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    return -1;
378387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                }
379387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            } else {
38029348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_error("missing arg for -config\n");
381387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                return -1;
3824c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
3830c9da393d9974877f53e8785082f40e1d1c4c833reed@android.com        } else if (strlen(*argv) > 2 && strncmp(*argv, "-D", 2) == 0) {
384e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com            argv++;
3850c9da393d9974877f53e8785082f40e1d1c4c833reed@android.com            if (argv < stop) {
386e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com                defineDict.set(argv[-1] + 2, *argv);
387e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com            } else {
388e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com                log_error("incomplete '-Dfoo bar' definition\n");
389e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com                return -1;
390e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com            }
39174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        } else if (strcmp(*argv, "-nullgl") == 0) {
39274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            useNullGL = true;
393387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else {
39429348cb0612e19030d979156860946241e2ff4bdreed@android.com            SkString str;
39529348cb0612e19030d979156860946241e2ff4bdreed@android.com            str.printf("unrecognized arg %s\n", *argv);
39629348cb0612e19030d979156860946241e2ff4bdreed@android.com            log_error(str);
397387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            return -1;
398b398fe863860b072306b5297c8095c6d973aba06reed@android.com        }
399b398fe863860b072306b5297c8095c6d973aba06reed@android.com    }
400d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
4013b14dc18511fdc2612791d07707e4385182d3ca7reed@google.com    // report our current settings
4023b14dc18511fdc2612791d07707e4385182d3ca7reed@google.com    {
4033b14dc18511fdc2612791d07707e4385182d3ca7reed@google.com        SkString str;
404a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.printf("skia bench: alpha=0x%02X antialias=%d filter=%d",
4053b14dc18511fdc2612791d07707e4385182d3ca7reed@google.com                   forceAlpha, forceAA, forceFilter);
406a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.appendf(" rotate=%d scale=%d clip=%d",
407a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com                   doRotate, doScale, doClip);
408a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com
409a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        const char * ditherName;
410a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        switch (forceDither) {
411a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com            case SkTriState::kDefault: ditherName = "default"; break;
412a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com            case SkTriState::kTrue: ditherName = "true"; break;
413a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com            case SkTriState::kFalse: ditherName = "false"; break;
414a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com            default: ditherName = "<invalid>"; break;
415a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        }
416a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.appendf(" dither=%s", ditherName);
417a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com
418a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        if (hasStrokeWidth) {
419a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com            str.appendf(" strokeWidth=%f", strokeWidth);
420a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        } else {
421a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com            str.append(" strokeWidth=none");
422a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        }
423a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com
424a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#if defined(SK_SCALAR_IS_FLOAT)
425a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" scalar=float");
426a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#elif defined(SK_SCALAR_IS_FIXED)
427a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" scalar=fixed");
428a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#endif
429a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com
430a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#if defined(SK_BUILD_FOR_WIN32)
431a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" system=WIN32");
432a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#elif defined(SK_BUILD_FOR_MAC)
433a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" system=MAC");
434a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#elif defined(SK_BUILD_FOR_ANDROID)
435a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" system=ANDROID");
436a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#elif defined(SK_BUILD_FOR_UNIX)
437a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" system=UNIX");
438a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#else
439a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" system=other");
440a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#endif
441a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com
442a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#if defined(SK_DEBUG)
443a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append(" DEBUG");
444a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#endif
445a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com        str.append("\n");
4463b14dc18511fdc2612791d07707e4385182d3ca7reed@google.com        log_progress(str);
4473b14dc18511fdc2612791d07707e4385182d3ca7reed@google.com    }
448d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
449a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    GrContext* context = NULL;
450971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com    GrRenderTarget* rt = NULL;
451a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com    //Don't do GL when fixed.
45274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    SkAutoTUnref<SkGLContext> glctx;
453a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#if !defined(SK_SCALAR_IS_FIXED)
45474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    if (useNullGL) {
45574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        glctx.reset(new SkNullGLContext);
45674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    } else {
45774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        glctx.reset(new SkNativeGLContext);
45874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
4598382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    int contextWidth = 1024;
4608382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    int contextHeight = 1024;
4618382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    determine_gpu_context_size(defineDict, &contextWidth, &contextHeight);
4628382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com    if (glctx.get()->init(contextWidth, contextHeight)) {
463373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        GrPlatform3DContext ctx =
46474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            reinterpret_cast<GrPlatform3DContext>(glctx.get()->gl());
465373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        context = GrContext::Create(kOpenGL_Shaders_GrEngine, ctx);
466971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com        if (NULL != context) {
467e269f210bdae0288643afaf8a579b22d3f6d5bebbsalomon@google.com            GrPlatformRenderTargetDesc desc;
468c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com            desc.fConfig = kSkia8888_PM_GrPixelConfig;
4698382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com            desc.fWidth = contextWidth;
4708382394bf260af223d5217ff8c45961f149bf1cftomhudson@google.com            desc.fHeight = contextHeight;
471971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com            desc.fStencilBits = 8;
472e269f210bdae0288643afaf8a579b22d3f6d5bebbsalomon@google.com            desc.fRenderTargetHandle = glctx.get()->getFBOID();
473e269f210bdae0288643afaf8a579b22d3f6d5bebbsalomon@google.com            rt = context->createPlatformRenderTarget(desc);
474971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com            if (NULL == rt) {
475971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com                context->unref();
476971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com                context = NULL;
477971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com            }
478971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com        }
479a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org    }
480a5d48414249b7df5387ac572d178a1b6550880a5bungeman@google.com#endif
48174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    BenchTimer timer = BenchTimer(context ? glctx.get() : NULL);
48274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
483e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com    Iter iter(&defineDict);
484bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkBenchmark* bench;
485bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    while ((bench = iter.next()) != NULL) {
486b398fe863860b072306b5297c8095c6d973aba06reed@android.com        SkIPoint dim = bench->getSize();
487b398fe863860b072306b5297c8095c6d973aba06reed@android.com        if (dim.fX <= 0 || dim.fY <= 0) {
488b398fe863860b072306b5297c8095c6d973aba06reed@android.com            continue;
489b398fe863860b072306b5297c8095c6d973aba06reed@android.com        }
490b398fe863860b072306b5297c8095c6d973aba06reed@android.com
4914bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        bench->setForceAlpha(forceAlpha);
4924bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        bench->setForceAA(forceAA);
49329348cb0612e19030d979156860946241e2ff4bdreed@android.com        bench->setForceFilter(forceFilter);
4944e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        bench->setDither(forceDither);
495652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        if (hasStrokeWidth) {
496652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            bench->setStrokeWidth(strokeWidth);
497652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        }
498d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
499387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        // only run benchmarks if their name contains matchStr
5001a7eabc8dc9d0f9f4c7651959fa30f493215c1bareed@google.com        if (skip_name(fMatches, bench->getName())) {
501387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            continue;
502387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        }
503d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
50429348cb0612e19030d979156860946241e2ff4bdreed@android.com        {
50529348cb0612e19030d979156860946241e2ff4bdreed@android.com            SkString str;
506d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            str.printf("running bench [%d %d] %28s", dim.fX, dim.fY,
5070c9da393d9974877f53e8785082f40e1d1c4c833reed@android.com                       bench->getName());
50829348cb0612e19030d979156860946241e2ff4bdreed@android.com            log_progress(str);
50929348cb0612e19030d979156860946241e2ff4bdreed@android.com        }
510d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
5114bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        for (int configIndex = 0; configIndex < configCount; configIndex++) {
5124bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            if (configCount > 1) {
5134bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                outConfig = gConfigs[configIndex].fConfig;
5144bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                configName = gConfigs[configIndex].fName;
515a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                backend = gConfigs[configIndex].fBackend;
516a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            }
517d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
518a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            if (kGPU_Backend == backend && NULL == context) {
519a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                continue;
5204bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
521d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
522971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com            SkDevice* device = make_device(outConfig, dim,
523971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com                                           backend, context, rt);
524a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            SkCanvas canvas(device);
525a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org            device->unref();
526d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
5274c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            if (doClip) {
5284c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                performClip(&canvas, dim.fX, dim.fY);
5294c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
530387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            if (doScale) {
531387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                performScale(&canvas, dim.fX, dim.fY);
532387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            }
5334c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            if (doRotate) {
5344c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                performRotate(&canvas, dim.fX, dim.fY);
5354c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
536d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
537be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com            bool gpu = kGPU_Backend == backend && context;
538d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com            //warm up caches if needed
539eca48360678f1f62089d48ed1b5b885f0a134005reed@android.com            if (repeatDraw > 1) {
540eca48360678f1f62089d48ed1b5b885f0a134005reed@android.com                SkAutoCanvasRestore acr(&canvas, true);
541eca48360678f1f62089d48ed1b5b885f0a134005reed@android.com                bench->draw(&canvas);
542788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com#if !defined(SK_SCALAR_IS_FIXED)
543be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                if (gpu) {
544d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com                    context->flush();
54574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com                    SK_GL(*glctx.get(), Finish());
546d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com                }
547788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com#endif
548eca48360678f1f62089d48ed1b5b885f0a134005reed@android.com            }
549d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
550be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com            timer.start();
5514bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            for (int i = 0; i < repeatDraw; i++) {
552a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                SkAutoCanvasRestore acr(&canvas, true);
553a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                bench->draw(&canvas);
55425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com                if (gpu) {
55525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com                    context->flush();
55625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com                }
55725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            }
558788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com #if !defined(SK_SCALAR_IS_FIXED)
559788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com           if (gpu) {
56074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com                SK_GL(*glctx.get(), Finish());
561788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com           }
562788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com #endif
563788e2474846fd2136ea7f05ca41f7e46c652d508bsalomon@google.com           timer.end();
564d1a416a97cac1769c1616cd3b092876dc6077e59bungeman@google.com
5654bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            if (repeatDraw > 1) {
56629348cb0612e19030d979156860946241e2ff4bdreed@android.com                SkString str;
567be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                str.printf("  %4s:", configName);
568be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                if (timerWall) {
569be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    str.appendf(" msecs = %6.2f", timer.fWall / repeatDraw);
570be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                }
571be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                if (timerCpu) {
572be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    str.appendf(" cmsecs = %6.2f", timer.fCpu / repeatDraw);
573be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                }
574be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                if (timerGpu && gpu && timer.fGpu > 0) {
575be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                    str.appendf(" gmsecs = %6.2f", timer.fGpu / repeatDraw);
576be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com                }
57729348cb0612e19030d979156860946241e2ff4bdreed@android.com                log_progress(str);
5784bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
5794c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            if (outDir.size() > 0) {
580a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                saveFile(bench->getName(), configName, outDir.c_str(),
581a9015f897cd32f549349994e8163ead1db442088mike@reedtribe.org                         device->accessBitmap(false));
5824c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
5834bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        }
58429348cb0612e19030d979156860946241e2ff4bdreed@android.com        log_progress("\n");
585bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
586971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
587971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com    SkSafeUnref(context);
588971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com    SkSafeUnref(rt);
589971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
590bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    return 0;
591bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com}
592