blob: 4c2a52fa902cd13eaba1989d6b60210ae369de10 [file] [log] [blame]
reed@google.com7d683352012-12-03 21:19:52 +00001/*
2 * Copyright 2012 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 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
Mike Reed46f5c5f2020-02-20 15:42:29 -05009#include "include/core/SkM44.h"
Mike Kleina121fb62020-02-26 08:25:52 -060010#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/utils/SkRandom.h"
Michael Ludwigdaa9b8e2021-05-05 09:05:10 -040012#include "src/core/SkMatrixPriv.h"
reed@google.com7d683352012-12-03 21:19:52 +000013
Mike Reed403c8072020-01-08 10:40:39 -050014class M4Bench : public Benchmark {
15 SkString fName;
16public:
17 M4Bench(const char name[]) {
18 fName.printf("m4_%s", name);
19
20 SkRandom rand;
21 float value[32];
22 for (auto& v : value) {
23 v = rand.nextF();
24 }
Mike Reed3ef77dd2020-04-06 10:41:09 -040025 fM1 = SkM44::ColMajor(value + 0);
26 fM2 = SkM44::ColMajor(value + 16);
Mike Reed403c8072020-01-08 10:40:39 -050027 }
28
29 bool isSuitableFor(Backend backend) override {
30 return backend == kNonRendering_Backend;
31 }
32
33 virtual void performTest() = 0;
34
35protected:
36 SkM44 fM0, fM1, fM2;
37
38 virtual int mulLoopCount() const { return 1; }
39
40 const char* onGetName() override {
41 return fName.c_str();
42 }
43
44 void onDraw(int loops, SkCanvas*) override {
45 for (int i = 0; i < loops; i++) {
46 this->performTest();
47 }
48 }
49
50private:
John Stiles7571f9e2020-09-02 22:42:33 -040051 using INHERITED = Benchmark;
Mike Reed403c8072020-01-08 10:40:39 -050052};
53
54class M4NEQ : public M4Bench {
55public:
56 M4NEQ() : INHERITED("neq") {}
57protected:
58 void performTest() override {
59 for (int i = 0; i < 10000; ++i) {
60 fEQ = (fM2 == fM1); // should always be false
61 }
62 }
63private:
64 bool fEQ;
John Stiles7571f9e2020-09-02 22:42:33 -040065 using INHERITED = M4Bench;
Mike Reed403c8072020-01-08 10:40:39 -050066};
67
68class M4EQ : public M4Bench {
69public:
70 M4EQ() : INHERITED("eq") {}
71protected:
72 void performTest() override {
73 fM2 = fM1;
74 for (int i = 0; i < 10000; ++i) {
75 fEQ = (fM2 == fM1); // should always be true
76 }
77 }
78private:
79 bool fEQ;
John Stiles7571f9e2020-09-02 22:42:33 -040080 using INHERITED = M4Bench;
Mike Reed403c8072020-01-08 10:40:39 -050081};
82
83class M4Concat : public M4Bench {
84public:
85 M4Concat() : INHERITED("op_concat") {}
86protected:
87 void performTest() override {
88 for (int i = 0; i < 10000; ++i) {
89 fM0 = SkM44(fM1, fM2);
90 }
91 }
92private:
John Stiles7571f9e2020-09-02 22:42:33 -040093 using INHERITED = M4Bench;
Mike Reed403c8072020-01-08 10:40:39 -050094};
95
96class M4SetConcat : public M4Bench {
97public:
98 M4SetConcat() : INHERITED("set_concat") {}
99protected:
100 void performTest() override {
101 for (int i = 0; i < 10000; ++i) {
102 fM0.setConcat(fM1, fM2);
103 }
104 }
105private:
John Stiles7571f9e2020-09-02 22:42:33 -0400106 using INHERITED = M4Bench;
Mike Reed403c8072020-01-08 10:40:39 -0500107};
108
109DEF_BENCH( return new M4EQ(); )
110DEF_BENCH( return new M4NEQ(); )
111DEF_BENCH( return new M4Concat(); )
112DEF_BENCH( return new M4SetConcat(); )
Mike Reedc4b8eef2020-01-15 22:26:17 -0500113
114class M4_map4 : public M4Bench {
115public:
116 M4_map4() : INHERITED("map4") {}
117protected:
118 void performTest() override {
119 SkV4 v = {1, 2, 3, 4};
120 for (int i = 0; i < 100000; ++i) {
121 fV = fM0 * v;
122 }
123 }
124private:
125 SkV4 fV;
John Stiles7571f9e2020-09-02 22:42:33 -0400126 using INHERITED = M4Bench;
Mike Reedc4b8eef2020-01-15 22:26:17 -0500127};
128DEF_BENCH( return new M4_map4(); )
129
130class M4_map2 : public M4Bench {
131public:
132 M4_map2() : INHERITED("map2") {}
133protected:
134 void performTest() override {
135 SkMatrix m;
136 m.setRotate(1);
137 for (int i = 0; i < 100000; ++i) {
138 fV = m.mapXY(5, 6);
139 }
140 }
141private:
142 SkPoint fV;
John Stiles7571f9e2020-09-02 22:42:33 -0400143 using INHERITED = M4Bench;
Mike Reedc4b8eef2020-01-15 22:26:17 -0500144};
145DEF_BENCH( return new M4_map2(); )
Michael Ludwigdaa9b8e2021-05-05 09:05:10 -0400146
147
148enum class MapMatrixType {
149 kTranslateOnly,
150 kScaleTranslate,
151 kRotate,
152 kPerspective,
153 kPerspectiveClipped
154};
155class MapRectBench : public Benchmark {
156 SkString fName;
157
158public:
159 MapRectBench(MapMatrixType type, const char name[]) {
160 SkRandom rand;
161 const char* typeName;
162 switch(type) {
163 case MapMatrixType::kTranslateOnly:
164 typeName = "t";
165 fM = SkM44::Translate(rand.nextF(), rand.nextF());
166 break;
167 case MapMatrixType::kScaleTranslate:
168 typeName = "s+t";
169 fM = SkM44::Scale(rand.nextF(), rand.nextF());
170 fM.postTranslate(rand.nextF(), rand.nextF());
171 break;
172 case MapMatrixType::kRotate:
173 typeName = "r";
174 fM = SkM44::Rotate({0.f, 0.f, 1.f}, SkDegreesToRadians(45.f));
175 break;
176 case MapMatrixType::kPerspective:
177 typeName = "p";
178 // Hand chosen to have all corners with w > 0 and w != 1
179 fM = SkM44::Perspective(0.01f, 10.f, SK_ScalarPI / 3.f);
180 fM.preTranslate(0.f, 5.f, -0.1f);
181 fM.preConcat(SkM44::Rotate({0.f, 1.f, 0.f}, 0.008f /* radians */));
182 break;
183 case MapMatrixType::kPerspectiveClipped:
184 typeName = "pc";
185 // Hand chosen to have some corners with w > 0 and some with w < 0
186 fM = SkM44();
187 fM.setRow(3, {-.2f, -.6f, 0.f, 8.f});
188 break;
189 }
190 fS = SkRect::MakeXYWH(10.f * rand.nextF(), 10.f * rand.nextF(),
191 150.f * rand.nextF(), 150.f * rand.nextF());
192
193 fName.printf("mapRect_%s_%s", name, typeName);
194 }
195
196 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
197
198 virtual void performTest() = 0;
199
200protected:
201 SkM44 fM;
202 SkRect fS, fD;
203
204 virtual int mulLoopCount() const { return 1; }
205
206 const char* onGetName() override { return fName.c_str(); }
207
208 void onDraw(int loops, SkCanvas*) override {
209 for (int i = 0; i < loops; i++) {
210 this->performTest();
211 }
212 }
213
214private:
215 using INHERITED = Benchmark;
216};
217
218class M4_mapRectBench : public MapRectBench {
219public:
220 M4_mapRectBench(MapMatrixType type) : INHERITED(type, "m4") {}
221
222protected:
223 void performTest() override {
224 for (int i = 0; i < 100000; ++i) {
225 fD = SkMatrixPriv::MapRect(fM, fS);
226 }
227 }
228
229private:
230 using INHERITED = MapRectBench;
231};
232DEF_BENCH(return new M4_mapRectBench(MapMatrixType::kTranslateOnly);)
233DEF_BENCH(return new M4_mapRectBench(MapMatrixType::kScaleTranslate);)
234DEF_BENCH(return new M4_mapRectBench(MapMatrixType::kRotate);)
235DEF_BENCH(return new M4_mapRectBench(MapMatrixType::kPerspective);)
236DEF_BENCH(return new M4_mapRectBench(MapMatrixType::kPerspectiveClipped);)
237
238class M33_mapRectBench : public MapRectBench {
239public:
240 M33_mapRectBench(MapMatrixType type) : INHERITED(type, "m33") {
241 fM33 = fM.asM33();
242 }
243
244protected:
245 void performTest() override {
246 for (int i = 0; i < 100000; ++i) {
247 fD = fM33.mapRect(fS);
248 }
249 }
250private:
251 SkMatrix fM33;
252 using INHERITED = MapRectBench;
253};
254
255DEF_BENCH(return new M33_mapRectBench(MapMatrixType::kTranslateOnly);)
256DEF_BENCH(return new M33_mapRectBench(MapMatrixType::kScaleTranslate);)
257DEF_BENCH(return new M33_mapRectBench(MapMatrixType::kRotate);)
258DEF_BENCH(return new M33_mapRectBench(MapMatrixType::kPerspective);)
259DEF_BENCH(return new M33_mapRectBench(MapMatrixType::kPerspectiveClipped);)