2 * Copyright 2012 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
9 #include "SkMatrix44.h"
13 class Matrix44Bench : public Benchmark {
16 Matrix44Bench(const char name[]) {
17 fName.printf("matrix44_%s", name);
20 bool isSuitableFor(Backend backend) override {
21 return backend == kNonRendering_Backend;
24 virtual void performTest() = 0;
27 virtual int mulLoopCount() const { return 1; }
29 const char* onGetName() override {
33 void onDraw(int loops, SkCanvas*) override {
34 for (int i = 0; i < loops; i++) {
40 typedef Benchmark INHERITED;
43 class EqualsMatrix44Bench : public Matrix44Bench {
47 , fM0(SkMatrix44::kIdentity_Constructor)
48 , fM1(SkMatrix44::kIdentity_Constructor)
49 , fM2(SkMatrix44::kIdentity_Constructor)
55 void performTest() override {
56 for (int i = 0; i < 10; ++i) {
63 SkMatrix44 fM0, fM1, fM2;
64 typedef Matrix44Bench INHERITED;
67 class SetIdentityMatrix44Bench : public Matrix44Bench {
69 SetIdentityMatrix44Bench()
70 : INHERITED("setidentity")
71 , mat(SkMatrix44::kIdentity_Constructor)
78 mat.setRowMajord(rowMajor);
81 void performTest() override {
82 for (int i = 0; i < 10; ++i) {
88 typedef Matrix44Bench INHERITED;
91 class PreScaleMatrix44Bench : public Matrix44Bench {
93 PreScaleMatrix44Bench()
94 : INHERITED("prescale")
95 , fM0(SkMatrix44::kUninitialized_Constructor)
97 fX = fY = fZ = SkDoubleToMScalar(1.5);
100 void performTest() override {
102 for (int i = 0; i < 10; ++i) {
103 fM0.preScale(fX, fY, fZ);
108 SkMScalar fX, fY, fZ;
109 typedef Matrix44Bench INHERITED;
112 class InvertMatrix44Bench : public Matrix44Bench {
114 InvertMatrix44Bench()
115 : INHERITED("invert")
116 , fM0(SkMatrix44::kUninitialized_Constructor)
117 , fM1(SkMatrix44::kUninitialized_Constructor)
119 fM0.setDouble(0, 0, -1.1);
120 fM0.setDouble(0, 1, 2.1);
121 fM0.setDouble(0, 2, -3.1);
122 fM0.setDouble(0, 3, 4.1);
123 fM0.setDouble(1, 0, 5.1);
124 fM0.setDouble(1, 1, -6.1);
125 fM0.setDouble(1, 2, 7.1);
126 fM0.setDouble(1, 3, 8.1);
127 fM0.setDouble(2, 0, -9.1);
128 fM0.setDouble(2, 1, 10.1);
129 fM0.setDouble(2, 2, 11.1);
130 fM0.setDouble(2, 3, -12.1);
131 fM0.setDouble(3, 0, -13.1);
132 fM0.setDouble(3, 1, 14.1);
133 fM0.setDouble(3, 2, -15.1);
134 fM0.setDouble(3, 3, 16.1);
137 void performTest() override {
138 for (int i = 0; i < 10; ++i) {
144 typedef Matrix44Bench INHERITED;
147 class InvertAffineMatrix44Bench : public Matrix44Bench {
149 InvertAffineMatrix44Bench()
150 : INHERITED("invertaffine")
151 , fM0(SkMatrix44::kIdentity_Constructor)
152 , fM1(SkMatrix44::kUninitialized_Constructor)
154 fM0.setDouble(0, 0, -1.1);
155 fM0.setDouble(0, 1, 2.1);
156 fM0.setDouble(0, 2, -3.1);
157 fM0.setDouble(0, 3, 4.1);
158 fM0.setDouble(1, 0, 5.1);
159 fM0.setDouble(1, 1, -6.1);
160 fM0.setDouble(1, 2, 7.1);
161 fM0.setDouble(1, 3, 8.1);
162 fM0.setDouble(2, 0, -9.1);
163 fM0.setDouble(2, 1, 10.1);
164 fM0.setDouble(2, 2, 11.1);
165 fM0.setDouble(2, 3, -12.1);
166 // bottom row (perspective component) remains (0, 0, 0, 1).
169 void performTest() override {
170 for (int i = 0; i < 10; ++i) {
176 typedef Matrix44Bench INHERITED;
179 class InvertScaleTranslateMatrix44Bench : public Matrix44Bench {
181 InvertScaleTranslateMatrix44Bench()
182 : INHERITED("invertscaletranslate")
183 , fM0(SkMatrix44::kIdentity_Constructor)
184 , fM1(SkMatrix44::kUninitialized_Constructor)
186 fM0.setDouble(0, 0, -1.1);
187 fM0.setDouble(0, 3, 4.1);
189 fM0.setDouble(1, 1, -6.1);
190 fM0.setDouble(1, 3, 8.1);
192 fM0.setDouble(2, 2, 11.1);
193 fM0.setDouble(2, 3, -12.1);
196 void performTest() override {
197 for (int i = 0; i < 10; ++i) {
203 typedef Matrix44Bench INHERITED;
206 class InvertTranslateMatrix44Bench : public Matrix44Bench {
208 InvertTranslateMatrix44Bench()
209 : INHERITED("inverttranslate")
210 , fM0(SkMatrix44::kIdentity_Constructor)
211 , fM1(SkMatrix44::kUninitialized_Constructor)
213 fM0.setDouble(0, 3, 4.1);
214 fM0.setDouble(1, 3, 8.1);
215 fM0.setDouble(2, 3, -12.1);
218 void performTest() override {
219 for (int i = 0; i < 10; ++i) {
225 typedef Matrix44Bench INHERITED;
228 class PostScaleMatrix44Bench : public Matrix44Bench {
230 PostScaleMatrix44Bench()
231 : INHERITED("postscale")
232 , fM0(SkMatrix44::kUninitialized_Constructor)
234 fX = fY = fZ = SkDoubleToMScalar(1.5);
237 void performTest() override {
239 for (int i = 0; i < 10; ++i) {
240 fM0.postScale(fX, fY, fZ);
245 SkMScalar fX, fY, fZ;
246 typedef Matrix44Bench INHERITED;
249 class SetConcatMatrix44Bench : public Matrix44Bench {
251 // SkMatrix44::setConcat() has a fast path for matrices that are at most scale+translate.
252 SetConcatMatrix44Bench(bool fastPath)
253 : INHERITED(fastPath ? "setconcat_fast" : "setconcat_general")
254 , fM0(SkMatrix44::kUninitialized_Constructor)
255 , fM1(SkMatrix44::kUninitialized_Constructor)
256 , fM2(SkMatrix44::kUninitialized_Constructor)
259 const SkMScalar v = SkDoubleToMScalar(1.5);
261 fM2.setTranslate(v,v,v);
264 for (int x = 0; x < 4; x++) {
265 for (int y = 0; y < 4; y++) {
266 fM1.setFloat(x,y, rand.nextF());
267 fM2.setFloat(x,y, rand.nextF());
272 void performTest() override {
273 fM0.reset(); // just to normalize this test with prescale/postscale
274 for (int i = 0; i < 10000; ++i) {
275 fM0.setConcat(fM1, fM2);
279 SkMatrix44 fM0, fM1, fM2;
280 typedef Matrix44Bench INHERITED;
283 class GetTypeMatrix44Bench : public Matrix44Bench {
285 GetTypeMatrix44Bench()
286 : INHERITED("gettype")
287 , fMatrix(SkMatrix44::kIdentity_Constructor)
290 // Putting random generation of the matrix inside performTest()
291 // would help us avoid anomalous runs, but takes up 25% or
292 // more of the function time.
293 void performTest() override {
294 for (int i = 0; i < 20; ++i) {
295 fMatrix.set(1, 2, 1); // to invalidate the type-cache
301 typedef Matrix44Bench INHERITED;
304 DEF_BENCH( return new SetIdentityMatrix44Bench(); )
305 DEF_BENCH( return new EqualsMatrix44Bench(); )
306 DEF_BENCH( return new PreScaleMatrix44Bench(); )
307 DEF_BENCH( return new PostScaleMatrix44Bench(); )
308 DEF_BENCH( return new InvertMatrix44Bench(); )
309 DEF_BENCH( return new InvertAffineMatrix44Bench(); )
310 DEF_BENCH( return new InvertScaleTranslateMatrix44Bench(); )
311 DEF_BENCH( return new InvertTranslateMatrix44Bench(); )
312 DEF_BENCH( return new SetConcatMatrix44Bench(true); )
313 DEF_BENCH( return new SetConcatMatrix44Bench(false); )
314 DEF_BENCH( return new GetTypeMatrix44Bench(); )