1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
93fb5187647397e056843c1f41a508992be22175dreed@google.com#include "SkMatrix.h"
105b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org#include "SkMatrixUtils.h"
117b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com#include "SkRandom.h"
123fb5187647397e056843c1f41a508992be22175dreed@google.com#include "SkString.h"
133fb5187647397e056843c1f41a508992be22175dreed@google.com
14f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MatrixBench : public Benchmark {
153fb5187647397e056843c1f41a508992be22175dreed@google.com    SkString    fName;
163fb5187647397e056843c1f41a508992be22175dreed@google.compublic:
17410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    MatrixBench(const char name[])  {
183fb5187647397e056843c1f41a508992be22175dreed@google.com        fName.printf("matrix_%s", name);
19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
21644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
22644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
233fb5187647397e056843c1f41a508992be22175dreed@google.com    }
243fb5187647397e056843c1f41a508992be22175dreed@google.com
253fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual void performTest() = 0;
263fb5187647397e056843c1f41a508992be22175dreed@google.com
273fb5187647397e056843c1f41a508992be22175dreed@google.comprotected:
28cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com    virtual int mulLoopCount() const { return 1; }
29cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com
303fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual const char* onGetName() {
313fb5187647397e056843c1f41a508992be22175dreed@google.com        return fName.c_str();
323fb5187647397e056843c1f41a508992be22175dreed@google.com    }
333fb5187647397e056843c1f41a508992be22175dreed@google.com
343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
363fb5187647397e056843c1f41a508992be22175dreed@google.com            this->performTest();
373fb5187647397e056843c1f41a508992be22175dreed@google.com        }
383fb5187647397e056843c1f41a508992be22175dreed@google.com    }
393fb5187647397e056843c1f41a508992be22175dreed@google.com
403fb5187647397e056843c1f41a508992be22175dreed@google.comprivate:
41f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
423fb5187647397e056843c1f41a508992be22175dreed@google.com};
433fb5187647397e056843c1f41a508992be22175dreed@google.com
443fb5187647397e056843c1f41a508992be22175dreed@google.com
453fb5187647397e056843c1f41a508992be22175dreed@google.comclass EqualsMatrixBench : public MatrixBench {
463fb5187647397e056843c1f41a508992be22175dreed@google.compublic:
47410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    EqualsMatrixBench() : INHERITED("equals") {}
483fb5187647397e056843c1f41a508992be22175dreed@google.comprotected:
493fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual void performTest() {
503fb5187647397e056843c1f41a508992be22175dreed@google.com        SkMatrix m0, m1, m2;
517b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
523fb5187647397e056843c1f41a508992be22175dreed@google.com        m0.reset();
533fb5187647397e056843c1f41a508992be22175dreed@google.com        m1.reset();
543fb5187647397e056843c1f41a508992be22175dreed@google.com        m2.reset();
55cf44feb0e192f255d598fa9a3f81b70968c98305mtklein
56cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        // xor into a volatile prevents these comparisons from being optimized away.
57cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        volatile bool junk = false;
58cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (m0 == m1);
59cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (m1 == m2);
60cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (m2 == m0);
613fb5187647397e056843c1f41a508992be22175dreed@google.com    }
623fb5187647397e056843c1f41a508992be22175dreed@google.comprivate:
633fb5187647397e056843c1f41a508992be22175dreed@google.com    typedef MatrixBench INHERITED;
643fb5187647397e056843c1f41a508992be22175dreed@google.com};
653fb5187647397e056843c1f41a508992be22175dreed@google.com
663fb5187647397e056843c1f41a508992be22175dreed@google.comclass ScaleMatrixBench : public MatrixBench {
673fb5187647397e056843c1f41a508992be22175dreed@google.compublic:
68410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ScaleMatrixBench() : INHERITED("scale") {
694b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        fSX = fSY = 1.5f;
703fb5187647397e056843c1f41a508992be22175dreed@google.com        fM0.reset();
713fb5187647397e056843c1f41a508992be22175dreed@google.com        fM1.setScale(fSX, fSY);
723fb5187647397e056843c1f41a508992be22175dreed@google.com        fM2.setTranslate(fSX, fSY);
733fb5187647397e056843c1f41a508992be22175dreed@google.com    }
743fb5187647397e056843c1f41a508992be22175dreed@google.comprotected:
753fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual void performTest() {
763fb5187647397e056843c1f41a508992be22175dreed@google.com        SkMatrix m;
773fb5187647397e056843c1f41a508992be22175dreed@google.com        m = fM0; m.preScale(fSX, fSY);
783fb5187647397e056843c1f41a508992be22175dreed@google.com        m = fM1; m.preScale(fSX, fSY);
793fb5187647397e056843c1f41a508992be22175dreed@google.com        m = fM2; m.preScale(fSX, fSY);
803fb5187647397e056843c1f41a508992be22175dreed@google.com    }
813fb5187647397e056843c1f41a508992be22175dreed@google.comprivate:
823fb5187647397e056843c1f41a508992be22175dreed@google.com    SkMatrix fM0, fM1, fM2;
833fb5187647397e056843c1f41a508992be22175dreed@google.com    SkScalar fSX, fSY;
843fb5187647397e056843c1f41a508992be22175dreed@google.com    typedef MatrixBench INHERITED;
853fb5187647397e056843c1f41a508992be22175dreed@google.com};
863fb5187647397e056843c1f41a508992be22175dreed@google.com
87e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// having unknown values in our arrays can throw off the timing a lot, perhaps
88e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// handling NaN values is a lot slower. Anyway, this guy is just meant to put
89e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// reasonable values in our arrays.
90e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.comtemplate <typename T> void init9(T array[9]) {
91e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom rand;
92e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com    for (int i = 0; i < 9; i++) {
93e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        array[i] = rand.nextSScalar1();
94e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com    }
95e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com}
96e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com
977b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// Test the performance of setConcat() non-perspective case:
987b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// using floating point precision only.
997b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comclass FloatConcatMatrixBench : public MatrixBench {
1007b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.compublic:
101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    FloatConcatMatrixBench() : INHERITED("concat_floatfloat") {
102e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(mya);
103e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(myb);
104e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(myr);
1057b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1067b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comprotected:
107cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com    virtual int mulLoopCount() const { return 4; }
108cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com
1097b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    static inline void muladdmul(float a, float b, float c, float d,
1107b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com                                   float* result) {
1117b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com      *result = a * b + c * d;
1127b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1137b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    virtual void performTest() {
114a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        const float* a = mya;
115a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        const float* b = myb;
116a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        float* r = myr;
1177b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[0], a[1], b[3], &r[0]);
1187b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[1], a[1], b[4], &r[1]);
1197b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[2], a[1], b[5], &r[2]);
120a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[2] += a[2];
1217b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[0], a[4], b[3], &r[3]);
1227b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[1], a[4], b[4], &r[4]);
1237b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[2], a[4], b[5], &r[5]);
124a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[5] += a[5];
125a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[6] = r[7] = 0.0f;
126a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[8] = 1.0f;
1277b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1287b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comprivate:
129a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    float mya [9];
130a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    float myb [9];
131a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    float myr [9];
1327b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    typedef MatrixBench INHERITED;
1337b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com};
1347b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
1357b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comstatic inline float SkDoubleToFloat(double x) {
1367b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    return static_cast<float>(x);
1377b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com}
1387b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
1397b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// Test the performance of setConcat() non-perspective case:
1407b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// using floating point precision but casting up to float for
1417b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// intermediate results during computations.
1427b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comclass FloatDoubleConcatMatrixBench : public MatrixBench {
1437b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.compublic:
144410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    FloatDoubleConcatMatrixBench() : INHERITED("concat_floatdouble") {
145e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(mya);
146e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(myb);
147e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(myr);
1487b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1497b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comprotected:
150cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com    virtual int mulLoopCount() const { return 4; }
151cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com
1527b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    static inline void muladdmul(float a, float b, float c, float d,
1537b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com                                   float* result) {
1547b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com      *result = SkDoubleToFloat((double)a * b + (double)c * d);
1557b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1567b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    virtual void performTest() {
157a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        const float* a = mya;
158a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        const float* b = myb;
159a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        float* r = myr;
1607b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[0], a[1], b[3], &r[0]);
1617b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[1], a[1], b[4], &r[1]);
1627b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[2], a[1], b[5], &r[2]);
163a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[2] += a[2];
1647b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[0], a[4], b[3], &r[3]);
1657b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[1], a[4], b[4], &r[4]);
1667b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[2], a[4], b[5], &r[5]);
167a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[5] += a[5];
168a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[6] = r[7] = 0.0f;
169a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[8] = 1.0f;
1707b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1717b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comprivate:
172a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    float mya [9];
173a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    float myb [9];
174a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    float myr [9];
1757b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    typedef MatrixBench INHERITED;
1767b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com};
1777b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
1787b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// Test the performance of setConcat() non-perspective case:
1797b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com// using double precision only.
1807b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comclass DoubleConcatMatrixBench : public MatrixBench {
1817b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.compublic:
182410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DoubleConcatMatrixBench() : INHERITED("concat_double") {
183e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(mya);
184e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(myb);
185e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        init9(myr);
1867b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1877b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comprotected:
188cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com    virtual int mulLoopCount() const { return 4; }
189cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com
1907b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    static inline void muladdmul(double a, double b, double c, double d,
1917b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com                                   double* result) {
1927b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com      *result = a * b + c * d;
1937b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
1947b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    virtual void performTest() {
195a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        const double* a = mya;
196a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        const double* b = myb;
197a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        double* r = myr;
1987b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[0], a[1], b[3], &r[0]);
1997b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[1], a[1], b[4], &r[1]);
2007b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[0], b[2], a[1], b[5], &r[2]);
201a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[2] += a[2];
2027b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[0], a[4], b[3], &r[3]);
2037b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[1], a[4], b[4], &r[4]);
2047b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com        muladdmul(a[3], b[2], a[4], b[5], &r[5]);
205a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[5] += a[5];
206a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[6] = r[7] = 0.0;
207a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com        r[8] = 1.0;
2087b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    }
2097b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.comprivate:
210a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    double mya [9];
211a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    double myb [9];
212a20416b010068df452fbfb1d2ccec9c855ae3dcctomhudson@google.com    double myr [9];
2137b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com    typedef MatrixBench INHERITED;
2147b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com};
2157b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
216317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comclass GetTypeMatrixBench : public MatrixBench {
217317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.compublic:
218410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    GetTypeMatrixBench()
219410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : INHERITED("gettype") {
220820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[0] = (float) fRnd.nextS();
221820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[1] = (float) fRnd.nextS();
222820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[2] = (float) fRnd.nextS();
223820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[3] = (float) fRnd.nextS();
224820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[4] = (float) fRnd.nextS();
225820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[5] = (float) fRnd.nextS();
226820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[6] = (float) fRnd.nextS();
227820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[7] = (float) fRnd.nextS();
228820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[8] = (float) fRnd.nextS();
229317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    }
230317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comprotected:
231317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    // Putting random generation of the matrix inside performTest()
232317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    // would help us avoid anomalous runs, but takes up 25% or
233317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    // more of the function time.
234317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    virtual void performTest() {
235317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.setAll(fArray[0], fArray[1], fArray[2],
236317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com                       fArray[3], fArray[4], fArray[5],
237317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com                       fArray[6], fArray[7], fArray[8]);
238cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        // xoring into a volatile prevents the compiler from optimizing these away
239cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        volatile int junk = 0;
240cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
241317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
242cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
243317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
244cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
245317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
246cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
247317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
248cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
249317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
250cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
251317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
252cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
253317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
254cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
255317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    }
256317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comprivate:
257317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    SkMatrix fMatrix;
258317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    float fArray[9];
259e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRnd;
260317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    typedef MatrixBench INHERITED;
261317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com};
262317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com
263288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.comclass ScaleTransMixedMatrixBench : public MatrixBench {
264288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com public:
265410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ScaleTransMixedMatrixBench() : INHERITED("scaletrans_mixed") {
2663d3dfe011ca477ed96ccac2d1a293cd302fb245ebsalomon@google.com        fMatrix.setAll(fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(),
2673d3dfe011ca477ed96ccac2d1a293cd302fb245ebsalomon@google.com                       fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(),
2683d3dfe011ca477ed96ccac2d1a293cd302fb245ebsalomon@google.com                       fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1());
269288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        int i;
2707731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org        for (i = 0; i < kCount; i++) {
271820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fSrc[i].fX = fRandom.nextSScalar1();
272820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fSrc[i].fY = fRandom.nextSScalar1();
273820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fDst[i].fX = fRandom.nextSScalar1();
274820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fDst[i].fY = fRandom.nextSScalar1();
275288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        }
276288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    }
277288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com protected:
278288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    virtual void performTest() {
279288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        SkPoint* dst = fDst;
280288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        const SkPoint* src = fSrc;
2817731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org        int count = kCount;
282288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        float mx = fMatrix[SkMatrix::kMScaleX];
283288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        float my = fMatrix[SkMatrix::kMScaleY];
284288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        float tx = fMatrix[SkMatrix::kMTransX];
285288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        float ty = fMatrix[SkMatrix::kMTransY];
286288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        do {
287288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            dst->fY = SkScalarMulAdd(src->fY, my, ty);
288288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            dst->fX = SkScalarMulAdd(src->fX, mx, tx);
289288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            src += 1;
290288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            dst += 1;
291288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        } while (--count);
292288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    }
293288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com private:
2947731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org    enum {
295c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        kCount = 16
2967731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org    };
297288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    SkMatrix fMatrix;
298c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    SkPoint fSrc [kCount];
299c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    SkPoint fDst [kCount];
300e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRandom;
301288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    typedef MatrixBench INHERITED;
302288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com};
303288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
304288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.comclass ScaleTransDoubleMatrixBench : public MatrixBench {
305288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com public:
306410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ScaleTransDoubleMatrixBench() : INHERITED("scaletrans_double") {
307288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        init9(fMatrix);
308288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        int i;
3097731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org        for (i = 0; i < kCount; i++) {
310820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fSrc[i].fX = fRandom.nextSScalar1();
311820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fSrc[i].fY = fRandom.nextSScalar1();
312820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fDst[i].fX = fRandom.nextSScalar1();
313820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com            fDst[i].fY = fRandom.nextSScalar1();
314288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        }
315288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    }
316288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com protected:
317288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    virtual void performTest() {
318288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        SkPoint* dst = fDst;
319288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        const SkPoint* src = fSrc;
3207731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org        int count = kCount;
321288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        // As doubles, on Z600 Linux systems this is 2.5x as expensive as mixed mode
322820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        float mx = (float) fMatrix[SkMatrix::kMScaleX];
323820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        float my = (float) fMatrix[SkMatrix::kMScaleY];
324820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        float tx = (float) fMatrix[SkMatrix::kMTransX];
325820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        float ty = (float) fMatrix[SkMatrix::kMTransY];
326288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        do {
327288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            dst->fY = src->fY * my + ty;
328288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            dst->fX = src->fX * mx + tx;
329288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            src += 1;
330288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com            dst += 1;
331288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com        } while (--count);
332288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    }
333288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com private:
3347731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org    enum {
335c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        kCount = 16
3367731eada5bfeb14db403cfee5c1439198c39a05btfarina@chromium.org    };
337288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    double fMatrix [9];
338c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    SkPoint fSrc [kCount];
339c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    SkPoint fDst [kCount];
340e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRandom;
341288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com    typedef MatrixBench INHERITED;
342288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com};
343288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
3445b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgclass DecomposeMatrixBench : public MatrixBench {
3455b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgpublic:
346410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DecomposeMatrixBench() : INHERITED("decompose") {}
3475b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org
3485b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgprotected:
3495b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    virtual void onPreDraw() {
3505b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
3515b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar rot0 = (fRandom.nextBool()) ? fRandom.nextRangeF(-180, 180) : 0.0f;
3525b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar sx = fRandom.nextRangeF(-3000.f, 3000.f);
3535b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar sy = (fRandom.nextBool()) ? fRandom.nextRangeF(-3000.f, 3000.f) : sx;
3545b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar rot1 = fRandom.nextRangeF(-180, 180);
3555b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            fMatrix[i].setRotate(rot0);
3565b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            fMatrix[i].postScale(sx, sy);
3575b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            fMatrix[i].postRotate(rot1);
3585b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        }
3595b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    }
3605b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    virtual void performTest() {
3615b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        SkPoint rotation1, scale, rotation2;
3625b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
3635b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            (void) SkDecomposeUpper2x2(fMatrix[i], &rotation1, &scale, &rotation2);
3645b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        }
3655b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    }
3665b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgprivate:
3675b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    SkMatrix fMatrix[10];
368e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRandom;
3695b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    typedef MatrixBench INHERITED;
3705b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org};
3715b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org
3726fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgclass InvertMapRectMatrixBench : public MatrixBench {
3736fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgpublic:
374410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    InvertMapRectMatrixBench(const char* name, int flags)
375410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : INHERITED(name)
3766fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        , fFlags(flags) {
3776fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        fMatrix.reset();
3786fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        fIteration = 0;
3796fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kScale_Flag) {
3804b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.postScale(1.5f, 2.5f);
3816fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
3826fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kTranslate_Flag) {
3834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.postTranslate(1.5f, 2.5f);
3846fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
3856fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kRotate_Flag) {
3864b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.postRotate(45.0f);
3876fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
3886fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kPerspective_Flag) {
3894b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.setPerspX(1.5f);
3904b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.setPerspY(2.5f);
3916fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
3926fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (0 == (flags & kUncachedTypeMask_Flag)) {
3936fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            fMatrix.getType();
3946fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
3956fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    }
3966fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    enum Flag {
3976fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kScale_Flag             = 0x01,
3986fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kTranslate_Flag         = 0x02,
3996fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kRotate_Flag            = 0x04,
4006fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kPerspective_Flag       = 0x08,
4016fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kUncachedTypeMask_Flag  = 0x10,
4026fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    };
4036fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgprotected:
4046fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    virtual void performTest() {
4056fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (fFlags & kUncachedTypeMask_Flag) {
4066fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            // This will invalidate the typemask without
4076fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            // changing the matrix.
4086fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            fMatrix.setPerspX(fMatrix.getPerspX());
4096fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
4106fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        SkMatrix inv;
41131f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com        bool invertible = fMatrix.invert(&inv);
4126fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        SkASSERT(invertible);
4136fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        SkRect transformedRect;
41431f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com        // an arbitrary, small, non-zero rect to transform
41531f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com        SkRect srcRect = SkRect::MakeWH(SkIntToScalar(10), SkIntToScalar(10));
4166fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (invertible) {
41731f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com            inv.mapRect(&transformedRect, srcRect);
4186fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
4196fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    }
4206fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgprivate:
4216fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    SkMatrix fMatrix;
4226fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    int fFlags;
4236fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    unsigned fIteration;
4246fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    typedef MatrixBench INHERITED;
4256fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org};
426288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
42782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com///////////////////////////////////////////////////////////////////////////////
428288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
429410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new EqualsMatrixBench(); )
430410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ScaleMatrixBench(); )
431410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new FloatConcatMatrixBench(); )
432410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new FloatDoubleConcatMatrixBench(); )
433410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DoubleConcatMatrixBench(); )
434410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GetTypeMatrixBench(); )
435410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DecomposeMatrixBench(); )
4365b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org
437410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench("invert_maprect_identity", 0); )
438288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
439410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench(
44090533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  "invert_maprect_rectstaysrect",
44190533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  InvertMapRectMatrixBench::kScale_Flag |
44290533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  InvertMapRectMatrixBench::kTranslate_Flag); )
44390533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com
444410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench(
44590533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  "invert_maprect_translate",
44690533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  InvertMapRectMatrixBench::kTranslate_Flag); )
4477b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
448410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench(
44982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  "invert_maprect_nonpersp",
45082bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  InvertMapRectMatrixBench::kScale_Flag |
45182bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  InvertMapRectMatrixBench::kRotate_Flag |
45282bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  InvertMapRectMatrixBench::kTranslate_Flag); )
45382bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com
454410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench(
45582bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                               "invert_maprect_persp",
45682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                               InvertMapRectMatrixBench::kPerspective_Flag); )
45782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com
458410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench(
45982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           "invert_maprect_typemask_rectstaysrect",
46082bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kUncachedTypeMask_Flag |
46182bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kScale_Flag |
46282bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kTranslate_Flag); )
46382bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com
464410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench(
46582bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           "invert_maprect_typemask_nonpersp",
46682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kUncachedTypeMask_Flag |
46782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kScale_Flag |
46882bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kRotate_Flag |
46982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kTranslate_Flag); )
4703fb5187647397e056843c1f41a508992be22175dreed@google.com
471410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ScaleTransMixedMatrixBench(); )
472410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ScaleTransDoubleMatrixBench(); )
473