blob: 8fe9e34e4be959950a756ddad839636c1175a8dd [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@google.com3fb51872011-06-01 15:11:22 +00008#include "SkBenchmark.h"
9#include "SkMatrix.h"
commit-bot@chromium.org5b2e2642013-09-03 19:08:14 +000010#include "SkMatrixUtils.h"
tomhudson@google.com7b4e1072011-06-03 19:16:56 +000011#include "SkRandom.h"
reed@google.com3fb51872011-06-01 15:11:22 +000012#include "SkString.h"
13
14class MatrixBench : public SkBenchmark {
15 SkString fName;
16 enum { N = 100000 };
17public:
18 MatrixBench(void* param, const char name[]) : INHERITED(param) {
19 fName.printf("matrix_%s", name);
tomhudson@google.com9dc27132012-09-13 15:50:24 +000020 fIsRendering = false;
reed@google.com3fb51872011-06-01 15:11:22 +000021 }
22
23 virtual void performTest() = 0;
24
25protected:
reed@google.comcbefd7d2011-06-06 13:31:30 +000026 virtual int mulLoopCount() const { return 1; }
27
reed@google.com3fb51872011-06-01 15:11:22 +000028 virtual const char* onGetName() {
29 return fName.c_str();
30 }
31
sugoi@google.com77472f02013-03-05 18:50:01 +000032 virtual void onDraw(SkCanvas*) {
tomhudson@google.comca529d32011-10-28 15:34:49 +000033 int n = SkBENCHLOOP(N * this->mulLoopCount());
reed@google.comcbefd7d2011-06-06 13:31:30 +000034 for (int i = 0; i < n; i++) {
reed@google.com3fb51872011-06-01 15:11:22 +000035 this->performTest();
36 }
37 }
38
39private:
40 typedef SkBenchmark INHERITED;
41};
42
43// we want to stop the compiler from eliminating code that it thinks is a no-op
44// so we have a non-static global we increment, hoping that will convince the
45// compiler to execute everything
46int gMatrixBench_NonStaticGlobal;
47
48#define always_do(pred) \
49 do { \
50 if (pred) { \
51 ++gMatrixBench_NonStaticGlobal; \
52 } \
53 } while (0)
54
55class EqualsMatrixBench : public MatrixBench {
56public:
57 EqualsMatrixBench(void* param) : INHERITED(param, "equals") {}
58protected:
59 virtual void performTest() {
60 SkMatrix m0, m1, m2;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +000061
reed@google.com3fb51872011-06-01 15:11:22 +000062 m0.reset();
63 m1.reset();
64 m2.reset();
65 always_do(m0 == m1);
66 always_do(m1 == m2);
67 always_do(m2 == m0);
reed@google.com3fb51872011-06-01 15:11:22 +000068 }
69private:
70 typedef MatrixBench INHERITED;
71};
72
73class ScaleMatrixBench : public MatrixBench {
74public:
75 ScaleMatrixBench(void* param) : INHERITED(param, "scale") {
bungeman@google.com20809002011-06-08 19:38:53 +000076 fSX = fSY = SkFloatToScalar(1.5f);
reed@google.com3fb51872011-06-01 15:11:22 +000077 fM0.reset();
78 fM1.setScale(fSX, fSY);
79 fM2.setTranslate(fSX, fSY);
reed@google.com3fb51872011-06-01 15:11:22 +000080 }
81protected:
82 virtual void performTest() {
83 SkMatrix m;
84 m = fM0; m.preScale(fSX, fSY);
85 m = fM1; m.preScale(fSX, fSY);
86 m = fM2; m.preScale(fSX, fSY);
87 }
88private:
89 SkMatrix fM0, fM1, fM2;
90 SkScalar fSX, fSY;
91 typedef MatrixBench INHERITED;
92};
93
reed@google.come0dcde72011-06-06 13:20:29 +000094// having unknown values in our arrays can throw off the timing a lot, perhaps
95// handling NaN values is a lot slower. Anyway, this guy is just meant to put
96// reasonable values in our arrays.
97template <typename T> void init9(T array[9]) {
98 SkRandom rand;
99 for (int i = 0; i < 9; i++) {
100 array[i] = rand.nextSScalar1();
101 }
102}
103
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000104// Test the performance of setConcat() non-perspective case:
105// using floating point precision only.
106class FloatConcatMatrixBench : public MatrixBench {
107public:
reed@google.come0dcde72011-06-06 13:20:29 +0000108 FloatConcatMatrixBench(void* p) : INHERITED(p, "concat_floatfloat") {
109 init9(mya);
110 init9(myb);
111 init9(myr);
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000112 }
113protected:
reed@google.comcbefd7d2011-06-06 13:31:30 +0000114 virtual int mulLoopCount() const { return 4; }
115
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000116 static inline void muladdmul(float a, float b, float c, float d,
117 float* result) {
118 *result = a * b + c * d;
119 }
120 virtual void performTest() {
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000121 const float* a = mya;
122 const float* b = myb;
123 float* r = myr;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000124 muladdmul(a[0], b[0], a[1], b[3], &r[0]);
125 muladdmul(a[0], b[1], a[1], b[4], &r[1]);
126 muladdmul(a[0], b[2], a[1], b[5], &r[2]);
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000127 r[2] += a[2];
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000128 muladdmul(a[3], b[0], a[4], b[3], &r[3]);
129 muladdmul(a[3], b[1], a[4], b[4], &r[4]);
130 muladdmul(a[3], b[2], a[4], b[5], &r[5]);
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000131 r[5] += a[5];
132 r[6] = r[7] = 0.0f;
133 r[8] = 1.0f;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000134 }
135private:
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000136 float mya [9];
137 float myb [9];
138 float myr [9];
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000139 typedef MatrixBench INHERITED;
140};
141
142static inline float SkDoubleToFloat(double x) {
143 return static_cast<float>(x);
144}
145
146// Test the performance of setConcat() non-perspective case:
147// using floating point precision but casting up to float for
148// intermediate results during computations.
149class FloatDoubleConcatMatrixBench : public MatrixBench {
150public:
reed@google.come0dcde72011-06-06 13:20:29 +0000151 FloatDoubleConcatMatrixBench(void* p) : INHERITED(p, "concat_floatdouble") {
152 init9(mya);
153 init9(myb);
154 init9(myr);
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000155 }
156protected:
reed@google.comcbefd7d2011-06-06 13:31:30 +0000157 virtual int mulLoopCount() const { return 4; }
158
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000159 static inline void muladdmul(float a, float b, float c, float d,
160 float* result) {
161 *result = SkDoubleToFloat((double)a * b + (double)c * d);
162 }
163 virtual void performTest() {
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000164 const float* a = mya;
165 const float* b = myb;
166 float* r = myr;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000167 muladdmul(a[0], b[0], a[1], b[3], &r[0]);
168 muladdmul(a[0], b[1], a[1], b[4], &r[1]);
169 muladdmul(a[0], b[2], a[1], b[5], &r[2]);
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000170 r[2] += a[2];
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000171 muladdmul(a[3], b[0], a[4], b[3], &r[3]);
172 muladdmul(a[3], b[1], a[4], b[4], &r[4]);
173 muladdmul(a[3], b[2], a[4], b[5], &r[5]);
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000174 r[5] += a[5];
175 r[6] = r[7] = 0.0f;
176 r[8] = 1.0f;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000177 }
178private:
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000179 float mya [9];
180 float myb [9];
181 float myr [9];
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000182 typedef MatrixBench INHERITED;
183};
184
185// Test the performance of setConcat() non-perspective case:
186// using double precision only.
187class DoubleConcatMatrixBench : public MatrixBench {
188public:
reed@google.come0dcde72011-06-06 13:20:29 +0000189 DoubleConcatMatrixBench(void* p) : INHERITED(p, "concat_double") {
190 init9(mya);
191 init9(myb);
192 init9(myr);
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000193 }
194protected:
reed@google.comcbefd7d2011-06-06 13:31:30 +0000195 virtual int mulLoopCount() const { return 4; }
196
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000197 static inline void muladdmul(double a, double b, double c, double d,
198 double* result) {
199 *result = a * b + c * d;
200 }
201 virtual void performTest() {
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000202 const double* a = mya;
203 const double* b = myb;
204 double* r = myr;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000205 muladdmul(a[0], b[0], a[1], b[3], &r[0]);
206 muladdmul(a[0], b[1], a[1], b[4], &r[1]);
207 muladdmul(a[0], b[2], a[1], b[5], &r[2]);
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000208 r[2] += a[2];
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000209 muladdmul(a[3], b[0], a[4], b[3], &r[3]);
210 muladdmul(a[3], b[1], a[4], b[4], &r[4]);
211 muladdmul(a[3], b[2], a[4], b[5], &r[5]);
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000212 r[5] += a[5];
213 r[6] = r[7] = 0.0;
214 r[8] = 1.0;
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000215 }
216private:
tomhudson@google.coma20416b2011-06-03 20:32:58 +0000217 double mya [9];
218 double myb [9];
219 double myr [9];
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000220 typedef MatrixBench INHERITED;
221};
222
tomhudson@google.com317d5402011-06-24 18:30:49 +0000223class GetTypeMatrixBench : public MatrixBench {
224public:
225 GetTypeMatrixBench(void* param)
226 : INHERITED(param, "gettype") {
bsalomon@google.com820e80a2011-10-24 21:09:40 +0000227 fArray[0] = (float) fRnd.nextS();
228 fArray[1] = (float) fRnd.nextS();
229 fArray[2] = (float) fRnd.nextS();
230 fArray[3] = (float) fRnd.nextS();
231 fArray[4] = (float) fRnd.nextS();
232 fArray[5] = (float) fRnd.nextS();
233 fArray[6] = (float) fRnd.nextS();
234 fArray[7] = (float) fRnd.nextS();
235 fArray[8] = (float) fRnd.nextS();
tomhudson@google.com317d5402011-06-24 18:30:49 +0000236 }
237protected:
238 // Putting random generation of the matrix inside performTest()
239 // would help us avoid anomalous runs, but takes up 25% or
240 // more of the function time.
241 virtual void performTest() {
242 fMatrix.setAll(fArray[0], fArray[1], fArray[2],
243 fArray[3], fArray[4], fArray[5],
244 fArray[6], fArray[7], fArray[8]);
245 always_do(fMatrix.getType());
246 fMatrix.dirtyMatrixTypeCache();
247 always_do(fMatrix.getType());
248 fMatrix.dirtyMatrixTypeCache();
249 always_do(fMatrix.getType());
250 fMatrix.dirtyMatrixTypeCache();
251 always_do(fMatrix.getType());
252 fMatrix.dirtyMatrixTypeCache();
253 always_do(fMatrix.getType());
254 fMatrix.dirtyMatrixTypeCache();
255 always_do(fMatrix.getType());
256 fMatrix.dirtyMatrixTypeCache();
257 always_do(fMatrix.getType());
258 fMatrix.dirtyMatrixTypeCache();
259 always_do(fMatrix.getType());
260 }
261private:
262 SkMatrix fMatrix;
263 float fArray[9];
264 SkRandom fRnd;
265 typedef MatrixBench INHERITED;
266};
267
tomhudson@google.com288ff332011-06-07 14:31:38 +0000268class ScaleTransMixedMatrixBench : public MatrixBench {
269 public:
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000270 ScaleTransMixedMatrixBench(void* p) : INHERITED(p, "scaletrans_mixed") {
bsalomon@google.com3d3dfe02011-11-10 13:50:19 +0000271 fMatrix.setAll(fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(),
272 fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(),
273 fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1());
tomhudson@google.com288ff332011-06-07 14:31:38 +0000274 int i;
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000275 for (i = 0; i < kCount; i++) {
bsalomon@google.com820e80a2011-10-24 21:09:40 +0000276 fSrc[i].fX = fRandom.nextSScalar1();
277 fSrc[i].fY = fRandom.nextSScalar1();
278 fDst[i].fX = fRandom.nextSScalar1();
279 fDst[i].fY = fRandom.nextSScalar1();
tomhudson@google.com288ff332011-06-07 14:31:38 +0000280 }
281 }
282 protected:
283 virtual void performTest() {
284 SkPoint* dst = fDst;
285 const SkPoint* src = fSrc;
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000286 int count = kCount;
tomhudson@google.com288ff332011-06-07 14:31:38 +0000287 float mx = fMatrix[SkMatrix::kMScaleX];
288 float my = fMatrix[SkMatrix::kMScaleY];
289 float tx = fMatrix[SkMatrix::kMTransX];
290 float ty = fMatrix[SkMatrix::kMTransY];
291 do {
292 dst->fY = SkScalarMulAdd(src->fY, my, ty);
293 dst->fX = SkScalarMulAdd(src->fX, mx, tx);
294 src += 1;
295 dst += 1;
296 } while (--count);
297 }
298 private:
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000299 enum {
300 kCount = SkBENCHLOOP(16)
301 };
tomhudson@google.com288ff332011-06-07 14:31:38 +0000302 SkMatrix fMatrix;
303 SkPoint fSrc [16];
304 SkPoint fDst [16];
tomhudson@google.com288ff332011-06-07 14:31:38 +0000305 SkRandom fRandom;
306 typedef MatrixBench INHERITED;
307};
tomhudson@google.com288ff332011-06-07 14:31:38 +0000308
309class ScaleTransDoubleMatrixBench : public MatrixBench {
310 public:
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000311 ScaleTransDoubleMatrixBench(void* p) : INHERITED(p, "scaletrans_double") {
tomhudson@google.com288ff332011-06-07 14:31:38 +0000312 init9(fMatrix);
313 int i;
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000314 for (i = 0; i < kCount; i++) {
bsalomon@google.com820e80a2011-10-24 21:09:40 +0000315 fSrc[i].fX = fRandom.nextSScalar1();
316 fSrc[i].fY = fRandom.nextSScalar1();
317 fDst[i].fX = fRandom.nextSScalar1();
318 fDst[i].fY = fRandom.nextSScalar1();
tomhudson@google.com288ff332011-06-07 14:31:38 +0000319 }
320 }
321 protected:
322 virtual void performTest() {
323 SkPoint* dst = fDst;
324 const SkPoint* src = fSrc;
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000325 int count = kCount;
tomhudson@google.com288ff332011-06-07 14:31:38 +0000326 // As doubles, on Z600 Linux systems this is 2.5x as expensive as mixed mode
bsalomon@google.com820e80a2011-10-24 21:09:40 +0000327 float mx = (float) fMatrix[SkMatrix::kMScaleX];
328 float my = (float) fMatrix[SkMatrix::kMScaleY];
329 float tx = (float) fMatrix[SkMatrix::kMTransX];
330 float ty = (float) fMatrix[SkMatrix::kMTransY];
tomhudson@google.com288ff332011-06-07 14:31:38 +0000331 do {
332 dst->fY = src->fY * my + ty;
333 dst->fX = src->fX * mx + tx;
334 src += 1;
335 dst += 1;
336 } while (--count);
337 }
338 private:
tfarina@chromium.org7731ead2013-04-05 21:13:14 +0000339 enum {
340 kCount = SkBENCHLOOP(16)
341 };
tomhudson@google.com288ff332011-06-07 14:31:38 +0000342 double fMatrix [9];
343 SkPoint fSrc [16];
344 SkPoint fDst [16];
tomhudson@google.com288ff332011-06-07 14:31:38 +0000345 SkRandom fRandom;
346 typedef MatrixBench INHERITED;
347};
tomhudson@google.com288ff332011-06-07 14:31:38 +0000348
commit-bot@chromium.org5b2e2642013-09-03 19:08:14 +0000349class DecomposeMatrixBench : public MatrixBench {
350public:
351 DecomposeMatrixBench(void* param) : INHERITED(param, "decompose") {}
352
353protected:
354 virtual void onPreDraw() {
355 for (int i = 0; i < 10; ++i) {
356 SkScalar rot0 = (fRandom.nextBool()) ? fRandom.nextRangeF(-180, 180) : 0.0f;
357 SkScalar sx = fRandom.nextRangeF(-3000.f, 3000.f);
358 SkScalar sy = (fRandom.nextBool()) ? fRandom.nextRangeF(-3000.f, 3000.f) : sx;
359 SkScalar rot1 = fRandom.nextRangeF(-180, 180);
360 fMatrix[i].setRotate(rot0);
361 fMatrix[i].postScale(sx, sy);
362 fMatrix[i].postRotate(rot1);
363 }
364 }
365 virtual void performTest() {
366 SkPoint rotation1, scale, rotation2;
367 for (int i = 0; i < 10; ++i) {
368 (void) SkDecomposeUpper2x2(fMatrix[i], &rotation1, &scale, &rotation2);
369 }
370 }
371private:
372 SkMatrix fMatrix[10];
373 SkMWCRandom fRandom;
374 typedef MatrixBench INHERITED;
375};
376
junov@chromium.org6fc56992012-07-12 14:01:32 +0000377class InvertMapRectMatrixBench : public MatrixBench {
378public:
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000379 InvertMapRectMatrixBench(void* param, const char* name, int flags)
junov@chromium.org6fc56992012-07-12 14:01:32 +0000380 : INHERITED(param, name)
381 , fFlags(flags) {
382 fMatrix.reset();
383 fIteration = 0;
384 if (flags & kScale_Flag) {
385 fMatrix.postScale(SkFloatToScalar(1.5f), SkFloatToScalar(2.5f));
386 }
387 if (flags & kTranslate_Flag) {
388 fMatrix.postTranslate(SkFloatToScalar(1.5f), SkFloatToScalar(2.5f));
389 }
390 if (flags & kRotate_Flag) {
391 fMatrix.postRotate(SkFloatToScalar(45.0f));
392 }
393 if (flags & kPerspective_Flag) {
394 fMatrix.setPerspX(SkFloatToScalar(1.5f));
395 fMatrix.setPerspY(SkFloatToScalar(2.5f));
396 }
397 if (0 == (flags & kUncachedTypeMask_Flag)) {
398 fMatrix.getType();
399 }
400 }
401 enum Flag {
402 kScale_Flag = 0x01,
403 kTranslate_Flag = 0x02,
404 kRotate_Flag = 0x04,
405 kPerspective_Flag = 0x08,
406 kUncachedTypeMask_Flag = 0x10,
407 };
408protected:
409 virtual void performTest() {
410 if (fFlags & kUncachedTypeMask_Flag) {
411 // This will invalidate the typemask without
412 // changing the matrix.
413 fMatrix.setPerspX(fMatrix.getPerspX());
414 }
415 SkMatrix inv;
robertphillips@google.com31f8f732012-09-17 13:36:47 +0000416 bool invertible = fMatrix.invert(&inv);
junov@chromium.org6fc56992012-07-12 14:01:32 +0000417 SkASSERT(invertible);
418 SkRect transformedRect;
robertphillips@google.com31f8f732012-09-17 13:36:47 +0000419 // an arbitrary, small, non-zero rect to transform
420 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(10), SkIntToScalar(10));
junov@chromium.org6fc56992012-07-12 14:01:32 +0000421 if (invertible) {
robertphillips@google.com31f8f732012-09-17 13:36:47 +0000422 inv.mapRect(&transformedRect, srcRect);
junov@chromium.org6fc56992012-07-12 14:01:32 +0000423 }
424 }
425private:
426 SkMatrix fMatrix;
junov@chromium.org6fc56992012-07-12 14:01:32 +0000427 int fFlags;
428 unsigned fIteration;
429 typedef MatrixBench INHERITED;
430};
tomhudson@google.com288ff332011-06-07 14:31:38 +0000431
reed@google.com82bf8bb2013-01-04 14:04:08 +0000432///////////////////////////////////////////////////////////////////////////////
tomhudson@google.com288ff332011-06-07 14:31:38 +0000433
reed@google.com82bf8bb2013-01-04 14:04:08 +0000434DEF_BENCH( return new EqualsMatrixBench(p); )
435DEF_BENCH( return new ScaleMatrixBench(p); )
436DEF_BENCH( return new FloatConcatMatrixBench(p); )
437DEF_BENCH( return new FloatDoubleConcatMatrixBench(p); )
438DEF_BENCH( return new DoubleConcatMatrixBench(p); )
439DEF_BENCH( return new GetTypeMatrixBench(p); )
commit-bot@chromium.org5b2e2642013-09-03 19:08:14 +0000440DEF_BENCH( return new DecomposeMatrixBench(p); )
441
reed@google.com82bf8bb2013-01-04 14:04:08 +0000442DEF_BENCH( return new InvertMapRectMatrixBench(p, "invert_maprect_identity", 0); )
tomhudson@google.com288ff332011-06-07 14:31:38 +0000443
reed@google.com82bf8bb2013-01-04 14:04:08 +0000444DEF_BENCH(return new InvertMapRectMatrixBench(p,
reed@google.com90533be2013-01-04 15:46:42 +0000445 "invert_maprect_rectstaysrect",
446 InvertMapRectMatrixBench::kScale_Flag |
447 InvertMapRectMatrixBench::kTranslate_Flag); )
448
449DEF_BENCH(return new InvertMapRectMatrixBench(p,
450 "invert_maprect_translate",
451 InvertMapRectMatrixBench::kTranslate_Flag); )
tomhudson@google.com7b4e1072011-06-03 19:16:56 +0000452
reed@google.com82bf8bb2013-01-04 14:04:08 +0000453DEF_BENCH(return new InvertMapRectMatrixBench(p,
454 "invert_maprect_nonpersp",
455 InvertMapRectMatrixBench::kScale_Flag |
456 InvertMapRectMatrixBench::kRotate_Flag |
457 InvertMapRectMatrixBench::kTranslate_Flag); )
reed@google.com3fb51872011-06-01 15:11:22 +0000458
reed@google.com82bf8bb2013-01-04 14:04:08 +0000459DEF_BENCH( return new InvertMapRectMatrixBench(p,
460 "invert_maprect_persp",
461 InvertMapRectMatrixBench::kPerspective_Flag); )
tomhudson@google.com288ff332011-06-07 14:31:38 +0000462
reed@google.com82bf8bb2013-01-04 14:04:08 +0000463DEF_BENCH( return new InvertMapRectMatrixBench(p,
464 "invert_maprect_typemask_rectstaysrect",
465 InvertMapRectMatrixBench::kUncachedTypeMask_Flag |
466 InvertMapRectMatrixBench::kScale_Flag |
467 InvertMapRectMatrixBench::kTranslate_Flag); )
468
469DEF_BENCH( return new InvertMapRectMatrixBench(p,
470 "invert_maprect_typemask_nonpersp",
471 InvertMapRectMatrixBench::kUncachedTypeMask_Flag |
472 InvertMapRectMatrixBench::kScale_Flag |
473 InvertMapRectMatrixBench::kRotate_Flag |
474 InvertMapRectMatrixBench::kTranslate_Flag); )
475
476DEF_BENCH( return new ScaleTransMixedMatrixBench(p); )
477DEF_BENCH( return new ScaleTransDoubleMatrixBench(p); )