17d68335eb427547606497eb4edea81acce7891f9reed@google.com/*
27d68335eb427547606497eb4edea81acce7891f9reed@google.com * Copyright 2012 Google Inc.
37d68335eb427547606497eb4edea81acce7891f9reed@google.com *
47d68335eb427547606497eb4edea81acce7891f9reed@google.com * Use of this source code is governed by a BSD-style license that can be
57d68335eb427547606497eb4edea81acce7891f9reed@google.com * found in the LICENSE file.
67d68335eb427547606497eb4edea81acce7891f9reed@google.com */
77d68335eb427547606497eb4edea81acce7891f9reed@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
97d68335eb427547606497eb4edea81acce7891f9reed@google.com#include "SkMatrix44.h"
107d68335eb427547606497eb4edea81acce7891f9reed@google.com#include "SkRandom.h"
117d68335eb427547606497eb4edea81acce7891f9reed@google.com#include "SkString.h"
127d68335eb427547606497eb4edea81acce7891f9reed@google.com
13f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass Matrix44Bench : public Benchmark {
147d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkString    fName;
157d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
164469938e92d779dff05e745559e67907bbf21e78reed@google.com    Matrix44Bench(const char name[]) {
177d68335eb427547606497eb4edea81acce7891f9reed@google.com        fName.printf("matrix44_%s", name);
18644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
21644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
227d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
237d68335eb427547606497eb4edea81acce7891f9reed@google.com
247d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual void performTest() = 0;
257d68335eb427547606497eb4edea81acce7891f9reed@google.com
267d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
277d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual int mulLoopCount() const { return 1; }
287d68335eb427547606497eb4edea81acce7891f9reed@google.com
297d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual const char* onGetName() {
307d68335eb427547606497eb4edea81acce7891f9reed@google.com        return fName.c_str();
317d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
327d68335eb427547606497eb4edea81acce7891f9reed@google.com
333361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
357d68335eb427547606497eb4edea81acce7891f9reed@google.com            this->performTest();
367d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
377d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
387d68335eb427547606497eb4edea81acce7891f9reed@google.com
397d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
40f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
417d68335eb427547606497eb4edea81acce7891f9reed@google.com};
427d68335eb427547606497eb4edea81acce7891f9reed@google.com
437d68335eb427547606497eb4edea81acce7891f9reed@google.comclass EqualsMatrix44Bench : public Matrix44Bench {
447d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
454469938e92d779dff05e745559e67907bbf21e78reed@google.com    EqualsMatrix44Bench()
464469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("equals")
474469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kIdentity_Constructor)
484469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kIdentity_Constructor)
494469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM2(SkMatrix44::kIdentity_Constructor)
504469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
517d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM1.set(0, 0, 0);
527d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM2.set(3, 3, 0);
537d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
547d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
557d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual void performTest() {
567d68335eb427547606497eb4edea81acce7891f9reed@google.com        for (int i = 0; i < 10; ++i) {
5705af1afd429808913683da75644e48bece12e820humper@google.com            (void) (fM0 == fM1);
5805af1afd429808913683da75644e48bece12e820humper@google.com            (void) (fM1 == fM2);
5905af1afd429808913683da75644e48bece12e820humper@google.com            (void) (fM2 == fM0);
607d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
617d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
627d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
637d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fM0, fM1, fM2;
647d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
657d68335eb427547606497eb4edea81acce7891f9reed@google.com};
667d68335eb427547606497eb4edea81acce7891f9reed@google.com
6763bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.orgclass SetIdentityMatrix44Bench : public Matrix44Bench {
6863bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.orgpublic:
694469938e92d779dff05e745559e67907bbf21e78reed@google.com    SetIdentityMatrix44Bench()
704469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("setidentity")
714469938e92d779dff05e745559e67907bbf21e78reed@google.com        , mat(SkMatrix44::kIdentity_Constructor)
724469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
7363bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org        double rowMajor[16] =
7463bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org                { 1, 2, 3, 4,
7563bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org                  5, 6, 7, 8,
7663bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org                  9, 10, 11, 12,
7763bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org                  13, 14, 15, 16};
7863bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org        mat.setRowMajord(rowMajor);
7963bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org    }
8063bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.orgprotected:
8163bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org    virtual void performTest() {
8263bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org        for (int i = 0; i < 10; ++i) {
8363bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org            mat.setIdentity();
8463bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org        }
8563bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org    }
8663bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.orgprivate:
8763bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org    SkMatrix44 mat;
8863bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org    typedef Matrix44Bench INHERITED;
8963bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org};
9063bf68df05b965d80875d4f3c9b30b0fa456762eshawnsingh@chromium.org
917d68335eb427547606497eb4edea81acce7891f9reed@google.comclass PreScaleMatrix44Bench : public Matrix44Bench {
927d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
934469938e92d779dff05e745559e67907bbf21e78reed@google.com    PreScaleMatrix44Bench()
944469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("prescale")
954469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kUninitialized_Constructor)
964469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
977d68335eb427547606497eb4edea81acce7891f9reed@google.com        fX = fY = fZ = SkDoubleToMScalar(1.5);
987d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
997d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
1007d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual void performTest() {
1017d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM0.reset();
1027d68335eb427547606497eb4edea81acce7891f9reed@google.com        for (int i = 0; i < 10; ++i) {
1037d68335eb427547606497eb4edea81acce7891f9reed@google.com            fM0.preScale(fX, fY, fZ);
1047d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
1057d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
1067d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
1077d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fM0;
1087d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMScalar  fX, fY, fZ;
1097d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
1107d68335eb427547606497eb4edea81acce7891f9reed@google.com};
1117d68335eb427547606497eb4edea81acce7891f9reed@google.com
1129973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.comclass InvertMatrix44Bench : public Matrix44Bench {
1139973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.compublic:
1144469938e92d779dff05e745559e67907bbf21e78reed@google.com    InvertMatrix44Bench()
1154469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("invert")
1164469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kUninitialized_Constructor)
1174469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kUninitialized_Constructor)
1184469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
119950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 0, -1.1);
120950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 1, 2.1);
121950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 2, -3.1);
122950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 3, 4.1);
123950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 0, 5.1);
124950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 1, -6.1);
125950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 2, 7.1);
126950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 3, 8.1);
127950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 0, -9.1);
128950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 1, 10.1);
129950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 2, 11.1);
130950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 3, -12.1);
131950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(3, 0, -13.1);
132950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(3, 1, 14.1);
133950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(3, 2, -15.1);
134950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(3, 3, 16.1);
135950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
136950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprotected:
137950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    virtual void performTest() {
138950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
139950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org            fM0.invert(&fM1);
140950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        }
141950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
142950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprivate:
143950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    SkMatrix44 fM0, fM1;
144950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    typedef Matrix44Bench INHERITED;
145950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org};
146950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
147950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgclass InvertAffineMatrix44Bench : public Matrix44Bench {
148950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgpublic:
1494469938e92d779dff05e745559e67907bbf21e78reed@google.com    InvertAffineMatrix44Bench()
1504469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("invertaffine")
1514469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kIdentity_Constructor)
1524469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kUninitialized_Constructor)
1534469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
154950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 0, -1.1);
155950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 1, 2.1);
156950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 2, -3.1);
157950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 3, 4.1);
158950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 0, 5.1);
159950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 1, -6.1);
160950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 2, 7.1);
161950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 3, 8.1);
162950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 0, -9.1);
163950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 1, 10.1);
164950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 2, 11.1);
165950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 3, -12.1);
166950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        // bottom row (perspective component) remains (0, 0, 0, 1).
167950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
168950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprotected:
169950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    virtual void performTest() {
170950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
171950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org            fM0.invert(&fM1);
172950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        }
173950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
174950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprivate:
175950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    SkMatrix44 fM0, fM1;
176950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    typedef Matrix44Bench INHERITED;
177950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org};
178950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
179950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgclass InvertScaleTranslateMatrix44Bench : public Matrix44Bench {
180950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgpublic:
1814469938e92d779dff05e745559e67907bbf21e78reed@google.com    InvertScaleTranslateMatrix44Bench()
1824469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("invertscaletranslate")
1834469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kIdentity_Constructor)
1844469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kUninitialized_Constructor)
1854469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
186950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 0, -1.1);
187950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 3, 4.1);
188950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
189950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 1, -6.1);
190950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 3, 8.1);
191950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
192950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 2, 11.1);
193950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 3, -12.1);
194950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
195950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprotected:
196950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    virtual void performTest() {
197950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
198950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org            fM0.invert(&fM1);
199950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        }
200950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
201950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprivate:
202950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    SkMatrix44 fM0, fM1;
203950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    typedef Matrix44Bench INHERITED;
204950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org};
205950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
206950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgclass InvertTranslateMatrix44Bench : public Matrix44Bench {
207950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgpublic:
2084469938e92d779dff05e745559e67907bbf21e78reed@google.com    InvertTranslateMatrix44Bench()
2094469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("inverttranslate")
2104469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kIdentity_Constructor)
2114469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kUninitialized_Constructor)
2124469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
213950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(0, 3, 4.1);
214950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(1, 3, 8.1);
215950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org        fM0.set(2, 3, -12.1);
2169973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com    }
2179973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.comprotected:
2189973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com    virtual void performTest() {
2199973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com        for (int i = 0; i < 10; ++i) {
2209973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com            fM0.invert(&fM1);
2219973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com        }
2229973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com    }
2239973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.comprivate:
2249973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com    SkMatrix44 fM0, fM1;
2259973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com    typedef Matrix44Bench INHERITED;
2269973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com};
2279973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com
2287d68335eb427547606497eb4edea81acce7891f9reed@google.comclass PostScaleMatrix44Bench : public Matrix44Bench {
2297d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
2304469938e92d779dff05e745559e67907bbf21e78reed@google.com    PostScaleMatrix44Bench()
2314469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("postscale")
2324469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kUninitialized_Constructor)
2334469938e92d779dff05e745559e67907bbf21e78reed@google.com    {
2347d68335eb427547606497eb4edea81acce7891f9reed@google.com        fX = fY = fZ = SkDoubleToMScalar(1.5);
2357d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2367d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
2377d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual void performTest() {
2387d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM0.reset();
2397d68335eb427547606497eb4edea81acce7891f9reed@google.com        for (int i = 0; i < 10; ++i) {
2407d68335eb427547606497eb4edea81acce7891f9reed@google.com            fM0.postScale(fX, fY, fZ);
2417d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
2427d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2437d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
2447d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fM0;
2457d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMScalar  fX, fY, fZ;
2467d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
2477d68335eb427547606497eb4edea81acce7891f9reed@google.com};
2487d68335eb427547606497eb4edea81acce7891f9reed@google.com
2497d68335eb427547606497eb4edea81acce7891f9reed@google.comclass SetConcatMatrix44Bench : public Matrix44Bench {
2507d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
2514469938e92d779dff05e745559e67907bbf21e78reed@google.com    SetConcatMatrix44Bench()
2524469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("setconcat")
2534469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kUninitialized_Constructor)
2544469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kUninitialized_Constructor)
2554469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM2(SkMatrix44::kUninitialized_Constructor)
2564469938e92d779dff05e745559e67907bbf21e78reed@google.com{
2577d68335eb427547606497eb4edea81acce7891f9reed@google.com        fX = fY = fZ = SkDoubleToMScalar(1.5);
2587d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM1.setScale(fX, fY, fZ);
2597d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM2.setTranslate(fX, fY, fZ);
2607d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2617d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
2627d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual void performTest() {
2637d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM0.reset();    // just to normalize this test with prescale/postscale
2647d68335eb427547606497eb4edea81acce7891f9reed@google.com        for (int i = 0; i < 10; ++i) {
2657d68335eb427547606497eb4edea81acce7891f9reed@google.com            fM0.setConcat(fM1, fM2);
2667d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
2677d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2687d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
2697d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fM0, fM1, fM2;
2707d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMScalar  fX, fY, fZ;
2717d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
2727d68335eb427547606497eb4edea81acce7891f9reed@google.com};
2737d68335eb427547606497eb4edea81acce7891f9reed@google.com
2747d68335eb427547606497eb4edea81acce7891f9reed@google.comclass GetTypeMatrix44Bench : public Matrix44Bench {
2757d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
2764469938e92d779dff05e745559e67907bbf21e78reed@google.com    GetTypeMatrix44Bench()
2774469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("gettype")
2784469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fMatrix(SkMatrix44::kIdentity_Constructor)
2794469938e92d779dff05e745559e67907bbf21e78reed@google.com    {}
2807d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
2817d68335eb427547606497eb4edea81acce7891f9reed@google.com    // Putting random generation of the matrix inside performTest()
2827d68335eb427547606497eb4edea81acce7891f9reed@google.com    // would help us avoid anomalous runs, but takes up 25% or
2837d68335eb427547606497eb4edea81acce7891f9reed@google.com    // more of the function time.
2847d68335eb427547606497eb4edea81acce7891f9reed@google.com    virtual void performTest() {
2857d68335eb427547606497eb4edea81acce7891f9reed@google.com        for (int i = 0; i < 20; ++i) {
2867d68335eb427547606497eb4edea81acce7891f9reed@google.com            fMatrix.set(1, 2, 1);   // to invalidate the type-cache
2877d68335eb427547606497eb4edea81acce7891f9reed@google.com            fMatrix.getType();
2887d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
2897d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2907d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
2917d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fMatrix;
2927d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
2937d68335eb427547606497eb4edea81acce7891f9reed@google.com};
2947d68335eb427547606497eb4edea81acce7891f9reed@google.com
295410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SetIdentityMatrix44Bench(); )
296410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new EqualsMatrix44Bench(); )
297410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PreScaleMatrix44Bench(); )
298410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PostScaleMatrix44Bench(); )
299410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMatrix44Bench(); )
300410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertAffineMatrix44Bench(); )
301410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertScaleTranslateMatrix44Bench(); )
302410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertTranslateMatrix44Bench(); )
303410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SetConcatMatrix44Bench(); )
304410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GetTypeMatrix44Bench(); )
305