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(©, 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