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
2036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) 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
29f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
307d68335eb427547606497eb4edea81acce7891f9reed@google.com        return fName.c_str();
317d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
327d68335eb427547606497eb4edea81acce7891f9reed@google.com
332880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDraw(int loops, SkCanvas*) override {
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:
55f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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:
81f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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:
100f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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    {
1191831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 0, -1.1);
1201831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 1, 2.1);
1211831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 2, -3.1);
1221831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 3, 4.1);
1231831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 0, 5.1);
1241831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 1, -6.1);
1251831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 2, 7.1);
1261831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 3, 8.1);
1271831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 0, -9.1);
1281831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 1, 10.1);
1291831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 2, 11.1);
1301831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 3, -12.1);
1311831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(3, 0, -13.1);
1321831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(3, 1, 14.1);
1331831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(3, 2, -15.1);
1341831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(3, 3, 16.1);
135950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
136950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprotected:
137f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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    {
1541831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 0, -1.1);
1551831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 1, 2.1);
1561831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 2, -3.1);
1571831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 3, 4.1);
1581831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 0, 5.1);
1591831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 1, -6.1);
1601831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 2, 7.1);
1611831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 3, 8.1);
1621831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 0, -9.1);
1631831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 1, 10.1);
1641831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 2, 11.1);
1651831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(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:
169f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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    {
1861831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 0, -1.1);
1871831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 3, 4.1);
188950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
1891831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 1, -6.1);
1901831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 3, 8.1);
191950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org
1921831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 2, 11.1);
1931831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 3, -12.1);
194950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.org    }
195950457543860eb1c545e0ef8bb2c20e2ddc6196ecommit-bot@chromium.orgprotected:
196f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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    {
2131831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(0, 3, 4.1);
2141831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(1, 3, 8.1);
2151831f990c31bad0d84641663c96aa8eebf846ab9mtklein        fM0.setDouble(2, 3, -12.1);
2169973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.com    }
2179973a8a396957afb66c9ba5ee40f829770619ce3tomhudson@google.comprotected:
218f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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:
237f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
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:
251c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein    // SkMatrix44::setConcat() has a fast path for matrices that are at most scale+translate.
252c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein    SetConcatMatrix44Bench(bool fastPath)
253c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein        : INHERITED(fastPath ? "setconcat_fast" : "setconcat_general")
2544469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM0(SkMatrix44::kUninitialized_Constructor)
2554469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM1(SkMatrix44::kUninitialized_Constructor)
2564469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fM2(SkMatrix44::kUninitialized_Constructor)
2574469938e92d779dff05e745559e67907bbf21e78reed@google.com{
258c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein        if (fastPath) {
259c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            const SkMScalar v = SkDoubleToMScalar(1.5);
260c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            fM1.setScale(v,v,v);
261c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            fM2.setTranslate(v,v,v);
262c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein        } else {
263c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            SkRandom rand;
264c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            for (int x = 0; x < 4; x++) {
265c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            for (int y = 0; y < 4; y++) {
266c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein                fM1.setFloat(x,y, rand.nextF());
267c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein                fM2.setFloat(x,y, rand.nextF());
268c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein            }}
269c6c6a91ff2356163d9abf9233ff0f025738940f8mtklein        }
2707d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2717d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
272f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
2737d68335eb427547606497eb4edea81acce7891f9reed@google.com        fM0.reset();    // just to normalize this test with prescale/postscale
274257918898a2353e44a45234af48828f9dd6ccb6fmtklein        for (int i = 0; i < 10000; ++i) {
2757d68335eb427547606497eb4edea81acce7891f9reed@google.com            fM0.setConcat(fM1, fM2);
2767d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
2777d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2787d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
2797d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fM0, fM1, fM2;
2807d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
2817d68335eb427547606497eb4edea81acce7891f9reed@google.com};
2827d68335eb427547606497eb4edea81acce7891f9reed@google.com
2837d68335eb427547606497eb4edea81acce7891f9reed@google.comclass GetTypeMatrix44Bench : public Matrix44Bench {
2847d68335eb427547606497eb4edea81acce7891f9reed@google.compublic:
2854469938e92d779dff05e745559e67907bbf21e78reed@google.com    GetTypeMatrix44Bench()
2864469938e92d779dff05e745559e67907bbf21e78reed@google.com        : INHERITED("gettype")
2874469938e92d779dff05e745559e67907bbf21e78reed@google.com        , fMatrix(SkMatrix44::kIdentity_Constructor)
2884469938e92d779dff05e745559e67907bbf21e78reed@google.com    {}
2897d68335eb427547606497eb4edea81acce7891f9reed@google.comprotected:
2907d68335eb427547606497eb4edea81acce7891f9reed@google.com    // Putting random generation of the matrix inside performTest()
2917d68335eb427547606497eb4edea81acce7891f9reed@google.com    // would help us avoid anomalous runs, but takes up 25% or
2927d68335eb427547606497eb4edea81acce7891f9reed@google.com    // more of the function time.
293f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void performTest() override {
2947d68335eb427547606497eb4edea81acce7891f9reed@google.com        for (int i = 0; i < 20; ++i) {
2957d68335eb427547606497eb4edea81acce7891f9reed@google.com            fMatrix.set(1, 2, 1);   // to invalidate the type-cache
2967d68335eb427547606497eb4edea81acce7891f9reed@google.com            fMatrix.getType();
2977d68335eb427547606497eb4edea81acce7891f9reed@google.com        }
2987d68335eb427547606497eb4edea81acce7891f9reed@google.com    }
2997d68335eb427547606497eb4edea81acce7891f9reed@google.comprivate:
3007d68335eb427547606497eb4edea81acce7891f9reed@google.com    SkMatrix44 fMatrix;
3017d68335eb427547606497eb4edea81acce7891f9reed@google.com    typedef Matrix44Bench INHERITED;
3027d68335eb427547606497eb4edea81acce7891f9reed@google.com};
3037d68335eb427547606497eb4edea81acce7891f9reed@google.com
304410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SetIdentityMatrix44Bench(); )
305410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new EqualsMatrix44Bench(); )
306410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PreScaleMatrix44Bench(); )
307410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PostScaleMatrix44Bench(); )
308410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMatrix44Bench(); )
309410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertAffineMatrix44Bench(); )
310410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertScaleTranslateMatrix44Bench(); )
311410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertTranslateMatrix44Bench(); )
312c6c6a91ff2356163d9abf9233ff0f025738940f8mtkleinDEF_BENCH( return new SetConcatMatrix44Bench(true); )
313c6c6a91ff2356163d9abf9233ff0f025738940f8mtkleinDEF_BENCH( return new SetConcatMatrix44Bench(false); )
314410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GetTypeMatrix44Bench(); )
315