blob: 13169971c45b032e59651f5a48f7a4d813234166 [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
8#include "SkBenchmark.h"
9#include "SkMatrix44.h"
10#include "SkRandom.h"
11#include "SkString.h"
12
13class Matrix44Bench : public SkBenchmark {
14 SkString fName;
reed@google.com7d683352012-12-03 21:19:52 +000015public:
reed@google.com44699382013-10-31 17:28:30 +000016 Matrix44Bench(const char name[]) {
reed@google.com7d683352012-12-03 21:19:52 +000017 fName.printf("matrix44_%s", name);
18 fIsRendering = false;
19 }
20
21 virtual void performTest() = 0;
22
23protected:
24 virtual int mulLoopCount() const { return 1; }
25
26 virtual const char* onGetName() {
27 return fName.c_str();
28 }
29
sugoi@google.com77472f02013-03-05 18:50:01 +000030 virtual void onDraw(SkCanvas*) {
mtklein@google.comc2897432013-09-10 19:23:38 +000031 for (int i = 0; i < this->getLoops(); i++) {
reed@google.com7d683352012-12-03 21:19:52 +000032 this->performTest();
33 }
34 }
35
36private:
37 typedef SkBenchmark INHERITED;
38};
39
40class EqualsMatrix44Bench : public Matrix44Bench {
41public:
reed@google.com44699382013-10-31 17:28:30 +000042 EqualsMatrix44Bench()
43 : INHERITED("equals")
44 , fM0(SkMatrix44::kIdentity_Constructor)
45 , fM1(SkMatrix44::kIdentity_Constructor)
46 , fM2(SkMatrix44::kIdentity_Constructor)
47 {
reed@google.com7d683352012-12-03 21:19:52 +000048 fM1.set(0, 0, 0);
49 fM2.set(3, 3, 0);
50 }
51protected:
52 virtual void performTest() {
53 for (int i = 0; i < 10; ++i) {
humper@google.com05af1af2013-01-07 16:47:43 +000054 (void) (fM0 == fM1);
55 (void) (fM1 == fM2);
56 (void) (fM2 == fM0);
reed@google.com7d683352012-12-03 21:19:52 +000057 }
58 }
59private:
60 SkMatrix44 fM0, fM1, fM2;
61 typedef Matrix44Bench INHERITED;
62};
63
shawnsingh@chromium.org63bf68d2013-08-28 05:07:26 +000064class SetIdentityMatrix44Bench : public Matrix44Bench {
65public:
reed@google.com44699382013-10-31 17:28:30 +000066 SetIdentityMatrix44Bench()
67 : INHERITED("setidentity")
68 , mat(SkMatrix44::kIdentity_Constructor)
69 {
shawnsingh@chromium.org63bf68d2013-08-28 05:07:26 +000070 double rowMajor[16] =
71 { 1, 2, 3, 4,
72 5, 6, 7, 8,
73 9, 10, 11, 12,
74 13, 14, 15, 16};
75 mat.setRowMajord(rowMajor);
76 }
77protected:
78 virtual void performTest() {
79 for (int i = 0; i < 10; ++i) {
80 mat.setIdentity();
81 }
82 }
83private:
84 SkMatrix44 mat;
85 typedef Matrix44Bench INHERITED;
86};
87
reed@google.com7d683352012-12-03 21:19:52 +000088class PreScaleMatrix44Bench : public Matrix44Bench {
89public:
reed@google.com44699382013-10-31 17:28:30 +000090 PreScaleMatrix44Bench()
91 : INHERITED("prescale")
92 , fM0(SkMatrix44::kUninitialized_Constructor)
93 {
reed@google.com7d683352012-12-03 21:19:52 +000094 fX = fY = fZ = SkDoubleToMScalar(1.5);
95 }
96protected:
97 virtual void performTest() {
98 fM0.reset();
99 for (int i = 0; i < 10; ++i) {
100 fM0.preScale(fX, fY, fZ);
101 }
102 }
103private:
104 SkMatrix44 fM0;
105 SkMScalar fX, fY, fZ;
106 typedef Matrix44Bench INHERITED;
107};
108
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000109class InvertMatrix44Bench : public Matrix44Bench {
110public:
reed@google.com44699382013-10-31 17:28:30 +0000111 InvertMatrix44Bench()
112 : INHERITED("invert")
113 , fM0(SkMatrix44::kUninitialized_Constructor)
114 , fM1(SkMatrix44::kUninitialized_Constructor)
115 {
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000116 fM0.set(0, 0, -1.1);
117 fM0.set(0, 1, 2.1);
118 fM0.set(0, 2, -3.1);
119 fM0.set(0, 3, 4.1);
120 fM0.set(1, 0, 5.1);
121 fM0.set(1, 1, -6.1);
122 fM0.set(1, 2, 7.1);
123 fM0.set(1, 3, 8.1);
124 fM0.set(2, 0, -9.1);
125 fM0.set(2, 1, 10.1);
126 fM0.set(2, 2, 11.1);
127 fM0.set(2, 3, -12.1);
128 fM0.set(3, 0, -13.1);
129 fM0.set(3, 1, 14.1);
130 fM0.set(3, 2, -15.1);
131 fM0.set(3, 3, 16.1);
132 }
133protected:
134 virtual void performTest() {
135 for (int i = 0; i < 10; ++i) {
136 fM0.invert(&fM1);
137 }
138 }
139private:
140 SkMatrix44 fM0, fM1;
141 typedef Matrix44Bench INHERITED;
142};
143
144class InvertAffineMatrix44Bench : public Matrix44Bench {
145public:
reed@google.com44699382013-10-31 17:28:30 +0000146 InvertAffineMatrix44Bench()
147 : INHERITED("invertaffine")
148 , fM0(SkMatrix44::kIdentity_Constructor)
149 , fM1(SkMatrix44::kUninitialized_Constructor)
150 {
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000151 fM0.set(0, 0, -1.1);
152 fM0.set(0, 1, 2.1);
153 fM0.set(0, 2, -3.1);
154 fM0.set(0, 3, 4.1);
155 fM0.set(1, 0, 5.1);
156 fM0.set(1, 1, -6.1);
157 fM0.set(1, 2, 7.1);
158 fM0.set(1, 3, 8.1);
159 fM0.set(2, 0, -9.1);
160 fM0.set(2, 1, 10.1);
161 fM0.set(2, 2, 11.1);
162 fM0.set(2, 3, -12.1);
163 // bottom row (perspective component) remains (0, 0, 0, 1).
164 }
165protected:
166 virtual void performTest() {
167 for (int i = 0; i < 10; ++i) {
168 fM0.invert(&fM1);
169 }
170 }
171private:
172 SkMatrix44 fM0, fM1;
173 typedef Matrix44Bench INHERITED;
174};
175
176class InvertScaleTranslateMatrix44Bench : public Matrix44Bench {
177public:
reed@google.com44699382013-10-31 17:28:30 +0000178 InvertScaleTranslateMatrix44Bench()
179 : INHERITED("invertscaletranslate")
180 , fM0(SkMatrix44::kIdentity_Constructor)
181 , fM1(SkMatrix44::kUninitialized_Constructor)
182 {
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000183 fM0.set(0, 0, -1.1);
184 fM0.set(0, 3, 4.1);
185
186 fM0.set(1, 1, -6.1);
187 fM0.set(1, 3, 8.1);
188
189 fM0.set(2, 2, 11.1);
190 fM0.set(2, 3, -12.1);
191 }
192protected:
193 virtual void performTest() {
194 for (int i = 0; i < 10; ++i) {
195 fM0.invert(&fM1);
196 }
197 }
198private:
199 SkMatrix44 fM0, fM1;
200 typedef Matrix44Bench INHERITED;
201};
202
203class InvertTranslateMatrix44Bench : public Matrix44Bench {
204public:
reed@google.com44699382013-10-31 17:28:30 +0000205 InvertTranslateMatrix44Bench()
206 : INHERITED("inverttranslate")
207 , fM0(SkMatrix44::kIdentity_Constructor)
208 , fM1(SkMatrix44::kUninitialized_Constructor)
209 {
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000210 fM0.set(0, 3, 4.1);
211 fM0.set(1, 3, 8.1);
212 fM0.set(2, 3, -12.1);
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000213 }
214protected:
215 virtual void performTest() {
216 for (int i = 0; i < 10; ++i) {
217 fM0.invert(&fM1);
218 }
219 }
220private:
221 SkMatrix44 fM0, fM1;
222 typedef Matrix44Bench INHERITED;
223};
224
reed@google.com7d683352012-12-03 21:19:52 +0000225class PostScaleMatrix44Bench : public Matrix44Bench {
226public:
reed@google.com44699382013-10-31 17:28:30 +0000227 PostScaleMatrix44Bench()
228 : INHERITED("postscale")
229 , fM0(SkMatrix44::kUninitialized_Constructor)
230 {
reed@google.com7d683352012-12-03 21:19:52 +0000231 fX = fY = fZ = SkDoubleToMScalar(1.5);
232 }
233protected:
234 virtual void performTest() {
235 fM0.reset();
236 for (int i = 0; i < 10; ++i) {
237 fM0.postScale(fX, fY, fZ);
238 }
239 }
240private:
241 SkMatrix44 fM0;
242 SkMScalar fX, fY, fZ;
243 typedef Matrix44Bench INHERITED;
244};
245
246class SetConcatMatrix44Bench : public Matrix44Bench {
247public:
reed@google.com44699382013-10-31 17:28:30 +0000248 SetConcatMatrix44Bench()
249 : INHERITED("setconcat")
250 , fM0(SkMatrix44::kUninitialized_Constructor)
251 , fM1(SkMatrix44::kUninitialized_Constructor)
252 , fM2(SkMatrix44::kUninitialized_Constructor)
253{
reed@google.com7d683352012-12-03 21:19:52 +0000254 fX = fY = fZ = SkDoubleToMScalar(1.5);
255 fM1.setScale(fX, fY, fZ);
256 fM2.setTranslate(fX, fY, fZ);
257 }
258protected:
259 virtual void performTest() {
260 fM0.reset(); // just to normalize this test with prescale/postscale
261 for (int i = 0; i < 10; ++i) {
262 fM0.setConcat(fM1, fM2);
263 }
264 }
265private:
266 SkMatrix44 fM0, fM1, fM2;
267 SkMScalar fX, fY, fZ;
268 typedef Matrix44Bench INHERITED;
269};
270
271class GetTypeMatrix44Bench : public Matrix44Bench {
272public:
reed@google.com44699382013-10-31 17:28:30 +0000273 GetTypeMatrix44Bench()
274 : INHERITED("gettype")
275 , fMatrix(SkMatrix44::kIdentity_Constructor)
276 {}
reed@google.com7d683352012-12-03 21:19:52 +0000277protected:
278 // Putting random generation of the matrix inside performTest()
279 // would help us avoid anomalous runs, but takes up 25% or
280 // more of the function time.
281 virtual void performTest() {
282 for (int i = 0; i < 20; ++i) {
283 fMatrix.set(1, 2, 1); // to invalidate the type-cache
284 fMatrix.getType();
285 }
286 }
287private:
288 SkMatrix44 fMatrix;
289 typedef Matrix44Bench INHERITED;
290};
291
mtklein@google.com410e6e82013-09-13 19:52:27 +0000292DEF_BENCH( return new SetIdentityMatrix44Bench(); )
293DEF_BENCH( return new EqualsMatrix44Bench(); )
294DEF_BENCH( return new PreScaleMatrix44Bench(); )
295DEF_BENCH( return new PostScaleMatrix44Bench(); )
296DEF_BENCH( return new InvertMatrix44Bench(); )
297DEF_BENCH( return new InvertAffineMatrix44Bench(); )
298DEF_BENCH( return new InvertScaleTranslateMatrix44Bench(); )
299DEF_BENCH( return new InvertTranslateMatrix44Bench(); )
300DEF_BENCH( return new SetConcatMatrix44Bench(); )
301DEF_BENCH( return new GetTypeMatrix44Bench(); )