xref: /aosp_15_r20/external/skia/bench/ShapesBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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