bench_pictures_main.cpp revision c0d5e549ab8d594a5da8db417db39622e9491fff
1006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com/* 2006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * Copyright 2012 Google Inc. 3006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * 4006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * Use of this source code is governed by a BSD-style license that can be 5006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com * found in the LICENSE file. 6006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com */ 7006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 8006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "BenchTimer.h" 94a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com#include "CopyTilesRenderer.h" 10163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org#include "PictureBenchmark.h" 119a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#include "SkBenchLogger.h" 12006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkCanvas.h" 130a36f43d5f710c47b63bc4bbfde9bbb7d59a88d1scroggo@google.com#include "SkGraphics.h" 145a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com#include "SkImageDecoder.h" 15f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org#include "SkMath.h" 16006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkOSFile.h" 17006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkPicture.h" 18006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkStream.h" 19006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "SkTArray.h" 20006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com#include "picture_utils.h" 21006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 2213fd5a15a170c0d024f4907991d8a57d8adf755eborenet@google.comconst int DEFAULT_REPEATS = 1; 23006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 24a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic char const * const gFilterTypes[] = { 25a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "paint", 26a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "point", 27a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "line", 28a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "bitmap", 29a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "rect", 30a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "path", 31a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "text", 32a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "all", 33a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}; 34a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 35a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic const size_t kFilterTypesCount = sizeof(gFilterTypes) / sizeof(gFilterTypes[0]); 36a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 37a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic char const * const gFilterFlags[] = { 38a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "antiAlias", 39a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "filterBitmap", 40a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "dither", 41a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "underlineText", 42a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "strikeThruText", 43a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "fakeBoldText", 44a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "linearText", 45a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "subpixelText", 46a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "devKernText", 47a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "LCDRenderText", 48a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "embeddedBitmapText", 49a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "autoHinting", 50a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "verticalText", 51a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "genA8FromLCD", 52a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "blur", 53e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com "lowBlur", 54a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "hinting", 55a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com "slightHinting", 56e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com "AAClip", 57a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com}; 58a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 59a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic const size_t kFilterFlagsCount = sizeof(gFilterFlags) / sizeof(gFilterFlags[0]); 60a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 61a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filtersName(sk_tools::PictureRenderer::DrawFilterFlags* drawFilters) { 62a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com int all = drawFilters[0]; 63a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com size_t tIndex; 64a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (tIndex = 1; tIndex < SkDrawFilter::kTypeCount; ++tIndex) { 65a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com all &= drawFilters[tIndex]; 66a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 67a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString result; 68a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) { 69a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString types; 70a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (all & (1 << fIndex)) { 71a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com types = gFilterTypes[SkDrawFilter::kTypeCount]; 72a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } else { 73a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (tIndex = 0; tIndex < SkDrawFilter::kTypeCount; ++tIndex) { 74a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (drawFilters[tIndex] & (1 << fIndex)) { 75a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com types += gFilterTypes[tIndex]; 76a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 77a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 78a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 79a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (!types.size()) { 80a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com continue; 81a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 82a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += "_"; 83a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += types; 84a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += "."; 85a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += gFilterFlags[fIndex]; 86a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 87a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com return result; 88a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com} 89a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 90a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filterTypesUsage() { 91a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString result; 92a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t index = 0; index < kFilterTypesCount; ++index) { 93a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += gFilterTypes[index]; 94a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (index < kFilterTypesCount - 1) { 95a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += " | "; 96a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 97a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 98a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com return result; 99a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com} 100a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 101a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.comstatic SkString filterFlagsUsage() { 102a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString result; 103a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com size_t len = 0; 104a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t index = 0; index < kFilterFlagsCount; ++index) { 105a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += gFilterFlags[index]; 106a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (result.size() - len >= 72) { 107a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += "\n "; 108a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com len = result.size(); 109a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 110a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (index < kFilterFlagsCount - 1) { 111a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com result += " | "; 112a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 113a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 114a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com return result; 115a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com} 116a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 117006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.comstatic void usage(const char* argv0) { 118006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkDebugf("SkPicture benchmarking tool\n"); 119006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkDebugf("\n" 120006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com"Usage: \n" 121d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org" %s <inputDir>...\n" 1225239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com" [--logFile filename][--timers [wcgWC]*][--logPerIter 1|0][--min]\n" 123795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" [--repeat] \n" 1244a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" [--mode pow2tile minWidth height | record | simple\n" 1254a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" | tile width height | playbackCreation]\n" 12658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" [--pipe]\n" 1279313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org" [--bbh bbhType]\n" 128bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com" [--multi numThreads]\n" 129c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com" [--viewport width height]\n" 130c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" [--device bitmap" 131c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU 132c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" | gpu" 133c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif 134a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com"]\n" 135a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com" [--filter [%s]:\n [%s]]\n" 136a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com, argv0, filterTypesUsage().c_str(), filterFlagsUsage().c_str()); 137a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkDebugf("\n"); 138006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkDebugf( 139795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" inputDir: A list of directories and files to use as input. Files are\n" 1409a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com" expected to have the .skp extension.\n\n" 1419a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com" --logFile filename : destination for writing log output, in addition to stdout.\n"); 1425239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com SkDebugf(" --logPerIter 1|0 : " 1435239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com "Log each repeat timer instead of mean, default is disabled.\n"); 1445239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com SkDebugf(" --min : Print the minimum times (instead of average).\n"); 1455239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com SkDebugf(" --timers [wcgWC]* : " 1465239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com "Display wall, cpu, gpu, truncated wall or truncated cpu time for each picture.\n"); 147006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkDebugf( 1484a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" --mode pow2tile minWidth height | copyTile width height | record | simple\n" 1494a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" | tile width height | playbackCreation:\n" 15058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" Run in the corresponding mode.\n" 15158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" Default is simple.\n"); 152cf6c44cf9287af8b425fb0d9d286a6d57ad03897keyar@chromium.org SkDebugf( 1534a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" pow2tile minWidth height, Creates tiles with widths\n" 15458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" that are all a power of two\n" 15558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" such that they minimize the\n" 15658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" amount of wasted tile space.\n" 15758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" minWidth is the minimum width\n" 15858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" of these tiles and must be a\n" 15958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" power of two. Simple\n" 16058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com" rendering using these tiles\n" 161bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com" is benchmarked.\n"); 162f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org SkDebugf( 163795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" record, Benchmark picture to picture recording.\n"); 164795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org SkDebugf( 165795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" simple, Benchmark a simple rendering.\n"); 166795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org SkDebugf( 1674a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" tile width height, Benchmark simple rendering using\n" 1684a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" tiles with the given dimensions.\n" 1694a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" copyTile width height, Draw the picture, then copy it into tiles.\n" 1704a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" Does not support percentages.\n" 1714a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" If the picture is large enough, breaks it into\n" 1724a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" larger tiles (and draws the picture once per\n" 1734a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" larger tile) to avoid creating a large canvas.\n" 1744a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" Add --tiles x y to specify the number of tiles\n" 1754a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com" per larger tile in the x and y direction.\n" 1764a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com ); 177006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkDebugf( 1789a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com" playbackCreation, Benchmark creation of the SkPicturePlayback.\n"); 179795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org SkDebugf("\n"); 1804916971526d53d873179ba1377e128a3a38a0056keyar@chromium.org SkDebugf( 181bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com" --multi numThreads : Set the number of threads for multi threaded drawing. Must be greater\n" 182bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com" than 1. Only works with tiled rendering.\n" 183c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com" --viewport width height : Set the viewport.\n" 184a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com" --pipe: Benchmark SkGPipe rendering. Currently incompatible with \"mode\".\n"); 18558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkDebugf( 1867b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org" --bbh bbhType [width height]: Set the bounding box hierarchy type to\n" 1877b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org" be used. Accepted values are: none, rtree, grid. Default\n" 1887b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org" value is none. Not compatible with --pipe. With value\n" 1897b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org" 'grid', width and height must be specified. 'grid' can\n" 1907b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org" only be used with modes tile, record, and\n" 1917b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org" playbackCreation."); 1929313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org SkDebugf( 193c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" --device bitmap" 194c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU 195c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" | gpu" 196c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif 197c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org": Use the corresponding device. Default is bitmap.\n"); 198c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org SkDebugf( 199c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" bitmap, Render to a bitmap.\n"); 200c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU 201a40c20df0e4c5d04acb0841d70127778c0a779eckeyar@chromium.org SkDebugf( 202c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org" gpu, Render to the GPU.\n"); 203c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif 204c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org SkDebugf("\n"); 205c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org SkDebugf( 206795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" --repeat: " 207795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org"Set the number of times to repeat each test." 208795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org" Default is %i.\n", DEFAULT_REPEATS); 209a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkDebugf( 210e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com" --filter type:flag : Enable canvas filtering to disable a paint flag,\n" 211e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com" use no blur or low quality blur, or use no hinting or\n" 212e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com" slight hinting. For all flags except AAClip, specify the\n" 213e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com" type of primitive to effect, or choose all. for AAClip\n" 214e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com" alone, the filter affects all clips independent of type.\n"); 215006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 216006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 2179a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comSkBenchLogger gLogger; 2189a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 21966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.comstatic bool run_single_benchmark(const SkString& inputPath, 220163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org sk_tools::PictureBenchmark& benchmark) { 221006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com SkFILEStream inputStream; 222006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 223006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com inputStream.setPath(inputPath.c_str()); 224006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com if (!inputStream.isValid()) { 2259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 2269a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com err.printf("Could not open file %s\n", inputPath.c_str()); 2279a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 22866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return false; 229006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 230006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 23166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com bool success = false; 2325a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com SkPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream); 23366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com if (!success) { 23466bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com SkString err; 23566bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); 23666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com gLogger.logError(err); 23766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return false; 23866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com } 239006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 240d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org SkString filename; 241d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org sk_tools::get_basename(&filename, inputPath); 242db9a5fb55f77935774f21e07a04b6d1350ca54cckeyar@chromium.org 243db9a5fb55f77935774f21e07a04b6d1350ca54cckeyar@chromium.org SkString result; 2442d2b9a0d8c78c62565e8eedeca3c337827d795c1borenet@google.com result.printf("running bench [%i %i] %s ", picture.width(), 2452d2b9a0d8c78c62565e8eedeca3c337827d795c1borenet@google.com picture.height(), filename.c_str()); 2469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logProgress(result); 247d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org 2482d2b9a0d8c78c62565e8eedeca3c337827d795c1borenet@google.com benchmark.run(&picture); 24966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return true; 250006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 251006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 252a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#define PRINT_USAGE_AND_EXIT \ 253a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com do { \ 254a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com usage(argv0); \ 255a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com exit(-1); \ 256a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } while (0) 257a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com 258163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.orgstatic void parse_commandline(int argc, char* const argv[], SkTArray<SkString>* inputs, 2595239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com sk_tools::PictureBenchmark* benchmark) { 260006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com const char* argv0 = argv[0]; 261006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com char* const* stop = argv + argc; 262006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 263163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org int repeats = DEFAULT_REPEATS; 264c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org sk_tools::PictureRenderer::SkDeviceTypes deviceType = 265c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org sk_tools::PictureRenderer::kBitmap_DeviceType; 266163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org 267a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com SkAutoTUnref<sk_tools::PictureRenderer> renderer(NULL); 2685239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com 2699a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com // Create a string to show our current settings. 2709a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com // TODO: Make it prettier. Currently it just repeats the command line. 2719a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString commandLine("bench_pictures:"); 2729a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com for (int i = 1; i < argc; i++) { 2739a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com commandLine.appendf(" %s", *(argv+i)); 2749a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } 2759a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com commandLine.append("\n"); 2769a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 27758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com bool usePipe = false; 278bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com int numThreads = 1; 27958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com bool useTiles = false; 28058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com const char* widthString = NULL; 28158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com const char* heightString = NULL; 2827b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org int gridWidth = 0; 2837b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org int gridHeight = 0; 28458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com bool isPowerOf2Mode = false; 2854a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com bool isCopyMode = false; 2864a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com const char* xTilesString = NULL; 2874a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com const char* yTilesString = NULL; 28858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com const char* mode = NULL; 2897b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org bool gridSupported = false; 2901aa90cf11e136a722bce71dd77f4bb03cc2b56f8skia.committer@gmail.com sk_tools::PictureRenderer::BBoxHierarchyType bbhType = 2919313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org sk_tools::PictureRenderer::kNone_BBoxHierarchyType; 292a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com sk_tools::PictureRenderer::DrawFilterFlags drawFilters[SkDrawFilter::kTypeCount]; 293a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com sk_bzero(drawFilters, sizeof(drawFilters)); 294c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com SkISize viewport; 295c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com viewport.setEmpty(); 296006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com for (++argv; argv < stop; ++argv) { 297006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com if (0 == strcmp(*argv, "--repeat")) { 298006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com ++argv; 299006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com if (argv < stop) { 300163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org repeats = atoi(*argv); 301163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org if (repeats < 1) { 3029a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError("--repeat must be given a value > 0\n"); 303a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 304006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 305006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } else { 3069a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError("Missing arg for --repeat\n"); 307a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 308006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 30958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } else if (0 == strcmp(*argv, "--pipe")) { 31058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com usePipe = true; 3119a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } else if (0 == strcmp(*argv, "--logFile")) { 3129a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com argv++; 3139a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com if (argv < stop) { 3149a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com if (!gLogger.SetLogFile(*argv)) { 3159a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString str; 3169a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com str.printf("Could not open %s for writing.", *argv); 3179a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(str); 3189a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com usage(argv0); 319a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com // TODO(borenet): We're disabling this for now, due to 320a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com // write-protected Android devices. The very short-term 321a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com // solution is to ignore the fact that we have no log file. 322a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com //exit(-1); 3239a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } 3249a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } else { 3259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError("Missing arg for --logFile\n"); 326a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 3279a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } 328bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } else if (0 == strcmp(*argv, "--multi")) { 329bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com ++argv; 330bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com if (argv >= stop) { 331bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com gLogger.logError("Missing arg for --multi\n"); 332a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 333bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 334bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com numThreads = atoi(*argv); 335bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com if (numThreads < 2) { 336bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com gLogger.logError("Number of threads must be at least 2.\n"); 337a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 338bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 3399313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } else if (0 == strcmp(*argv, "--bbh")) { 3409313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org ++argv; 3419313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org if (argv >= stop) { 3429313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org gLogger.logError("Missing value for --bbh\n"); 343a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 3449313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } 3459313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org if (0 == strcmp(*argv, "none")) { 3469313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org bbhType = sk_tools::PictureRenderer::kNone_BBoxHierarchyType; 3479313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } else if (0 == strcmp(*argv, "rtree")) { 3489313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org bbhType = sk_tools::PictureRenderer::kRTree_BBoxHierarchyType; 3497b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } else if (0 == strcmp(*argv, "grid")) { 3507b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org bbhType = sk_tools::PictureRenderer::kTileGrid_BBoxHierarchyType; 3517b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org ++argv; 3527b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org if (argv >= stop) { 3537b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gLogger.logError("Missing width for --bbh grid\n"); 3547b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org PRINT_USAGE_AND_EXIT; 3557b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } 3567b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gridWidth = atoi(*argv); 3577b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org ++argv; 3587b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org if (argv >= stop) { 3597b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gLogger.logError("Missing height for --bbh grid\n"); 3607b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org PRINT_USAGE_AND_EXIT; 3617b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } 3627b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gridHeight = atoi(*argv); 3639313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } else { 3649313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org SkString err; 3659313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org err.printf("%s is not a valid value for --bbhType\n", *argv); 3669313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org gLogger.logError(err); 367a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 3689313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } 3699313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 370795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org } else if (0 == strcmp(*argv, "--mode")) { 371a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com if (renderer.get() != NULL) { 372a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com SkDebugf("Cannot combine modes.\n"); 373a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 374a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } 375795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org 376006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com ++argv; 377795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org if (argv >= stop) { 3789a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError("Missing mode for --mode\n"); 379a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 380795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org } 381795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org 38258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (0 == strcmp(*argv, "record")) { 383a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com renderer.reset(SkNEW(sk_tools::RecordPictureRenderer)); 3847b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gridSupported = true; 3855a34fd3f9876174aea8b22e1b585b4244e71b0b1reed@google.com } else if (0 == strcmp(*argv, "clone")) { 3865a34fd3f9876174aea8b22e1b585b4244e71b0b1reed@google.com renderer.reset(sk_tools::CreatePictureCloneRenderer()); 387795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org } else if (0 == strcmp(*argv, "simple")) { 388a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com renderer.reset(SkNEW(sk_tools::SimplePictureRenderer)); 3894a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } else if ((0 == strcmp(*argv, "tile")) || (0 == strcmp(*argv, "pow2tile")) 3904a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com || 0 == strcmp(*argv, "copyTile")) { 39158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com useTiles = true; 39258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com mode = *argv; 393f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org 394f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org if (0 == strcmp(*argv, "pow2tile")) { 395f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org isPowerOf2Mode = true; 3964a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } else if (0 == strcmp(*argv, "copyTile")) { 3974a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com isCopyMode = true; 3987b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } else { 3997b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gridSupported = true; 400f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org } 401f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org 402795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org ++argv; 403795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org if (argv >= stop) { 4049a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 4059a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com err.printf("Missing width for --mode %s\n", mode); 4069a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 407a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 408795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org } 409795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org 41058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com widthString = *argv; 411795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org ++argv; 412795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org if (argv >= stop) { 4134a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 4144a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.appendf("Missing height for --mode %s\n", mode); 4154a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err); 416a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 417795cd47342509da7924e703bc5c8503cbf00b10akeyar@chromium.org } 41858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com heightString = *argv; 4199a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com } else if (0 == strcmp(*argv, "playbackCreation")) { 420a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com renderer.reset(SkNEW(sk_tools::PlaybackCreationRenderer)); 4217b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gridSupported = true; 422fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com } else if (0 == strcmp(*argv, "gatherPixelRefs")) { 423fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com renderer.reset(sk_tools::CreateGatherPixelRefsRenderer()); 424006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } else { 4259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 4269a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com err.printf("%s is not a valid mode for --mode\n", *argv); 4279a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 428a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 429006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 430c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com } else if (0 == strcmp(*argv, "--viewport")) { 431c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com ++argv; 432c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com if (argv >= stop) { 433c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com gLogger.logError("Missing width for --viewport\n"); 434c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com PRINT_USAGE_AND_EXIT; 435c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com } 436c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com viewport.fWidth = atoi(*argv); 437c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com ++argv; 438c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com if (argv >= stop) { 439c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com gLogger.logError("Missing height for --viewport\n"); 440c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com PRINT_USAGE_AND_EXIT; 441c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com } 442c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com viewport.fHeight = atoi(*argv); 4434a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } else if (0 == strcmp(*argv, "--tiles")) { 4444a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com ++argv; 4454a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (argv >= stop) { 4464a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError("Missing x for --tiles\n"); 4474a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com PRINT_USAGE_AND_EXIT; 4484a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } 4494a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com xTilesString = *argv; 4504a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com ++argv; 4514a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (argv >= stop) { 4524a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError("Missing y for --tiles\n"); 4534a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com PRINT_USAGE_AND_EXIT; 4544a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } 4554a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com yTilesString = *argv; 456c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org } else if (0 == strcmp(*argv, "--device")) { 457c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org ++argv; 458c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org if (argv >= stop) { 459a49bffdb034d71f025f4cbc630458f748de72428borenet@google.com gLogger.logError("Missing mode for --device\n"); 460a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 461c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org } 462c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org 463c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org if (0 == strcmp(*argv, "bitmap")) { 464c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType; 465c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org } 466c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU 467c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org else if (0 == strcmp(*argv, "gpu")) { 468c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; 469c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org } 470c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif 471c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org else { 4729a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 4739a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com err.printf("%s is not a valid mode for --device\n", *argv); 4749a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 475a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 476c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org } 4775239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } else if (0 == strcmp(*argv, "--timers")) { 4785239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com ++argv; 4795239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (argv < stop) { 4805239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com bool timerWall = false; 4815239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com bool truncatedTimerWall = false; 4825239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com bool timerCpu = false; 4835239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com bool truncatedTimerCpu = false; 4845239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com bool timerGpu = false; 4855239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com for (char* t = *argv; *t; ++t) { 4865239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com switch (*t) { 4875239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com case 'w': 4885239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com timerWall = true; 4895239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com break; 4905239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com case 'c': 4915239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com timerCpu = true; 4925239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com break; 4935239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com case 'W': 4945239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com truncatedTimerWall = true; 4955239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com break; 4965239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com case 'C': 4975239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com truncatedTimerCpu = true; 4985239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com break; 4995239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com case 'g': 5005239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com timerGpu = true; 5015239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com break; 5025239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com default: { 5035239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com break; 5045239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 5055239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 5065239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 5075239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com benchmark->setTimersToShow(timerWall, truncatedTimerWall, timerCpu, 5085239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com truncatedTimerCpu, timerGpu); 5095239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } else { 5105239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com gLogger.logError("Missing arg for --timers\n"); 511a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 5125239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 5135239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } else if (0 == strcmp(*argv, "--min")) { 5145239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com benchmark->setPrintMin(true); 5155239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } else if (0 == strcmp(*argv, "--logPerIter")) { 5165239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com ++argv; 5175239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (argv < stop) { 5185239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com bool log = atoi(*argv) != 0; 5195239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com benchmark->setLogPerIter(log); 5205239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } else { 5215239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com gLogger.logError("Missing arg for --logPerIter\n"); 522a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 5235239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com } 524a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } else if (0 == strcmp(*argv, "--filter")) { 525a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com ++argv; 526a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (argv < stop) { 527a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com const char* colon = strchr(*argv, ':'); 528a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (colon) { 529a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com int type = -1; 530a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com size_t typeLen = colon - *argv; 531a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t tIndex = 0; tIndex < kFilterTypesCount; ++tIndex) { 532a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (typeLen == strlen(gFilterTypes[tIndex]) 533a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com && !strncmp(*argv, gFilterTypes[tIndex], typeLen)) { 534a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com type = tIndex; 535a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com break; 536a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 537a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 538a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (type < 0) { 539a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString err; 540a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com err.printf("Unknown type for --filter %s\n", *argv); 541a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com gLogger.logError(err); 542a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com PRINT_USAGE_AND_EXIT; 543a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 544a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com int flag = -1; 545a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com size_t flagLen = strlen(*argv) - typeLen - 1; 546a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (size_t fIndex = 0; fIndex < kFilterFlagsCount; ++fIndex) { 547a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (flagLen == strlen(gFilterFlags[fIndex]) 548a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com && !strncmp(colon + 1, gFilterFlags[fIndex], flagLen)) { 549a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com flag = 1 << fIndex; 550a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com break; 551a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 552a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 553a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (flag < 0) { 554a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString err; 555a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com err.printf("Unknown flag for --filter %s\n", *argv); 556a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com gLogger.logError(err); 557a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com PRINT_USAGE_AND_EXIT; 558a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 559a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com for (int index = 0; index < SkDrawFilter::kTypeCount; ++index) { 560a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com if (type != SkDrawFilter::kTypeCount && index != type) { 561a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com continue; 562a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 563a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com drawFilters[index] = (sk_tools::PictureRenderer::DrawFilterFlags) 564a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com (drawFilters[index] | flag); 565a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 566a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } else { 567a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SkString err; 568a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com err.printf("Unknown arg for --filter %s : missing colon\n", *argv); 569a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com gLogger.logError(err); 570a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com PRINT_USAGE_AND_EXIT; 571a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 572a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } else { 573a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com gLogger.logError("Missing arg for --filter\n"); 574a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com PRINT_USAGE_AND_EXIT; 575a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 576006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } else if (0 == strcmp(*argv, "--help") || 0 == strcmp(*argv, "-h")) { 577a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 578006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } else { 579d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org inputs->push_back(SkString(*argv)); 580006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 581006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 582006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 583bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com if (numThreads > 1 && !useTiles) { 584bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com gLogger.logError("Multithreaded drawing requires tiled rendering.\n"); 585a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 586bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 587bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com 5889313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org if (usePipe && sk_tools::PictureRenderer::kNone_BBoxHierarchyType != bbhType) { 5899313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org gLogger.logError("--pipe and --bbh cannot be used together\n"); 590a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 5919313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } 5929313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 5937b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org if (sk_tools::PictureRenderer::kTileGrid_BBoxHierarchyType == bbhType && 5947b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org !gridSupported) { 5957b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org gLogger.logError("'--bbh grid' is not compatible with specified --mode.\n"); 5967b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org PRINT_USAGE_AND_EXIT; 5977b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } 5987b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org 59958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (useTiles) { 6005239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com SkASSERT(NULL == renderer); 601a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com sk_tools::TiledPictureRenderer* tiledRenderer; 6024a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (isCopyMode) { 6034a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com int x, y; 6044a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (xTilesString != NULL) { 6054a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkASSERT(yTilesString != NULL); 6064a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com x = atoi(xTilesString); 6074a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com y = atoi(yTilesString); 6084a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (x <= 0 || y <= 0) { 6094a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError("--tiles must be given values > 0\n"); 6104a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com PRINT_USAGE_AND_EXIT; 6114a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } 6124a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } else { 6134a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com x = y = 4; 6144a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } 6154a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com tiledRenderer = SkNEW_ARGS(sk_tools::CopyTilesRenderer, (x, y)); 6164a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } else if (numThreads > 1) { 617a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com tiledRenderer = SkNEW_ARGS(sk_tools::MultiCorePictureRenderer, (numThreads)); 618a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } else { 619a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com tiledRenderer = SkNEW(sk_tools::TiledPictureRenderer); 620a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } 62158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (isPowerOf2Mode) { 62258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com int minWidth = atoi(widthString); 62358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (!SkIsPow2(minWidth) || minWidth < 0) { 6245239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->unref(); 6259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com SkString err; 6265239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com err.printf("-mode %s must be given a width" 62758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com " value that is a power of two\n", mode); 6289a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logError(err); 629a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 63058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 6315239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->setTileMinPowerOf2Width(minWidth); 63258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } else if (sk_tools::is_percentage(widthString)) { 6334a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (isCopyMode) { 6344a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com tiledRenderer->unref(); 6354a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 6364a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.printf("--mode %s does not support percentages.\n", mode); 6374a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err.c_str()); 6384a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com PRINT_USAGE_AND_EXIT; 6394a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } 6405239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->setTileWidthPercentage(atof(widthString)); 6415239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (!(tiledRenderer->getTileWidthPercentage() > 0)) { 6425239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->unref(); 6434a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 6444a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.appendf("--mode %s must be given a width percentage > 0\n", mode); 6454a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err); 646a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 64758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 64858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } else { 6495239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->setTileWidth(atoi(widthString)); 6505239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (!(tiledRenderer->getTileWidth() > 0)) { 6515239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->unref(); 6524a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 6534a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.appendf("--mode %s must be given a width > 0\n", mode); 6544a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err); 655a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 65658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 65758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 65858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com 65958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com if (sk_tools::is_percentage(heightString)) { 6604a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com if (isCopyMode) { 6614a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com tiledRenderer->unref(); 6624a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 6634a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.printf("--mode %s does not support percentages.\n", mode); 6644a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err.c_str()); 6654a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com PRINT_USAGE_AND_EXIT; 6664a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com } 6675239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->setTileHeightPercentage(atof(heightString)); 6685239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (!(tiledRenderer->getTileHeightPercentage() > 0)) { 6695239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->unref(); 6704a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 6714a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.appendf("--mode %s must be given a height percentage > 0\n", mode); 6724a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err); 673a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 67458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 67558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } else { 6765239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->setTileHeight(atoi(heightString)); 6775239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (!(tiledRenderer->getTileHeight() > 0)) { 6785239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com tiledRenderer->unref(); 6794a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com SkString err; 6804a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com err.appendf("--mode %s must be given a height > 0\n", mode); 6814a26d9d62a6d762a518c0ca08d43189916b75cf2scroggo@google.com gLogger.logError(err); 682a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 68358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 68458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 685bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com if (numThreads > 1) { 686bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com#if SK_SUPPORT_GPU 687bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com if (sk_tools::PictureRenderer::kGPU_DeviceType == deviceType) { 688bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com tiledRenderer->unref(); 689bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com gLogger.logError("GPU not compatible with multithreaded tiling.\n"); 690a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 691bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 692bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com#endif 693bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com } 694a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com renderer.reset(tiledRenderer); 695a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com if (usePipe) { 696a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com SkDebugf("Pipe rendering is currently not compatible with tiling.\n" 697a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com "Turning off pipe.\n"); 698a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } 69958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } else if (usePipe) { 700a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com if (renderer.get() != NULL) { 701a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com SkDebugf("Pipe is incompatible with other modes.\n"); 702a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 703a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com } 704a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com renderer.reset(SkNEW(sk_tools::PipePictureRenderer)); 70558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com } 706d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org if (inputs->count() < 1) { 707a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com PRINT_USAGE_AND_EXIT; 708006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 709163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org 7105239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com if (NULL == renderer) { 711a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com renderer.reset(SkNEW(sk_tools::SimplePictureRenderer)); 712163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org } 7139313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 7149313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org renderer->setBBoxHierarchyType(bbhType); 715a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com renderer->setDrawFilters(drawFilters, filtersName(drawFilters)); 7167b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org renderer->setGridSize(gridWidth, gridHeight); 717c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com renderer->setViewport(viewport); 718a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com benchmark->setRenderer(renderer); 719163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org benchmark->setRepeats(repeats); 720c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org benchmark->setDeviceType(deviceType); 7219a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com benchmark->setLogger(&gLogger); 7229a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com // Report current settings: 7239a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com gLogger.logProgress(commandLine); 724d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org} 725d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org 72666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.comstatic int process_input(const SkString& input, 72766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com sk_tools::PictureBenchmark& benchmark) { 728d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org SkOSFile::Iter iter(input.c_str(), "skp"); 729d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org SkString inputFilename; 73066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com int failures = 0; 731d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org if (iter.next(&inputFilename)) { 732d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org do { 733d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org SkString inputPath; 734163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org sk_tools::make_filepath(&inputPath, input, inputFilename); 73557837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com if (!run_single_benchmark(inputPath, benchmark)) { 73666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com ++failures; 73757837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } 738d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org } while(iter.next(&inputFilename)); 73957837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } else if (SkStrEndsWith(input.c_str(), ".skp")) { 74057837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com if (!run_single_benchmark(input, benchmark)) { 74166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com ++failures; 74257837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } 74357837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com } else { 74457837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com SkString warning; 74557837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com warning.printf("Warning: skipping %s\n", input.c_str()); 74657837bff3db1f8cf22c2147e1bed49cf718f8b39borenet@google.com gLogger.logError(warning); 747d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org } 74866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return failures; 749006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 750006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 7515987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv); 7525987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) { 7535239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com#ifdef SK_ENABLE_INST_COUNT 7545239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com gPrintInstCount = true; 7555239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com#endif 7560a36f43d5f710c47b63bc4bbfde9bbb7d59a88d1scroggo@google.com SkAutoGraphics ag; 7575239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com 758d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org SkTArray<SkString> inputs; 7595239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com sk_tools::PictureBenchmark benchmark; 760006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 7615239c32d1e1515bef20ec2544811c0f6924f0933scroggo@google.com parse_commandline(argc, argv, &inputs, &benchmark); 762006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com 76366bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com int failures = 0; 764d1dc920097194e3342355185528c84408a9929c8keyar@chromium.org for (int i = 0; i < inputs.count(); ++i) { 76566bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com failures += process_input(inputs[i], benchmark); 76666bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com } 76766bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com 76866bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com if (failures != 0) { 76966bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com SkString err; 77066bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com err.printf("Failed to run %i benchmarks.\n", failures); 77166bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com gLogger.logError(err); 77266bcbd12bf075145e0c38f3e36c9f13e65f5e10eborenet@google.com return 1; 773006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com } 774868e1f682eaff0a78ba61b3f1612cc6e7dd9c885caryclark@google.com return 0; 775006db0f1b8d85caea7ac37bc1fca133eca74aac8reed@google.com} 7765987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com 7775987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#if !defined SK_BUILD_FOR_IOS 7785987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) { 7795987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com return tool_main(argc, (char**) argv); 7805987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com} 7815987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif 782