blob: 7254fa75689ac62bce5282356a4ad952d761ba15 [file] [log] [blame]
dandovb3c9d1c2014-08-12 08:34:29 -07001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
Mike Kleinc0bd9f92019-04-23 12:05:21 -05007#include "bench/Benchmark.h"
8#include "include/core/SkCanvas.h"
9#include "include/core/SkPaint.h"
10#include "include/core/SkString.h"
Brian Osmanf5ecf512020-04-01 09:29:13 -040011#include "include/core/SkVertices.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/effects/SkGradientShader.h"
13#include "src/utils/SkPatchUtils.h"
dandov7e5598a2014-08-15 13:30:47 -070014
15/**
halcanary9d524f22016-03-29 09:03:52 -070016 * This bench measures the rendering time of the call SkCanvas::drawPatch with different types of
17 * input patches (regular case, with loops, a square, with a big difference between "parallel"
18 * sides). This bench also tests the different combination of optional parameters for the function
dandov7e5598a2014-08-15 13:30:47 -070019 * (passing texture coordinates and colors, only textures coordinates, only colors or none).
halcanary9d524f22016-03-29 09:03:52 -070020 * Finally, it applies a scale to test if the size affects the rendering time.
dandov7e5598a2014-08-15 13:30:47 -070021 */
dandovb3c9d1c2014-08-12 08:34:29 -070022
23class PatchBench : public Benchmark {
mtkleine556be72014-08-13 10:41:16 -070024
dandovb3c9d1c2014-08-12 08:34:29 -070025public:
mtkleine556be72014-08-13 10:41:16 -070026
dandovb3c9d1c2014-08-12 08:34:29 -070027 enum VertexMode {
28 kNone_VertexMode,
29 kColors_VertexMode,
30 kTexCoords_VertexMode,
31 kBoth_VertexMode
32 };
mtkleine556be72014-08-13 10:41:16 -070033
dandovb3c9d1c2014-08-12 08:34:29 -070034 PatchBench(SkPoint scale, VertexMode vertexMode)
35 : fScale(scale)
36 , fVertexMode(vertexMode) { }
37
38 // to add name of specific class override this method
39 virtual void appendName(SkString* name) {
40 name->append("normal");
41 }
mtkleine556be72014-08-13 10:41:16 -070042
dandovb3c9d1c2014-08-12 08:34:29 -070043 // to make other type of patches override this method
44 virtual void setCubics() {
45 const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
46 //top points
47 {100,100},{150,50},{250,150}, {300,100},
48 //right points
49 {350, 150},{250,200},
50 //bottom points
51 {300,300},{250,250},{150,350},{100,300},
52 //left points
53 {50,250},{150,50}
54 };
55 memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
56 }
mtkleine556be72014-08-13 10:41:16 -070057
dandovb3c9d1c2014-08-12 08:34:29 -070058 virtual void setColors() {
59 const SkColor colors[SkPatchUtils::kNumCorners] = {
60 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
61 };
62 memcpy(fColors, colors, SkPatchUtils::kNumCorners * sizeof(SkColor));
63 }
mtkleine556be72014-08-13 10:41:16 -070064
dandovb3c9d1c2014-08-12 08:34:29 -070065 virtual void setTexCoords() {
66 const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
67 {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f,1.0f}, {0.0f, 1.0f}
68 };
69 memcpy(fTexCoords, texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint));
70 }
mtkleine556be72014-08-13 10:41:16 -070071
dandovb3c9d1c2014-08-12 08:34:29 -070072 // override this method to change the shader
reedc6f28f72016-03-14 12:22:10 -070073 virtual sk_sp<SkShader> createShader() {
dandovb3c9d1c2014-08-12 08:34:29 -070074 const SkColor colors[] = {
75 SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE,
76 SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW,
77 };
78 const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } };
mtkleine556be72014-08-13 10:41:16 -070079
reedc6f28f72016-03-14 12:22:10 -070080 return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
Mike Reedfae8fce2019-04-03 10:27:45 -040081 SkTileMode::kMirror);
dandovb3c9d1c2014-08-12 08:34:29 -070082 }
83
84protected:
mtklein36352bf2015-03-25 18:17:31 -070085 const char* onGetName() override {
dandovb3c9d1c2014-08-12 08:34:29 -070086 SkString vertexMode;
87 switch (fVertexMode) {
88 case kNone_VertexMode:
89 vertexMode.set("meshlines");
90 break;
91 case kColors_VertexMode:
92 vertexMode.set("colors");
93 break;
94 case kTexCoords_VertexMode:
95 vertexMode.set("texs");
96 break;
97 case kBoth_VertexMode:
dandov7e5598a2014-08-15 13:30:47 -070098 vertexMode.set("colors_texs");
dandovb3c9d1c2014-08-12 08:34:29 -070099 break;
100 default:
101 break;
102 }
103 SkString type;
104 this->appendName(&type);
jcgregorio1703bd12016-08-29 13:33:04 -0700105 fName.printf("patch_%s_%s_%fx%f", type.c_str(), vertexMode.c_str(),
dandovb3c9d1c2014-08-12 08:34:29 -0700106 fScale.x(), fScale.y());
107 return fName.c_str();
108 }
mtkleine556be72014-08-13 10:41:16 -0700109
joshualitt8a6697a2015-09-30 12:11:07 -0700110 void onDelayedSetup() override {
dandovb3c9d1c2014-08-12 08:34:29 -0700111 this->setCubics();
112 this->setColors();
113 this->setTexCoords();
114 this->setupPaint(&fPaint);
115 switch (fVertexMode) {
116 case kTexCoords_VertexMode:
117 case kBoth_VertexMode:
reedc6f28f72016-03-14 12:22:10 -0700118 fPaint.setShader(this->createShader());
dandovb3c9d1c2014-08-12 08:34:29 -0700119 break;
120 default:
halcanary96fcdcc2015-08-27 07:41:13 -0700121 fPaint.setShader(nullptr);
dandovb3c9d1c2014-08-12 08:34:29 -0700122 break;
123 }
dandov7e5598a2014-08-15 13:30:47 -0700124 }
mtkleine556be72014-08-13 10:41:16 -0700125
mtkleina1ebeb22015-10-01 09:43:39 -0700126 void onDraw(int loops, SkCanvas* canvas) override {
dandovb3c9d1c2014-08-12 08:34:29 -0700127 canvas->scale(fScale.x(), fScale.y());
128 for (int i = 0; i < loops; i++) {
129 switch (fVertexMode) {
130 case kNone_VertexMode:
Mike Reed7d954ad2016-10-28 15:42:34 -0400131 canvas->drawPatch(fCubics, nullptr, nullptr, fPaint);
dandovb3c9d1c2014-08-12 08:34:29 -0700132 break;
133 case kColors_VertexMode:
Mike Reed7d954ad2016-10-28 15:42:34 -0400134 canvas->drawPatch(fCubics, fColors, nullptr, fPaint);
dandovb3c9d1c2014-08-12 08:34:29 -0700135 break;
136 case kTexCoords_VertexMode:
Mike Reed7d954ad2016-10-28 15:42:34 -0400137 canvas->drawPatch(fCubics, nullptr, fTexCoords, fPaint);
dandovb3c9d1c2014-08-12 08:34:29 -0700138 break;
139 case kBoth_VertexMode:
Mike Reed7d954ad2016-10-28 15:42:34 -0400140 canvas->drawPatch(fCubics, fColors, fTexCoords, fPaint);
dandovb3c9d1c2014-08-12 08:34:29 -0700141 break;
142 default:
143 break;
144 }
145 }
146 }
147
148 SkPaint fPaint;
149 SkString fName;
150 SkVector fScale;
151 SkPoint fCubics[12];
152 SkPoint fTexCoords[4];
153 SkColor fColors[4];
154 VertexMode fVertexMode;
mtkleine556be72014-08-13 10:41:16 -0700155
dandovb3c9d1c2014-08-12 08:34:29 -0700156 typedef Benchmark INHERITED;
157};
158
159class SquarePatchBench : public PatchBench {
160public:
161 SquarePatchBench(SkPoint scale, VertexMode vertexMode)
162 : INHERITED(scale, vertexMode) { }
163
mtklein36352bf2015-03-25 18:17:31 -0700164 void appendName(SkString* name) override {
dandovb3c9d1c2014-08-12 08:34:29 -0700165 name->append("square");
166 }
mtkleine556be72014-08-13 10:41:16 -0700167
mtklein36352bf2015-03-25 18:17:31 -0700168 void setCubics() override {
dandovb3c9d1c2014-08-12 08:34:29 -0700169 const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
170 //top points
171 {100,100},{150,100},{250,100}, {300,100},
172 //right points
173 {300, 150},{300,250},
174 //bottom points
175 {300,300},{250,300},{150,300},{100,300},
176 //left points
177 {100,250},{100,150}
178 };
179 memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
180 }
181private:
182 typedef PatchBench INHERITED;
183};
184
185class LODDiffPatchBench : public PatchBench {
186public:
187 LODDiffPatchBench(SkPoint scale, VertexMode vertexMode)
188 : INHERITED(scale, vertexMode) { }
mtkleine556be72014-08-13 10:41:16 -0700189
mtklein36352bf2015-03-25 18:17:31 -0700190 void appendName(SkString* name) override {
dandovb3c9d1c2014-08-12 08:34:29 -0700191 name->append("LOD_Diff");
192 }
mtkleine556be72014-08-13 10:41:16 -0700193
mtklein36352bf2015-03-25 18:17:31 -0700194 void setCubics() override {
dandovb3c9d1c2014-08-12 08:34:29 -0700195 const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
196 //top points
197 {100,175},{150,100},{250,100}, {300,0},
198 //right points
199 {300, 150},{300,250},
200 //bottom points
201 {300,400},{250,300},{150,300},{100,225},
202 //left points
203 {100,215},{100,185}
204 };
205 memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
206 }
207private:
208 typedef PatchBench INHERITED;
209};
210
211class LoopPatchBench : public PatchBench {
212public:
213 LoopPatchBench(SkPoint scale, VertexMode vertexMode)
214 : INHERITED(scale, vertexMode) { }
mtkleine556be72014-08-13 10:41:16 -0700215
mtklein36352bf2015-03-25 18:17:31 -0700216 void appendName(SkString* name) override {
dandovb3c9d1c2014-08-12 08:34:29 -0700217 name->append("loop");
218 }
mtkleine556be72014-08-13 10:41:16 -0700219
mtklein36352bf2015-03-25 18:17:31 -0700220 void setCubics() override {
dandovb3c9d1c2014-08-12 08:34:29 -0700221 const SkPoint points[SkPatchUtils::kNumCtrlPts] = {
222 //top points
223 {100,100},{300,200},{100,200}, {300,100},
224 //right points
225 {380, 400},{380,0},
226 //bottom points
227 {300,300},{250,250},{30,200},{100,300},
228 //left points
229 {140,325},{150,150}
230 };
231 memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint));
232 }
233private:
234 typedef PatchBench INHERITED;
235};
236
237///////////////////////////////////////////////////////////////////////////////
238
239DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kNone_VertexMode); )
240DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kColors_VertexMode); )
241DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kTexCoords_VertexMode); )
242DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kBoth_VertexMode); )
243DEF_BENCH( return new PatchBench(SkVector::Make(1.f, 1.0f), PatchBench::kNone_VertexMode); )
244DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kColors_VertexMode); )
245DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kTexCoords_VertexMode); )
246DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kBoth_VertexMode); )
247DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kNone_VertexMode); )
248DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kColors_VertexMode); )
249DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kTexCoords_VertexMode); )
250DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kBoth_VertexMode); )
251
252DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
253 PatchBench::kNone_VertexMode); )
254DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
255 PatchBench::kColors_VertexMode); )
256DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
257 PatchBench::kTexCoords_VertexMode); )
258DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f),
259 PatchBench::kBoth_VertexMode); )
260DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.f, 1.0f),
261 PatchBench::kNone_VertexMode); )
262DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f),
263 PatchBench::kColors_VertexMode); )
264DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f),
265 PatchBench::kTexCoords_VertexMode); )
266DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f),
267 PatchBench::kBoth_VertexMode); )
268DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
269 PatchBench::kNone_VertexMode); )
270DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
271 PatchBench::kColors_VertexMode); )
272DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
273 PatchBench::kTexCoords_VertexMode); )
274DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f),
275 PatchBench::kBoth_VertexMode); )
276
277DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
278 PatchBench::kNone_VertexMode); )
279DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
280 PatchBench::kColors_VertexMode); )
281DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
282 PatchBench::kTexCoords_VertexMode); )
283DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f),
284 PatchBench::kBoth_VertexMode); )
285DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.f, 1.0f),
286 PatchBench::kNone_VertexMode); )
287DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f),
288 PatchBench::kColors_VertexMode); )
289DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f),
290 PatchBench::kTexCoords_VertexMode); )
291DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f),
292 PatchBench::kBoth_VertexMode); )
293DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
294 PatchBench::kNone_VertexMode); )
295DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
296 PatchBench::kColors_VertexMode); )
297DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
298 PatchBench::kTexCoords_VertexMode); )
299DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f),
300 PatchBench::kBoth_VertexMode); )
301
302DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
303 PatchBench::kNone_VertexMode); )
304DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
305 PatchBench::kColors_VertexMode); )
306DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
307 PatchBench::kTexCoords_VertexMode); )
308DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f),
309 PatchBench::kBoth_VertexMode); )
310DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.f, 1.0f),
311 PatchBench::kNone_VertexMode); )
312DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f),
313 PatchBench::kColors_VertexMode); )
314DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f),
315 PatchBench::kTexCoords_VertexMode); )
316DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f),
317 PatchBench::kBoth_VertexMode); )
318DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
319 PatchBench::kNone_VertexMode); )
320DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
321 PatchBench::kColors_VertexMode); )
322DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
323 PatchBench::kTexCoords_VertexMode); )
324DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f),
325 PatchBench::kBoth_VertexMode); )
Mike Reedeee76212017-05-22 22:45:05 -0400326
327//////////////////////////////////////////////
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500328#include "src/utils/SkPatchUtils.h"
Mike Reedeee76212017-05-22 22:45:05 -0400329
330class PatchUtilsBench : public Benchmark {
Mike Reed435071e2017-05-23 11:22:56 -0400331 SkString fName;
332 const bool fLinearInterp;
Mike Reedeee76212017-05-22 22:45:05 -0400333public:
Mike Reed435071e2017-05-23 11:22:56 -0400334 PatchUtilsBench(bool linearInterp) : fLinearInterp(linearInterp) {
335 fName.printf("patchutils_%s", linearInterp ? "linear" : "legacy");
Mike Reedeee76212017-05-22 22:45:05 -0400336 }
337
Mike Reed435071e2017-05-23 11:22:56 -0400338 const char* onGetName() override { return fName.c_str(); }
339
Mike Reedeee76212017-05-22 22:45:05 -0400340 bool isSuitableFor(Backend backend) override {
341 return backend == kNonRendering_Backend;
342 }
343
Mike Reed435071e2017-05-23 11:22:56 -0400344 void onDraw(int loops, SkCanvas*) override {
Mike Reedeee76212017-05-22 22:45:05 -0400345 const SkColor colors[] = { 0xFF000000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 };
346 const SkPoint pts[] = {
347 { 0, 0 }, { 10, 0 }, { 20, 0 }, { 30, 0 },
348 { 30,10}, { 30,20 }, { 30,30 }, { 20,30 },
349 { 10,30}, { 0, 30 }, { 0, 20 }, { 0, 10 },
350 };
351 const SkPoint tex[] = {
352 { 0, 0 }, { 10, 0 }, { 10, 10 }, { 0, 10 },
353 };
354
Brian Osmane0a99622018-07-09 16:12:27 -0400355 auto cs = fLinearInterp ? SkColorSpace::MakeSRGBLinear() : nullptr;
Mike Reed435071e2017-05-23 11:22:56 -0400356 for (int i = 0; i < 100*loops; ++i) {
Brian Osmane0a99622018-07-09 16:12:27 -0400357 SkPatchUtils::MakeVertices(pts, colors, tex, 20, 20, cs.get());
Mike Reedeee76212017-05-22 22:45:05 -0400358 }
359 }
360};
Mike Reed435071e2017-05-23 11:22:56 -0400361DEF_BENCH( return new PatchUtilsBench(false); )
362DEF_BENCH( return new PatchUtilsBench(true); )