blob: 7baf82ae4d8ab063cc7594a503f281195af3330f [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
61class PreScaleMatrix44Bench : public Matrix44Bench {
62public:
63 PreScaleMatrix44Bench(void* param) : INHERITED(param, "prescale") {
64 fX = fY = fZ = SkDoubleToMScalar(1.5);
65 }
66protected:
67 virtual void performTest() {
68 fM0.reset();
69 for (int i = 0; i < 10; ++i) {
70 fM0.preScale(fX, fY, fZ);
71 }
72 }
73private:
74 SkMatrix44 fM0;
75 SkMScalar fX, fY, fZ;
76 typedef Matrix44Bench INHERITED;
77};
78
tomhudson@google.com9973a8a2012-12-13 09:55:42 +000079class InvertMatrix44Bench : public Matrix44Bench {
80public:
81 InvertMatrix44Bench(void* param) : INHERITED(param, "invert") {
commit-bot@chromium.org95045752013-08-20 20:15:24 +000082 fM0.set(0, 0, -1.1);
83 fM0.set(0, 1, 2.1);
84 fM0.set(0, 2, -3.1);
85 fM0.set(0, 3, 4.1);
86 fM0.set(1, 0, 5.1);
87 fM0.set(1, 1, -6.1);
88 fM0.set(1, 2, 7.1);
89 fM0.set(1, 3, 8.1);
90 fM0.set(2, 0, -9.1);
91 fM0.set(2, 1, 10.1);
92 fM0.set(2, 2, 11.1);
93 fM0.set(2, 3, -12.1);
94 fM0.set(3, 0, -13.1);
95 fM0.set(3, 1, 14.1);
96 fM0.set(3, 2, -15.1);
97 fM0.set(3, 3, 16.1);
98 }
99protected:
100 virtual void performTest() {
101 for (int i = 0; i < 10; ++i) {
102 fM0.invert(&fM1);
103 }
104 }
105private:
106 SkMatrix44 fM0, fM1;
107 typedef Matrix44Bench INHERITED;
108};
109
110class InvertAffineMatrix44Bench : public Matrix44Bench {
111public:
112 InvertAffineMatrix44Bench(void* param) : INHERITED(param, "invertaffine") {
113 fM0.set(0, 0, -1.1);
114 fM0.set(0, 1, 2.1);
115 fM0.set(0, 2, -3.1);
116 fM0.set(0, 3, 4.1);
117 fM0.set(1, 0, 5.1);
118 fM0.set(1, 1, -6.1);
119 fM0.set(1, 2, 7.1);
120 fM0.set(1, 3, 8.1);
121 fM0.set(2, 0, -9.1);
122 fM0.set(2, 1, 10.1);
123 fM0.set(2, 2, 11.1);
124 fM0.set(2, 3, -12.1);
125 // bottom row (perspective component) remains (0, 0, 0, 1).
126 }
127protected:
128 virtual void performTest() {
129 for (int i = 0; i < 10; ++i) {
130 fM0.invert(&fM1);
131 }
132 }
133private:
134 SkMatrix44 fM0, fM1;
135 typedef Matrix44Bench INHERITED;
136};
137
138class InvertScaleTranslateMatrix44Bench : public Matrix44Bench {
139public:
140 InvertScaleTranslateMatrix44Bench(void* param) : INHERITED(param, "invertscaletranslate") {
141 fM0.set(0, 0, -1.1);
142 fM0.set(0, 3, 4.1);
143
144 fM0.set(1, 1, -6.1);
145 fM0.set(1, 3, 8.1);
146
147 fM0.set(2, 2, 11.1);
148 fM0.set(2, 3, -12.1);
149 }
150protected:
151 virtual void performTest() {
152 for (int i = 0; i < 10; ++i) {
153 fM0.invert(&fM1);
154 }
155 }
156private:
157 SkMatrix44 fM0, fM1;
158 typedef Matrix44Bench INHERITED;
159};
160
161class InvertTranslateMatrix44Bench : public Matrix44Bench {
162public:
163 InvertTranslateMatrix44Bench(void* param) : INHERITED(param, "inverttranslate") {
164 fM0.set(0, 3, 4.1);
165 fM0.set(1, 3, 8.1);
166 fM0.set(2, 3, -12.1);
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000167 }
168protected:
169 virtual void performTest() {
170 for (int i = 0; i < 10; ++i) {
171 fM0.invert(&fM1);
172 }
173 }
174private:
175 SkMatrix44 fM0, fM1;
176 typedef Matrix44Bench INHERITED;
177};
178
reed@google.com7d683352012-12-03 21:19:52 +0000179class PostScaleMatrix44Bench : public Matrix44Bench {
180public:
181 PostScaleMatrix44Bench(void* param) : INHERITED(param, "postscale") {
182 fX = fY = fZ = SkDoubleToMScalar(1.5);
183 }
184protected:
185 virtual void performTest() {
186 fM0.reset();
187 for (int i = 0; i < 10; ++i) {
188 fM0.postScale(fX, fY, fZ);
189 }
190 }
191private:
192 SkMatrix44 fM0;
193 SkMScalar fX, fY, fZ;
194 typedef Matrix44Bench INHERITED;
195};
196
197class SetConcatMatrix44Bench : public Matrix44Bench {
198public:
199 SetConcatMatrix44Bench(void* param) : INHERITED(param, "setconcat") {
200 fX = fY = fZ = SkDoubleToMScalar(1.5);
201 fM1.setScale(fX, fY, fZ);
202 fM2.setTranslate(fX, fY, fZ);
203 }
204protected:
205 virtual void performTest() {
206 fM0.reset(); // just to normalize this test with prescale/postscale
207 for (int i = 0; i < 10; ++i) {
208 fM0.setConcat(fM1, fM2);
209 }
210 }
211private:
212 SkMatrix44 fM0, fM1, fM2;
213 SkMScalar fX, fY, fZ;
214 typedef Matrix44Bench INHERITED;
215};
216
217class GetTypeMatrix44Bench : public Matrix44Bench {
218public:
219 GetTypeMatrix44Bench(void* param) : INHERITED(param, "gettype") {}
220protected:
221 // Putting random generation of the matrix inside performTest()
222 // would help us avoid anomalous runs, but takes up 25% or
223 // more of the function time.
224 virtual void performTest() {
225 for (int i = 0; i < 20; ++i) {
226 fMatrix.set(1, 2, 1); // to invalidate the type-cache
227 fMatrix.getType();
228 }
229 }
230private:
231 SkMatrix44 fMatrix;
232 typedef Matrix44Bench INHERITED;
233};
234
235DEF_BENCH( return new EqualsMatrix44Bench(p); )
236DEF_BENCH( return new PreScaleMatrix44Bench(p); )
237DEF_BENCH( return new PostScaleMatrix44Bench(p); )
tomhudson@google.com9973a8a2012-12-13 09:55:42 +0000238DEF_BENCH( return new InvertMatrix44Bench(p); )
commit-bot@chromium.org95045752013-08-20 20:15:24 +0000239DEF_BENCH( return new InvertAffineMatrix44Bench(p); )
240DEF_BENCH( return new InvertScaleTranslateMatrix44Bench(p); )
241DEF_BENCH( return new InvertTranslateMatrix44Bench(p); )
reed@google.com7d683352012-12-03 21:19:52 +0000242DEF_BENCH( return new SetConcatMatrix44Bench(p); )
243DEF_BENCH( return new GetTypeMatrix44Bench(p); )