xref: /aosp_15_r20/external/skia/bench/PatchBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2014 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 #include "bench/Benchmark.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkVertices.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkPatchUtils.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker /**
17*c8dee2aaSAndroid Build Coastguard Worker  * This bench measures the rendering time of the call SkCanvas::drawPatch with different types of
18*c8dee2aaSAndroid Build Coastguard Worker  * input patches (regular case, with loops, a square, with a big difference between "parallel"
19*c8dee2aaSAndroid Build Coastguard Worker  * sides). This bench also tests the different combination of optional parameters for the function
20*c8dee2aaSAndroid Build Coastguard Worker  * (passing texture coordinates and colors, only textures coordinates, only colors or none).
21*c8dee2aaSAndroid Build Coastguard Worker  * Finally, it applies a scale to test if the size affects the rendering time.
22*c8dee2aaSAndroid Build Coastguard Worker  */
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker class PatchBench : public Benchmark {
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker public:
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker     enum VertexMode {
29*c8dee2aaSAndroid Build Coastguard Worker         kNone_VertexMode,
30*c8dee2aaSAndroid Build Coastguard Worker         kColors_VertexMode,
31*c8dee2aaSAndroid Build Coastguard Worker         kTexCoords_VertexMode,
32*c8dee2aaSAndroid Build Coastguard Worker         kBoth_VertexMode
33*c8dee2aaSAndroid Build Coastguard Worker     };
34*c8dee2aaSAndroid Build Coastguard Worker 
PatchBench(SkPoint scale,VertexMode vertexMode)35*c8dee2aaSAndroid Build Coastguard Worker     PatchBench(SkPoint scale, VertexMode vertexMode)
36*c8dee2aaSAndroid Build Coastguard Worker     : fScale(scale)
37*c8dee2aaSAndroid Build Coastguard Worker     , fVertexMode(vertexMode) { }
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker     // to add name of specific class override this method
appendName(SkString * name)40*c8dee2aaSAndroid Build Coastguard Worker     virtual void appendName(SkString* name) {
41*c8dee2aaSAndroid Build Coastguard Worker         name->append("normal");
42*c8dee2aaSAndroid Build Coastguard Worker     }
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     // to make other type of patches override this method
setCubics()45*c8dee2aaSAndroid Build Coastguard Worker     virtual void setCubics() {
46*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
47*c8dee2aaSAndroid Build Coastguard Worker             //top points
48*c8dee2aaSAndroid Build Coastguard Worker             {100,100},{150,50},{250,150}, {300,100},
49*c8dee2aaSAndroid Build Coastguard Worker             //right points
50*c8dee2aaSAndroid Build Coastguard Worker             {350, 150},{250,200},
51*c8dee2aaSAndroid Build Coastguard Worker             //bottom points
52*c8dee2aaSAndroid Build Coastguard Worker             {300,300},{250,250},{150,350},{100,300},
53*c8dee2aaSAndroid Build Coastguard Worker             //left points
54*c8dee2aaSAndroid Build Coastguard Worker             {50,250},{150,50}
55*c8dee2aaSAndroid Build Coastguard Worker         };
56*c8dee2aaSAndroid Build Coastguard Worker         memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
57*c8dee2aaSAndroid Build Coastguard Worker     }
58*c8dee2aaSAndroid Build Coastguard Worker 
setColors()59*c8dee2aaSAndroid Build Coastguard Worker     virtual void setColors() {
60*c8dee2aaSAndroid Build Coastguard Worker         const SkColor colors[SkPatchUtils::kNumCorners] = {
61*c8dee2aaSAndroid Build Coastguard Worker             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
62*c8dee2aaSAndroid Build Coastguard Worker         };
63*c8dee2aaSAndroid Build Coastguard Worker         memcpy(fColors, colors, SkPatchUtils::kNumCorners * sizeof(SkColor));
64*c8dee2aaSAndroid Build Coastguard Worker     }
65*c8dee2aaSAndroid Build Coastguard Worker 
setTexCoords()66*c8dee2aaSAndroid Build Coastguard Worker     virtual void setTexCoords() {
67*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
68*c8dee2aaSAndroid Build Coastguard Worker             {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f,1.0f}, {0.0f, 1.0f}
69*c8dee2aaSAndroid Build Coastguard Worker         };
70*c8dee2aaSAndroid Build Coastguard Worker         memcpy(fTexCoords, texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint));
71*c8dee2aaSAndroid Build Coastguard Worker     }
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     // override this method to change the shader
createShader()74*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkShader> createShader() {
75*c8dee2aaSAndroid Build Coastguard Worker         const SkColor colors[] = {
76*c8dee2aaSAndroid Build Coastguard Worker             SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE,
77*c8dee2aaSAndroid Build Coastguard Worker             SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW,
78*c8dee2aaSAndroid Build Coastguard Worker         };
79*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } };
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker         return SkGradientShader::MakeLinear(pts, colors, nullptr, std::size(colors),
82*c8dee2aaSAndroid Build Coastguard Worker                                             SkTileMode::kMirror);
83*c8dee2aaSAndroid Build Coastguard Worker     }
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker protected:
onGetName()86*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override {
87*c8dee2aaSAndroid Build Coastguard Worker         SkString vertexMode;
88*c8dee2aaSAndroid Build Coastguard Worker         switch (fVertexMode) {
89*c8dee2aaSAndroid Build Coastguard Worker             case kNone_VertexMode:
90*c8dee2aaSAndroid Build Coastguard Worker                 vertexMode.set("meshlines");
91*c8dee2aaSAndroid Build Coastguard Worker                 break;
92*c8dee2aaSAndroid Build Coastguard Worker             case kColors_VertexMode:
93*c8dee2aaSAndroid Build Coastguard Worker                 vertexMode.set("colors");
94*c8dee2aaSAndroid Build Coastguard Worker                 break;
95*c8dee2aaSAndroid Build Coastguard Worker             case kTexCoords_VertexMode:
96*c8dee2aaSAndroid Build Coastguard Worker                 vertexMode.set("texs");
97*c8dee2aaSAndroid Build Coastguard Worker                 break;
98*c8dee2aaSAndroid Build Coastguard Worker             case kBoth_VertexMode:
99*c8dee2aaSAndroid Build Coastguard Worker                 vertexMode.set("colors_texs");
100*c8dee2aaSAndroid Build Coastguard Worker                 break;
101*c8dee2aaSAndroid Build Coastguard Worker             default:
102*c8dee2aaSAndroid Build Coastguard Worker                 break;
103*c8dee2aaSAndroid Build Coastguard Worker         }
104*c8dee2aaSAndroid Build Coastguard Worker         SkString type;
105*c8dee2aaSAndroid Build Coastguard Worker         this->appendName(&type);
106*c8dee2aaSAndroid Build Coastguard Worker         fName.printf("patch_%s_%s_%fx%f", type.c_str(), vertexMode.c_str(),
107*c8dee2aaSAndroid Build Coastguard Worker                     fScale.x(), fScale.y());
108*c8dee2aaSAndroid Build Coastguard Worker         return fName.c_str();
109*c8dee2aaSAndroid Build Coastguard Worker     }
110*c8dee2aaSAndroid Build Coastguard Worker 
onDelayedSetup()111*c8dee2aaSAndroid Build Coastguard Worker     void onDelayedSetup() override {
112*c8dee2aaSAndroid Build Coastguard Worker         this->setCubics();
113*c8dee2aaSAndroid Build Coastguard Worker         this->setColors();
114*c8dee2aaSAndroid Build Coastguard Worker         this->setTexCoords();
115*c8dee2aaSAndroid Build Coastguard Worker         this->setupPaint(&fPaint);
116*c8dee2aaSAndroid Build Coastguard Worker         switch (fVertexMode) {
117*c8dee2aaSAndroid Build Coastguard Worker             case kTexCoords_VertexMode:
118*c8dee2aaSAndroid Build Coastguard Worker             case kBoth_VertexMode:
119*c8dee2aaSAndroid Build Coastguard Worker                 fPaint.setShader(this->createShader());
120*c8dee2aaSAndroid Build Coastguard Worker                 break;
121*c8dee2aaSAndroid Build Coastguard Worker             default:
122*c8dee2aaSAndroid Build Coastguard Worker                 fPaint.setShader(nullptr);
123*c8dee2aaSAndroid Build Coastguard Worker                 break;
124*c8dee2aaSAndroid Build Coastguard Worker         }
125*c8dee2aaSAndroid Build Coastguard Worker     }
126*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(int loops,SkCanvas * canvas)127*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(int loops, SkCanvas* canvas) override {
128*c8dee2aaSAndroid Build Coastguard Worker         canvas->scale(fScale.x(), fScale.y());
129*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < loops; i++) {
130*c8dee2aaSAndroid Build Coastguard Worker             switch (fVertexMode) {
131*c8dee2aaSAndroid Build Coastguard Worker                 case kNone_VertexMode:
132*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawPatch(fCubics, nullptr, nullptr, SkBlendMode::kModulate, fPaint);
133*c8dee2aaSAndroid Build Coastguard Worker                     break;
134*c8dee2aaSAndroid Build Coastguard Worker                 case kColors_VertexMode:
135*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawPatch(fCubics, fColors, nullptr, SkBlendMode::kModulate, fPaint);
136*c8dee2aaSAndroid Build Coastguard Worker                     break;
137*c8dee2aaSAndroid Build Coastguard Worker                 case kTexCoords_VertexMode:
138*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawPatch(fCubics, nullptr, fTexCoords, SkBlendMode::kModulate, fPaint);
139*c8dee2aaSAndroid Build Coastguard Worker                     break;
140*c8dee2aaSAndroid Build Coastguard Worker                 case kBoth_VertexMode:
141*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawPatch(fCubics, fColors, fTexCoords, SkBlendMode::kModulate, fPaint);
142*c8dee2aaSAndroid Build Coastguard Worker                     break;
143*c8dee2aaSAndroid Build Coastguard Worker                 default:
144*c8dee2aaSAndroid Build Coastguard Worker                     break;
145*c8dee2aaSAndroid Build Coastguard Worker             }
146*c8dee2aaSAndroid Build Coastguard Worker         }
147*c8dee2aaSAndroid Build Coastguard Worker     }
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     SkPaint     fPaint;
150*c8dee2aaSAndroid Build Coastguard Worker     SkString    fName;
151*c8dee2aaSAndroid Build Coastguard Worker     SkVector    fScale;
152*c8dee2aaSAndroid Build Coastguard Worker     SkPoint     fCubics[12];
153*c8dee2aaSAndroid Build Coastguard Worker     SkPoint     fTexCoords[4];
154*c8dee2aaSAndroid Build Coastguard Worker     SkColor     fColors[4];
155*c8dee2aaSAndroid Build Coastguard Worker     VertexMode  fVertexMode;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = Benchmark;
158*c8dee2aaSAndroid Build Coastguard Worker };
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker class SquarePatchBench : public PatchBench {
161*c8dee2aaSAndroid Build Coastguard Worker public:
SquarePatchBench(SkPoint scale,VertexMode vertexMode)162*c8dee2aaSAndroid Build Coastguard Worker     SquarePatchBench(SkPoint scale, VertexMode vertexMode)
163*c8dee2aaSAndroid Build Coastguard Worker     : INHERITED(scale, vertexMode) { }
164*c8dee2aaSAndroid Build Coastguard Worker 
appendName(SkString * name)165*c8dee2aaSAndroid Build Coastguard Worker     void appendName(SkString* name) override {
166*c8dee2aaSAndroid Build Coastguard Worker         name->append("square");
167*c8dee2aaSAndroid Build Coastguard Worker     }
168*c8dee2aaSAndroid Build Coastguard Worker 
setCubics()169*c8dee2aaSAndroid Build Coastguard Worker     void setCubics() override {
170*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
171*c8dee2aaSAndroid Build Coastguard Worker             //top points
172*c8dee2aaSAndroid Build Coastguard Worker             {100,100},{150,100},{250,100}, {300,100},
173*c8dee2aaSAndroid Build Coastguard Worker             //right points
174*c8dee2aaSAndroid Build Coastguard Worker             {300, 150},{300,250},
175*c8dee2aaSAndroid Build Coastguard Worker             //bottom points
176*c8dee2aaSAndroid Build Coastguard Worker             {300,300},{250,300},{150,300},{100,300},
177*c8dee2aaSAndroid Build Coastguard Worker             //left points
178*c8dee2aaSAndroid Build Coastguard Worker             {100,250},{100,150}
179*c8dee2aaSAndroid Build Coastguard Worker         };
180*c8dee2aaSAndroid Build Coastguard Worker         memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
181*c8dee2aaSAndroid Build Coastguard Worker     }
182*c8dee2aaSAndroid Build Coastguard Worker private:
183*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = PatchBench;
184*c8dee2aaSAndroid Build Coastguard Worker };
185*c8dee2aaSAndroid Build Coastguard Worker 
186*c8dee2aaSAndroid Build Coastguard Worker class LODDiffPatchBench : public PatchBench {
187*c8dee2aaSAndroid Build Coastguard Worker public:
LODDiffPatchBench(SkPoint scale,VertexMode vertexMode)188*c8dee2aaSAndroid Build Coastguard Worker     LODDiffPatchBench(SkPoint scale, VertexMode vertexMode)
189*c8dee2aaSAndroid Build Coastguard Worker     : INHERITED(scale, vertexMode) { }
190*c8dee2aaSAndroid Build Coastguard Worker 
appendName(SkString * name)191*c8dee2aaSAndroid Build Coastguard Worker     void appendName(SkString* name) override {
192*c8dee2aaSAndroid Build Coastguard Worker         name->append("LOD_Diff");
193*c8dee2aaSAndroid Build Coastguard Worker     }
194*c8dee2aaSAndroid Build Coastguard Worker 
setCubics()195*c8dee2aaSAndroid Build Coastguard Worker     void setCubics() override {
196*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
197*c8dee2aaSAndroid Build Coastguard Worker             //top points
198*c8dee2aaSAndroid Build Coastguard Worker             {100,175},{150,100},{250,100}, {300,0},
199*c8dee2aaSAndroid Build Coastguard Worker             //right points
200*c8dee2aaSAndroid Build Coastguard Worker             {300, 150},{300,250},
201*c8dee2aaSAndroid Build Coastguard Worker             //bottom points
202*c8dee2aaSAndroid Build Coastguard Worker             {300,400},{250,300},{150,300},{100,225},
203*c8dee2aaSAndroid Build Coastguard Worker             //left points
204*c8dee2aaSAndroid Build Coastguard Worker             {100,215},{100,185}
205*c8dee2aaSAndroid Build Coastguard Worker         };
206*c8dee2aaSAndroid Build Coastguard Worker         memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
207*c8dee2aaSAndroid Build Coastguard Worker     }
208*c8dee2aaSAndroid Build Coastguard Worker private:
209*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = PatchBench;
210*c8dee2aaSAndroid Build Coastguard Worker };
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker class LoopPatchBench : public PatchBench {
213*c8dee2aaSAndroid Build Coastguard Worker public:
LoopPatchBench(SkPoint scale,VertexMode vertexMode)214*c8dee2aaSAndroid Build Coastguard Worker     LoopPatchBench(SkPoint scale, VertexMode vertexMode)
215*c8dee2aaSAndroid Build Coastguard Worker     : INHERITED(scale, vertexMode) { }
216*c8dee2aaSAndroid Build Coastguard Worker 
appendName(SkString * name)217*c8dee2aaSAndroid Build Coastguard Worker     void appendName(SkString* name) override {
218*c8dee2aaSAndroid Build Coastguard Worker         name->append("loop");
219*c8dee2aaSAndroid Build Coastguard Worker     }
220*c8dee2aaSAndroid Build Coastguard Worker 
setCubics()221*c8dee2aaSAndroid Build Coastguard Worker     void setCubics() override {
222*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
223*c8dee2aaSAndroid Build Coastguard Worker             //top points
224*c8dee2aaSAndroid Build Coastguard Worker             {100,100},{300,200},{100,200}, {300,100},
225*c8dee2aaSAndroid Build Coastguard Worker             //right points
226*c8dee2aaSAndroid Build Coastguard Worker             {380, 400},{380,0},
227*c8dee2aaSAndroid Build Coastguard Worker             //bottom points
228*c8dee2aaSAndroid Build Coastguard Worker             {300,300},{250,250},{30,200},{100,300},
229*c8dee2aaSAndroid Build Coastguard Worker             //left points
230*c8dee2aaSAndroid Build Coastguard Worker             {140,325},{150,150}
231*c8dee2aaSAndroid Build Coastguard Worker         };
232*c8dee2aaSAndroid Build Coastguard Worker         memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
233*c8dee2aaSAndroid Build Coastguard Worker     }
234*c8dee2aaSAndroid Build Coastguard Worker private:
235*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = PatchBench;
236*c8dee2aaSAndroid Build Coastguard Worker };
237*c8dee2aaSAndroid Build Coastguard Worker 
238*c8dee2aaSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
239*c8dee2aaSAndroid Build Coastguard Worker 
240*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kNone_VertexMode); )
241*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kColors_VertexMode); )
242*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kTexCoords_VertexMode); )
243*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kBoth_VertexMode); )
244*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.f, 1.0f), PatchBench::kNone_VertexMode); )
245*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kColors_VertexMode); )
246*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kTexCoords_VertexMode); )
247*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kBoth_VertexMode); )
248*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kNone_VertexMode); )
249*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kColors_VertexMode); )
250*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kTexCoords_VertexMode); )
251*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kBoth_VertexMode); )
252*c8dee2aaSAndroid Build Coastguard Worker 
253*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
254*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kNone_VertexMode); )
255*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
256*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kColors_VertexMode); )
257*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
258*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kTexCoords_VertexMode); )
259*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
260*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kBoth_VertexMode); )
261*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.f, 1.0f),
262*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kNone_VertexMode); )
263*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f),
264*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kColors_VertexMode); )
265*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f),
266*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kTexCoords_VertexMode); )
267*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f),
268*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kBoth_VertexMode); )
269*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
270*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kNone_VertexMode); )
271*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
272*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kColors_VertexMode); )
273*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
274*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kTexCoords_VertexMode); )
275*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
276*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kBoth_VertexMode); )
277*c8dee2aaSAndroid Build Coastguard Worker 
278*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
279*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kNone_VertexMode); )
280*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
281*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kColors_VertexMode); )
282*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
283*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kTexCoords_VertexMode); )
284*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
285*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kBoth_VertexMode); )
286*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.f, 1.0f),
287*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kNone_VertexMode); )
288*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f),
289*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kColors_VertexMode); )
290*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f),
291*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kTexCoords_VertexMode); )
292*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f),
293*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kBoth_VertexMode); )
294*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
295*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kNone_VertexMode); )
296*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
297*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kColors_VertexMode); )
298*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
299*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kTexCoords_VertexMode); )
300*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
301*c8dee2aaSAndroid Build Coastguard Worker                                        PatchBench::kBoth_VertexMode); )
302*c8dee2aaSAndroid Build Coastguard Worker 
303*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
304*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kNone_VertexMode); )
305*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
306*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kColors_VertexMode); )
307*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
308*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kTexCoords_VertexMode); )
309*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
310*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kBoth_VertexMode); )
311*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.f, 1.0f),
312*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kNone_VertexMode); )
313*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f),
314*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kColors_VertexMode); )
315*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f),
316*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kTexCoords_VertexMode); )
317*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f),
318*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kBoth_VertexMode); )
319*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
320*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kNone_VertexMode); )
321*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
322*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kColors_VertexMode); )
323*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
324*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kTexCoords_VertexMode); )
325*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
326*c8dee2aaSAndroid Build Coastguard Worker                                         PatchBench::kBoth_VertexMode); )
327*c8dee2aaSAndroid Build Coastguard Worker 
328*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////
329*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkPatchUtils.h"
330*c8dee2aaSAndroid Build Coastguard Worker 
331*c8dee2aaSAndroid Build Coastguard Worker class PatchUtilsBench : public Benchmark {
332*c8dee2aaSAndroid Build Coastguard Worker     SkString    fName;
333*c8dee2aaSAndroid Build Coastguard Worker     const bool  fLinearInterp;
334*c8dee2aaSAndroid Build Coastguard Worker public:
PatchUtilsBench(bool linearInterp)335*c8dee2aaSAndroid Build Coastguard Worker     PatchUtilsBench(bool linearInterp) : fLinearInterp(linearInterp) {
336*c8dee2aaSAndroid Build Coastguard Worker         fName.printf("patchutils_%s", linearInterp ? "linear" : "legacy");
337*c8dee2aaSAndroid Build Coastguard Worker     }
338*c8dee2aaSAndroid Build Coastguard Worker 
onGetName()339*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override { return fName.c_str(); }
340*c8dee2aaSAndroid Build Coastguard Worker 
isSuitableFor(Backend backend)341*c8dee2aaSAndroid Build Coastguard Worker     bool isSuitableFor(Backend backend) override {
342*c8dee2aaSAndroid Build Coastguard Worker         return backend == Backend::kNonRendering;
343*c8dee2aaSAndroid Build Coastguard Worker     }
344*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(int loops,SkCanvas *)345*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(int loops, SkCanvas*) override {
346*c8dee2aaSAndroid Build Coastguard Worker         const SkColor colors[] = { 0xFF000000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 };
347*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint pts[] = {
348*c8dee2aaSAndroid Build Coastguard Worker             { 0, 0 }, { 10, 0 }, { 20, 0 }, { 30, 0 },
349*c8dee2aaSAndroid Build Coastguard Worker             { 30,10}, { 30,20 }, { 30,30 }, { 20,30 },
350*c8dee2aaSAndroid Build Coastguard Worker             { 10,30}, { 0, 30 }, { 0, 20 }, { 0, 10 },
351*c8dee2aaSAndroid Build Coastguard Worker         };
352*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint tex[] = {
353*c8dee2aaSAndroid Build Coastguard Worker             { 0, 0 }, { 10, 0 }, { 10, 10 }, { 0, 10 },
354*c8dee2aaSAndroid Build Coastguard Worker         };
355*c8dee2aaSAndroid Build Coastguard Worker 
356*c8dee2aaSAndroid Build Coastguard Worker         auto cs = fLinearInterp ? SkColorSpace::MakeSRGBLinear() : nullptr;
357*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < 100*loops; ++i) {
358*c8dee2aaSAndroid Build Coastguard Worker             SkPatchUtils::MakeVertices(pts, colors, tex, 20, 20, cs.get());
359*c8dee2aaSAndroid Build Coastguard Worker         }
360*c8dee2aaSAndroid Build Coastguard Worker     }
361*c8dee2aaSAndroid Build Coastguard Worker };
362*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchUtilsBench(false); )
363*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchUtilsBench(true); )
364