1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommandLineFlags.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <stdio.h> 17*c8dee2aaSAndroid Build Coastguard Worker #include <stdlib.h> 18*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker #define ENABLE_COMMAND_LINE_SHAPES_BENCH 0 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker #if ENABLE_COMMAND_LINE_SHAPES_BENCH 25*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(shapesType, "mixed", 26*c8dee2aaSAndroid Build Coastguard Worker "Type of shape to use in ShapesBench. Must be one of: " 27*c8dee2aaSAndroid Build Coastguard Worker "rect, oval, rrect, mixed."); 28*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(innerShapesType, "none", 29*c8dee2aaSAndroid Build Coastguard Worker "Type of inner shape to use in ShapesBench. Must be one of: " 30*c8dee2aaSAndroid Build Coastguard Worker "none, rect, oval, rrect, mixed."); 31*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_int(numShapes, 10000, "Number of shapes to draw in ShapesBench."); 32*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(shapesSize, "32x32", "Size of shapes to draw in ShapesBench."); 33*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_bool(shapesPersp, false, "Use slight perspective tilt in ShapesBench?"); 34*c8dee2aaSAndroid Build Coastguard Worker #endif 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker /* 37*c8dee2aaSAndroid Build Coastguard Worker * This class is used for several benchmarks that draw different primitive Skia shapes at various 38*c8dee2aaSAndroid Build Coastguard Worker * sizes. It is used to test both CPU-bound and GPU-bound rendering situations. It draws large 39*c8dee2aaSAndroid Build Coastguard Worker * amounts of shapes internally (rather than relying on nanobench selecting lots of loops) in order 40*c8dee2aaSAndroid Build Coastguard Worker * to take advantage of instanced rendering approaches. 41*c8dee2aaSAndroid Build Coastguard Worker */ 42*c8dee2aaSAndroid Build Coastguard Worker class ShapesBench : public Benchmark { 43*c8dee2aaSAndroid Build Coastguard Worker public: 44*c8dee2aaSAndroid Build Coastguard Worker enum ShapesType { 45*c8dee2aaSAndroid Build Coastguard Worker kNone_ShapesType, 46*c8dee2aaSAndroid Build Coastguard Worker kRect_ShapesType, 47*c8dee2aaSAndroid Build Coastguard Worker kOval_ShapesType, 48*c8dee2aaSAndroid Build Coastguard Worker kRRect_ShapesType, 49*c8dee2aaSAndroid Build Coastguard Worker kMixed_ShapesType 50*c8dee2aaSAndroid Build Coastguard Worker }; 51*c8dee2aaSAndroid Build Coastguard Worker ShapesBench(ShapesType shapesType,ShapesType innerShapesType,int numShapes,const SkISize & shapesSize,bool perspective)52*c8dee2aaSAndroid Build Coastguard Worker ShapesBench(ShapesType shapesType, ShapesType innerShapesType, 53*c8dee2aaSAndroid Build Coastguard Worker int numShapes, const SkISize& shapesSize, bool perspective) 54*c8dee2aaSAndroid Build Coastguard Worker : fShapesType(shapesType) 55*c8dee2aaSAndroid Build Coastguard Worker , fInnerShapesType(innerShapesType) 56*c8dee2aaSAndroid Build Coastguard Worker , fNumShapes(numShapes) 57*c8dee2aaSAndroid Build Coastguard Worker , fShapesSize(shapesSize) 58*c8dee2aaSAndroid Build Coastguard Worker , fPerspective(perspective) { 59*c8dee2aaSAndroid Build Coastguard Worker clampShapeSize(); 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker #if ENABLE_COMMAND_LINE_SHAPES_BENCH ShapesBench()63*c8dee2aaSAndroid Build Coastguard Worker ShapesBench() { 64*c8dee2aaSAndroid Build Coastguard Worker if (!strcmp(FLAGS_shapesType[0], "rect")) { 65*c8dee2aaSAndroid Build Coastguard Worker fShapesType = kRect_ShapesType; 66*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_shapesType[0], "oval")) { 67*c8dee2aaSAndroid Build Coastguard Worker fShapesType = kOval_ShapesType; 68*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_shapesType[0], "rrect")) { 69*c8dee2aaSAndroid Build Coastguard Worker fShapesType = kRRect_ShapesType; 70*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_shapesType[0], "mixed")) { 71*c8dee2aaSAndroid Build Coastguard Worker fShapesType = kMixed_ShapesType; 72*c8dee2aaSAndroid Build Coastguard Worker } else { 73*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Invalid shapesType \"%s\". Must be one of: rect, oval, rrect, mixed.", 74*c8dee2aaSAndroid Build Coastguard Worker FLAGS_shapesType[0]); 75*c8dee2aaSAndroid Build Coastguard Worker exit(-1); 76*c8dee2aaSAndroid Build Coastguard Worker } 77*c8dee2aaSAndroid Build Coastguard Worker if (!strcmp(FLAGS_innerShapesType[0], "none")) { 78*c8dee2aaSAndroid Build Coastguard Worker fInnerShapesType = kNone_ShapesType; 79*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_innerShapesType[0], "rect")) { 80*c8dee2aaSAndroid Build Coastguard Worker fInnerShapesType = kRect_ShapesType; 81*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_innerShapesType[0], "oval")) { 82*c8dee2aaSAndroid Build Coastguard Worker fInnerShapesType = kOval_ShapesType; 83*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_innerShapesType[0], "rrect")) { 84*c8dee2aaSAndroid Build Coastguard Worker fInnerShapesType = kRRect_ShapesType; 85*c8dee2aaSAndroid Build Coastguard Worker } else if (!strcmp(FLAGS_innerShapesType[0], "mixed")) { 86*c8dee2aaSAndroid Build Coastguard Worker fInnerShapesType = kMixed_ShapesType; 87*c8dee2aaSAndroid Build Coastguard Worker } else { 88*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Invalid innerShapesType \"%s\". Must be one of: " 89*c8dee2aaSAndroid Build Coastguard Worker "none, rect, oval, rrect, mixed.", FLAGS_innerShapesType[0]); 90*c8dee2aaSAndroid Build Coastguard Worker exit(-1); 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker if (2 != sscanf(FLAGS_shapesSize[0], "%ix%i", &fShapesSize.fWidth, &fShapesSize.fHeight)) { 93*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Could not parse shapesSize from \"%s\". Expected \"%%ix%%i\"\n", 94*c8dee2aaSAndroid Build Coastguard Worker FLAGS_shapesSize[0]); 95*c8dee2aaSAndroid Build Coastguard Worker exit(-1); 96*c8dee2aaSAndroid Build Coastguard Worker } 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker fNumShapes = FLAGS_numShapes; 99*c8dee2aaSAndroid Build Coastguard Worker fPerspective = FLAGS_shapesPersp; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker clampShapeSize(); 102*c8dee2aaSAndroid Build Coastguard Worker } 103*c8dee2aaSAndroid Build Coastguard Worker #endif 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker private: clampShapeSize()106*c8dee2aaSAndroid Build Coastguard Worker void clampShapeSize() { 107*c8dee2aaSAndroid Build Coastguard Worker float maxDiagonal = static_cast<float>(std::min(kBenchWidth, kBenchHeight)); 108*c8dee2aaSAndroid Build Coastguard Worker float diagonal = sqrtf(static_cast<float>(fShapesSize.width() * fShapesSize.width()) + 109*c8dee2aaSAndroid Build Coastguard Worker static_cast<float>(fShapesSize.height() * fShapesSize.height())); 110*c8dee2aaSAndroid Build Coastguard Worker if (diagonal > maxDiagonal) { 111*c8dee2aaSAndroid Build Coastguard Worker fShapesSize.fWidth = static_cast<int>(fShapesSize.width() * maxDiagonal / diagonal); 112*c8dee2aaSAndroid Build Coastguard Worker fShapesSize.fHeight = static_cast<int>(fShapesSize.height() * maxDiagonal / diagonal); 113*c8dee2aaSAndroid Build Coastguard Worker } 114*c8dee2aaSAndroid Build Coastguard Worker } 115*c8dee2aaSAndroid Build Coastguard Worker onGetName()116*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 117*c8dee2aaSAndroid Build Coastguard Worker const char* shapeTypeNames[] = { 118*c8dee2aaSAndroid Build Coastguard Worker "none", "rect", "oval", "rrect", "mixed" 119*c8dee2aaSAndroid Build Coastguard Worker }; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker fName.printf("shapes_%s", shapeTypeNames[fShapesType]); 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker if (kNone_ShapesType != fInnerShapesType) { 124*c8dee2aaSAndroid Build Coastguard Worker fName.appendf("_inner_%s", shapeTypeNames[fInnerShapesType]); 125*c8dee2aaSAndroid Build Coastguard Worker } 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker fName.appendf("_%i_%ix%i", fNumShapes, fShapesSize.width(), fShapesSize.height()); 128*c8dee2aaSAndroid Build Coastguard Worker 129*c8dee2aaSAndroid Build Coastguard Worker if (fPerspective) { 130*c8dee2aaSAndroid Build Coastguard Worker fName.append("_persp"); 131*c8dee2aaSAndroid Build Coastguard Worker } 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 134*c8dee2aaSAndroid Build Coastguard Worker } onGetSize()135*c8dee2aaSAndroid Build Coastguard Worker SkISize onGetSize() override { return SkISize::Make(kBenchWidth, kBenchHeight); } 136*c8dee2aaSAndroid Build Coastguard Worker onDelayedSetup()137*c8dee2aaSAndroid Build Coastguard Worker void onDelayedSetup() override { 138*c8dee2aaSAndroid Build Coastguard Worker SkScalar w = SkIntToScalar(fShapesSize.width()); 139*c8dee2aaSAndroid Build Coastguard Worker SkScalar h = SkIntToScalar(fShapesSize.height()); 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker fRect.setRect(SkRect::MakeXYWH(-w / 2, -h / 2, w, h)); 142*c8dee2aaSAndroid Build Coastguard Worker fOval.setOval(fRect.rect()); 143*c8dee2aaSAndroid Build Coastguard Worker fRRect.setNinePatch(fRect.rect(), w / 8, h / 13, w / 11, h / 7); 144*c8dee2aaSAndroid Build Coastguard Worker 145*c8dee2aaSAndroid Build Coastguard Worker if (kNone_ShapesType != fInnerShapesType) { 146*c8dee2aaSAndroid Build Coastguard Worker fRect.inset(w / 7, h / 11, &fInnerRect); 147*c8dee2aaSAndroid Build Coastguard Worker fInnerRect.offset(w / 28, h / 44); 148*c8dee2aaSAndroid Build Coastguard Worker fInnerOval.setOval(fInnerRect.rect()); 149*c8dee2aaSAndroid Build Coastguard Worker fInnerRRect.setRectXY(fInnerRect.rect(), w / 13, w / 7); 150*c8dee2aaSAndroid Build Coastguard Worker } 151*c8dee2aaSAndroid Build Coastguard Worker 152*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 153*c8dee2aaSAndroid Build Coastguard Worker fShapes.push_back_n(fNumShapes); 154*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fNumShapes; i++) { 155*c8dee2aaSAndroid Build Coastguard Worker float pad = sqrtf(static_cast<float>(fShapesSize.width() * fShapesSize.width()) + 156*c8dee2aaSAndroid Build Coastguard Worker static_cast<float>(fShapesSize.height() * fShapesSize.height())); 157*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fMatrix.setTranslate(0.5f * pad + rand.nextF() * (kBenchWidth - pad), 158*c8dee2aaSAndroid Build Coastguard Worker 0.5f * pad + rand.nextF() * (kBenchHeight - pad)); 159*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fMatrix.preRotate(rand.nextF() * 360.0f); 160*c8dee2aaSAndroid Build Coastguard Worker if (fPerspective) { 161*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fMatrix.setPerspX(0.00015f); 162*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fMatrix.setPerspY(-0.00015f); 163*c8dee2aaSAndroid Build Coastguard Worker } 164*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fColor = rand.nextU() | 0xff808080; 165*c8dee2aaSAndroid Build Coastguard Worker } 166*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fNumShapes; i++) { 167*c8dee2aaSAndroid Build Coastguard Worker // Do this in a separate loop so mixed shapes get the same random numbers during 168*c8dee2aaSAndroid Build Coastguard Worker // placement as non-mixed do. 169*c8dee2aaSAndroid Build Coastguard Worker int shapeType = fShapesType; 170*c8dee2aaSAndroid Build Coastguard Worker if (kMixed_ShapesType == shapeType) { 171*c8dee2aaSAndroid Build Coastguard Worker shapeType = rand.nextRangeU(kRect_ShapesType, kRRect_ShapesType); 172*c8dee2aaSAndroid Build Coastguard Worker } 173*c8dee2aaSAndroid Build Coastguard Worker int innerShapeType = fInnerShapesType; 174*c8dee2aaSAndroid Build Coastguard Worker if (kMixed_ShapesType == innerShapeType) { 175*c8dee2aaSAndroid Build Coastguard Worker innerShapeType = rand.nextRangeU(kRect_ShapesType, kRRect_ShapesType); 176*c8dee2aaSAndroid Build Coastguard Worker } 177*c8dee2aaSAndroid Build Coastguard Worker if (kNone_ShapesType == innerShapeType) { 178*c8dee2aaSAndroid Build Coastguard Worker switch (shapeType) { 179*c8dee2aaSAndroid Build Coastguard Worker using namespace std; 180*c8dee2aaSAndroid Build Coastguard Worker using namespace std::placeholders; 181*c8dee2aaSAndroid Build Coastguard Worker case kRect_ShapesType: 182*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fDraw = bind(&SkCanvas::drawRect, _1, cref(fRect.rect()), _2); 183*c8dee2aaSAndroid Build Coastguard Worker break; 184*c8dee2aaSAndroid Build Coastguard Worker case kOval_ShapesType: 185*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fDraw = bind(&SkCanvas::drawOval, _1, cref(fOval.rect()), _2); 186*c8dee2aaSAndroid Build Coastguard Worker break; 187*c8dee2aaSAndroid Build Coastguard Worker case kRRect_ShapesType: 188*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fDraw = bind(&SkCanvas::drawRRect, _1, cref(fRRect), _2); 189*c8dee2aaSAndroid Build Coastguard Worker break; 190*c8dee2aaSAndroid Build Coastguard Worker } 191*c8dee2aaSAndroid Build Coastguard Worker } else { 192*c8dee2aaSAndroid Build Coastguard Worker const SkRRect* outer = nullptr; 193*c8dee2aaSAndroid Build Coastguard Worker switch (shapeType) { 194*c8dee2aaSAndroid Build Coastguard Worker case kRect_ShapesType: outer = &fRect; break; 195*c8dee2aaSAndroid Build Coastguard Worker case kOval_ShapesType: outer = &fOval; break; 196*c8dee2aaSAndroid Build Coastguard Worker case kRRect_ShapesType: outer = &fRRect; break; 197*c8dee2aaSAndroid Build Coastguard Worker } 198*c8dee2aaSAndroid Build Coastguard Worker const SkRRect* inner = nullptr; 199*c8dee2aaSAndroid Build Coastguard Worker switch (innerShapeType) { 200*c8dee2aaSAndroid Build Coastguard Worker case kRect_ShapesType: inner = &fInnerRect; break; 201*c8dee2aaSAndroid Build Coastguard Worker case kOval_ShapesType: inner = &fInnerOval; break; 202*c8dee2aaSAndroid Build Coastguard Worker case kRRect_ShapesType: inner = &fInnerRRect; break; 203*c8dee2aaSAndroid Build Coastguard Worker } 204*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fDraw = std::bind(&SkCanvas::drawDRRect, std::placeholders::_1, 205*c8dee2aaSAndroid Build Coastguard Worker std::cref(*outer), std::cref(*inner), 206*c8dee2aaSAndroid Build Coastguard Worker std::placeholders::_2); 207*c8dee2aaSAndroid Build Coastguard Worker } 208*c8dee2aaSAndroid Build Coastguard Worker } 209*c8dee2aaSAndroid Build Coastguard Worker } 210*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)211*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 212*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 213*c8dee2aaSAndroid Build Coastguard Worker this->setupPaint(&paint); 214*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < loops; j++) { 215*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fNumShapes; i++) { 216*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 217*c8dee2aaSAndroid Build Coastguard Worker canvas->setMatrix(fShapes[i].fMatrix); 218*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(fShapes[i].fColor); 219*c8dee2aaSAndroid Build Coastguard Worker fShapes[i].fDraw(canvas, paint); 220*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 221*c8dee2aaSAndroid Build Coastguard Worker } 222*c8dee2aaSAndroid Build Coastguard Worker } 223*c8dee2aaSAndroid Build Coastguard Worker } 224*c8dee2aaSAndroid Build Coastguard Worker 225*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kBenchWidth = 1000; 226*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kBenchHeight = 1000; 227*c8dee2aaSAndroid Build Coastguard Worker 228*c8dee2aaSAndroid Build Coastguard Worker struct ShapeInfo { 229*c8dee2aaSAndroid Build Coastguard Worker SkMatrix fMatrix; 230*c8dee2aaSAndroid Build Coastguard Worker SkColor fColor; 231*c8dee2aaSAndroid Build Coastguard Worker std::function<void(SkCanvas*, const SkPaint&)> fDraw; 232*c8dee2aaSAndroid Build Coastguard Worker }; 233*c8dee2aaSAndroid Build Coastguard Worker 234*c8dee2aaSAndroid Build Coastguard Worker ShapesType fShapesType; 235*c8dee2aaSAndroid Build Coastguard Worker ShapesType fInnerShapesType; 236*c8dee2aaSAndroid Build Coastguard Worker int fNumShapes; 237*c8dee2aaSAndroid Build Coastguard Worker SkISize fShapesSize; 238*c8dee2aaSAndroid Build Coastguard Worker bool fPerspective; 239*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 240*c8dee2aaSAndroid Build Coastguard Worker SkRRect fRect; 241*c8dee2aaSAndroid Build Coastguard Worker SkRRect fOval; 242*c8dee2aaSAndroid Build Coastguard Worker SkRRect fRRect; 243*c8dee2aaSAndroid Build Coastguard Worker SkRRect fInnerRect; 244*c8dee2aaSAndroid Build Coastguard Worker SkRRect fInnerOval; 245*c8dee2aaSAndroid Build Coastguard Worker SkRRect fInnerRRect; 246*c8dee2aaSAndroid Build Coastguard Worker TArray<ShapeInfo> fShapes; 247*c8dee2aaSAndroid Build Coastguard Worker 248*c8dee2aaSAndroid Build Coastguard Worker 249*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 250*c8dee2aaSAndroid Build Coastguard Worker }; 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker #if ENABLE_COMMAND_LINE_SHAPES_BENCH 253*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench;) 254*c8dee2aaSAndroid Build Coastguard Worker #else 255*c8dee2aaSAndroid Build Coastguard Worker // Small primitives (CPU bound, in theory): 256*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRect_ShapesType, ShapesBench::kNone_ShapesType, 257*c8dee2aaSAndroid Build Coastguard Worker 10000, SkISize::Make(32, 32), false);) 258*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kOval_ShapesType, ShapesBench::kNone_ShapesType, 259*c8dee2aaSAndroid Build Coastguard Worker 10000, SkISize::Make(32, 32), false);) 260*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kOval_ShapesType, ShapesBench::kNone_ShapesType, 261*c8dee2aaSAndroid Build Coastguard Worker 10000, SkISize::Make(32, 33), false);) 262*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRRect_ShapesType, ShapesBench::kNone_ShapesType, 263*c8dee2aaSAndroid Build Coastguard Worker 10000, SkISize::Make(32, 32), false);) 264*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kMixed_ShapesType, ShapesBench::kNone_ShapesType, 265*c8dee2aaSAndroid Build Coastguard Worker 10000, SkISize::Make(32, 33), false);) 266*c8dee2aaSAndroid Build Coastguard Worker 267*c8dee2aaSAndroid Build Coastguard Worker // Large primitives (GPU bound, in theory): 268*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRect_ShapesType, ShapesBench::kNone_ShapesType, 269*c8dee2aaSAndroid Build Coastguard Worker 100, SkISize::Make(500, 500), false);) 270*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kOval_ShapesType, ShapesBench::kNone_ShapesType, 271*c8dee2aaSAndroid Build Coastguard Worker 100, SkISize::Make(500, 500), false);) 272*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kOval_ShapesType, ShapesBench::kNone_ShapesType, 273*c8dee2aaSAndroid Build Coastguard Worker 100, SkISize::Make(500, 501), false);) 274*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRRect_ShapesType, ShapesBench::kNone_ShapesType, 275*c8dee2aaSAndroid Build Coastguard Worker 100, SkISize::Make(500, 500), false);) 276*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kMixed_ShapesType, ShapesBench::kNone_ShapesType, 277*c8dee2aaSAndroid Build Coastguard Worker 100, SkISize::Make(500, 501), false);) 278*c8dee2aaSAndroid Build Coastguard Worker 279*c8dee2aaSAndroid Build Coastguard Worker // Donuts (small and large). These fall-back to path rendering due to non-orthogonal rotation 280*c8dee2aaSAndroid Build Coastguard Worker // making them quite slow. Thus, reduce the counts substantially: 281*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRect_ShapesType, ShapesBench::kRect_ShapesType, 282*c8dee2aaSAndroid Build Coastguard Worker 500, SkISize::Make(32, 32), false);) 283*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRRect_ShapesType, ShapesBench::kRRect_ShapesType, 284*c8dee2aaSAndroid Build Coastguard Worker 500, SkISize::Make(32, 32), false);) 285*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRect_ShapesType, ShapesBench::kRect_ShapesType, 286*c8dee2aaSAndroid Build Coastguard Worker 50, SkISize::Make(500, 500), false);) 287*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new ShapesBench(ShapesBench::kRRect_ShapesType, ShapesBench::kRRect_ShapesType, 288*c8dee2aaSAndroid Build Coastguard Worker 50, SkISize::Make(500, 500), false);) 289*c8dee2aaSAndroid Build Coastguard Worker #endif 290