blob: c3692889fcece690f7d6d58663d6d695b6a8fb22 [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;
15 enum { N = 10000 };
16public:
17 Matrix44Bench(void* param, const char name[]) : INHERITED(param) {
18 fName.printf("matrix44_%s", name);
19 fIsRendering = false;
20 }
21
22 virtual void performTest() = 0;
23
24protected:
25 virtual int mulLoopCount() const { return 1; }
26
27 virtual const char* onGetName() {
28 return fName.c_str();
29 }
30
sugoi@google.com77472f02013-03-05 18:50:01 +000031 virtual void onDraw(SkCanvas*) {
reed@google.com7d683352012-12-03 21:19:52 +000032 int n = SkBENCHLOOP(N * this->mulLoopCount());
33 for (int i = 0; i < n; i++) {
34 this->performTest();
35 }
36 }
37
38private:
39 typedef SkBenchmark INHERITED;
40};
41
42class EqualsMatrix44Bench : public Matrix44Bench {
43public:
44 EqualsMatrix44Bench(void* param) : INHERITED(param, "equals") {
45 fM1.set(0, 0, 0);
46 fM2.set(3, 3, 0);
47 }
48protected:
49 virtual void performTest() {
50 for (int i = 0; i < 10; ++i) {
humper@google.com05af1af2013-01-07 16:47:43 +000051 (void) (fM0 == fM1);
52 (void) (fM1 == fM2);
53 (void) (fM2 == fM0);
reed@google.com7d683352012-12-03 21:19:52 +000054 }
55 }
56private:
57 SkMatrix44 fM0, fM1, fM2;
58 typedef Matrix44Bench INHERITED;
59};
60
shawnsingh@chromium.org63bf68d2013-08-28 05:07:26 +000061class SetIdentityMatrix44Bench : public Matrix44Bench {
62public:
63 SetIdentityMatrix44Bench(void* param) : INHERITED(param, "setidentity") {
64 double rowMajor[16] =
65 { 1, 2, 3, 4,
66 5, 6, 7, 8,
67 9, 10, 11, 12,
68 13, 14, 15, 16};
69 mat.setRowMajord(rowMajor);
70 }
71protected:
72 virtual void performTest() {
73 for (int i = 0; i < 10; ++i) {
74 mat.setIdentity();
75 }
76 }
77private:
78 SkMatrix44 mat;
79 typedef Matrix44Bench INHERITED;
80};
81
reed@google.com7d683352012-12-03 21:19:52 +000082class PreScaleMatrix44Bench : public Matrix44Bench {
83public:
84 PreScaleMatrix44Bench(void* param) : INHERITED(param, "prescale") {
85 fX = fY = fZ = SkDoubleToMScalar(1.5);
86 }
87protected:
88 virtual void performTest() {
89 fM0.reset();
90 for (int i = 0; i < 10; ++i) {
91 fM0.preScale(fX, fY, fZ);
92 }
93 }
94private:
95 SkMatrix44 fM0;
96 SkMScalar fX, fY, fZ;
97 typedef Matrix44Bench INHERITED;
98};
99
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000100class InvertMatrix44Bench : public Matrix44Bench {
101public:
102 InvertMatrix44Bench(void* param) : INHERITED(param, "invert") {
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000103 fM0.set(0, 0, -1.1);
104 fM0.set(0, 1, 2.1);
105 fM0.set(0, 2, -3.1);
106 fM0.set(0, 3, 4.1);
107 fM0.set(1, 0, 5.1);
108 fM0.set(1, 1, -6.1);
109 fM0.set(1, 2, 7.1);
110 fM0.set(1, 3, 8.1);
111 fM0.set(2, 0, -9.1);
112 fM0.set(2, 1, 10.1);
113 fM0.set(2, 2, 11.1);
114 fM0.set(2, 3, -12.1);
115 fM0.set(3, 0, -13.1);
116 fM0.set(3, 1, 14.1);
117 fM0.set(3, 2, -15.1);
118 fM0.set(3, 3, 16.1);
119 }
120protected:
121 virtual void performTest() {
122 for (int i = 0; i < 10; ++i) {
123 fM0.invert(&fM1);
124 }
125 }
126private:
127 SkMatrix44 fM0, fM1;
128 typedef Matrix44Bench INHERITED;
129};
130
131class InvertAffineMatrix44Bench : public Matrix44Bench {
132public:
133 InvertAffineMatrix44Bench(void* param) : INHERITED(param, "invertaffine") {
134 fM0.set(0, 0, -1.1);
135 fM0.set(0, 1, 2.1);
136 fM0.set(0, 2, -3.1);
137 fM0.set(0, 3, 4.1);
138 fM0.set(1, 0, 5.1);
139 fM0.set(1, 1, -6.1);
140 fM0.set(1, 2, 7.1);
141 fM0.set(1, 3, 8.1);
142 fM0.set(2, 0, -9.1);
143 fM0.set(2, 1, 10.1);
144 fM0.set(2, 2, 11.1);
145 fM0.set(2, 3, -12.1);
146 // bottom row (perspective component) remains (0, 0, 0, 1).
147 }
148protected:
149 virtual void performTest() {
150 for (int i = 0; i < 10; ++i) {
151 fM0.invert(&fM1);
152 }
153 }
154private:
155 SkMatrix44 fM0, fM1;
156 typedef Matrix44Bench INHERITED;
157};
158
159class InvertScaleTranslateMatrix44Bench : public Matrix44Bench {
160public:
161 InvertScaleTranslateMatrix44Bench(void* param) : INHERITED(param, "invertscaletranslate") {
162 fM0.set(0, 0, -1.1);
163 fM0.set(0, 3, 4.1);
164
165 fM0.set(1, 1, -6.1);
166 fM0.set(1, 3, 8.1);
167
168 fM0.set(2, 2, 11.1);
169 fM0.set(2, 3, -12.1);
170 }
171protected:
172 virtual void performTest() {
173 for (int i = 0; i < 10; ++i) {
174 fM0.invert(&fM1);
175 }
176 }
177private:
178 SkMatrix44 fM0, fM1;
179 typedef Matrix44Bench INHERITED;
180};
181
182class InvertTranslateMatrix44Bench : public Matrix44Bench {
183public:
184 InvertTranslateMatrix44Bench(void* param) : INHERITED(param, "inverttranslate") {
185 fM0.set(0, 3, 4.1);
186 fM0.set(1, 3, 8.1);
187 fM0.set(2, 3, -12.1);
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000188 }
189protected:
190 virtual void performTest() {
191 for (int i = 0; i < 10; ++i) {
192 fM0.invert(&fM1);
193 }
194 }
195private:
196 SkMatrix44 fM0, fM1;
197 typedef Matrix44Bench INHERITED;
198};
199
reed@google.com7d683352012-12-03 21:19:52 +0000200class PostScaleMatrix44Bench : public Matrix44Bench {
201public:
202 PostScaleMatrix44Bench(void* param) : INHERITED(param, "postscale") {
203 fX = fY = fZ = SkDoubleToMScalar(1.5);
204 }
205protected:
206 virtual void performTest() {
207 fM0.reset();
208 for (int i = 0; i < 10; ++i) {
209 fM0.postScale(fX, fY, fZ);
210 }
211 }
212private:
213 SkMatrix44 fM0;
214 SkMScalar fX, fY, fZ;
215 typedef Matrix44Bench INHERITED;
216};
217
218class SetConcatMatrix44Bench : public Matrix44Bench {
219public:
220 SetConcatMatrix44Bench(void* param) : INHERITED(param, "setconcat") {
221 fX = fY = fZ = SkDoubleToMScalar(1.5);
222 fM1.setScale(fX, fY, fZ);
223 fM2.setTranslate(fX, fY, fZ);
224 }
225protected:
226 virtual void performTest() {
227 fM0.reset(); // just to normalize this test with prescale/postscale
228 for (int i = 0; i < 10; ++i) {
229 fM0.setConcat(fM1, fM2);
230 }
231 }
232private:
233 SkMatrix44 fM0, fM1, fM2;
234 SkMScalar fX, fY, fZ;
235 typedef Matrix44Bench INHERITED;
236};
237
238class GetTypeMatrix44Bench : public Matrix44Bench {
239public:
240 GetTypeMatrix44Bench(void* param) : INHERITED(param, "gettype") {}
241protected:
242 // Putting random generation of the matrix inside performTest()
243 // would help us avoid anomalous runs, but takes up 25% or
244 // more of the function time.
245 virtual void performTest() {
246 for (int i = 0; i < 20; ++i) {
247 fMatrix.set(1, 2, 1); // to invalidate the type-cache
248 fMatrix.getType();
249 }
250 }
251private:
252 SkMatrix44 fMatrix;
253 typedef Matrix44Bench INHERITED;
254};
255
shawnsingh@chromium.org63bf68d2013-08-28 05:07:26 +0000256DEF_BENCH( return new SetIdentityMatrix44Bench(p); )
reed@google.com7d683352012-12-03 21:19:52 +0000257DEF_BENCH( return new EqualsMatrix44Bench(p); )
258DEF_BENCH( return new PreScaleMatrix44Bench(p); )
259DEF_BENCH( return new PostScaleMatrix44Bench(p); )
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000260DEF_BENCH( return new InvertMatrix44Bench(p); )
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000261DEF_BENCH( return new InvertAffineMatrix44Bench(p); )
262DEF_BENCH( return new InvertScaleTranslateMatrix44Bench(p); )
263DEF_BENCH( return new InvertTranslateMatrix44Bench(p); )
reed@google.com7d683352012-12-03 21:19:52 +0000264DEF_BENCH( return new SetConcatMatrix44Bench(p); )
265DEF_BENCH( return new GetTypeMatrix44Bench(p); )