1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/*
2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc.
3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger *
4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file.
6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */
7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkBenchmark.h"
9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkMatrix44.h"
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkRandom.h"
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkString.h"
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass Matrix44Bench : public SkBenchmark {
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkString    fName;
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    enum { N = 10000 };
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    Matrix44Bench(void* param, const char name[]) : INHERITED(param) {
18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fName.printf("matrix44_%s", name);
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fIsRendering = false;
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() = 0;
23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual int mulLoopCount() const { return 1; }
26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual const char* onGetName() {
28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        return fName.c_str();
29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    virtual void onDraw(SkCanvas*) {
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        int n = SkBENCHLOOP(N * this->mulLoopCount());
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < n; i++) {
34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            this->performTest();
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef SkBenchmark INHERITED;
40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass EqualsMatrix44Bench : public Matrix44Bench {
43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    EqualsMatrix44Bench(void* param) : INHERITED(param, "equals") {
45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM1.set(0, 0, 0);
46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM2.set(3, 3, 0);
47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() {
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < 10; ++i) {
51d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            (void) (fM0 == fM1);
52d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            (void) (fM1 == fM2);
53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            (void) (fM2 == fM0);
54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMatrix44 fM0, fM1, fM2;
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef Matrix44Bench INHERITED;
59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass PreScaleMatrix44Bench : public Matrix44Bench {
62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    PreScaleMatrix44Bench(void* param) : INHERITED(param, "prescale") {
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fX = fY = fZ = SkDoubleToMScalar(1.5);
65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() {
68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM0.reset();
69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < 10; ++i) {
70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fM0.preScale(fX, fY, fZ);
71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMatrix44 fM0;
75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMScalar  fX, fY, fZ;
76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef Matrix44Bench INHERITED;
77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass InvertMatrix44Bench : public Matrix44Bench {
80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    InvertMatrix44Bench(void* param) : INHERITED(param, "invert") {
82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(0, 0, -1.1);
83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(0, 1, 2.1);
84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(0, 2, -3.1);
85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(0, 3, 4.1);
86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(1, 0, 5.1);
87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(1, 1, -6.1);
88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(1, 2, 7.1);
89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(1, 3, 8.1);
90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(2, 0, -9.1);
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(2, 1, 10.1);
92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(2, 2, 11.1);
93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(2, 3, -12.1);
94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(3, 0, -13.1);
95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(3, 1, 14.1);
96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(3, 2, -15.1);
97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fM0.set(3, 3, 16.1);
98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() {
101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < 10; ++i) {
102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fM0.invert(&fM1);
103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMatrix44 fM0, fM1;
107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef Matrix44Bench INHERITED;
108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass PostScaleMatrix44Bench : public Matrix44Bench {
111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    PostScaleMatrix44Bench(void* param) : INHERITED(param, "postscale") {
113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fX = fY = fZ = SkDoubleToMScalar(1.5);
114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() {
117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM0.reset();
118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < 10; ++i) {
119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fM0.postScale(fX, fY, fZ);
120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMatrix44 fM0;
124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMScalar  fX, fY, fZ;
125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef Matrix44Bench INHERITED;
126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SetConcatMatrix44Bench : public Matrix44Bench {
129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SetConcatMatrix44Bench(void* param) : INHERITED(param, "setconcat") {
131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fX = fY = fZ = SkDoubleToMScalar(1.5);
132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM1.setScale(fX, fY, fZ);
133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM2.setTranslate(fX, fY, fZ);
134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
136363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() {
137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fM0.reset();    // just to normalize this test with prescale/postscale
138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < 10; ++i) {
139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fM0.setConcat(fM1, fM2);
140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMatrix44 fM0, fM1, fM2;
144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMScalar  fX, fY, fZ;
145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef Matrix44Bench INHERITED;
146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
148363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GetTypeMatrix44Bench : public Matrix44Bench {
149363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    GetTypeMatrix44Bench(void* param) : INHERITED(param, "gettype") {}
151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // Putting random generation of the matrix inside performTest()
153363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // would help us avoid anomalous runs, but takes up 25% or
154363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // more of the function time.
155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void performTest() {
156363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        for (int i = 0; i < 20; ++i) {
157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fMatrix.set(1, 2, 1);   // to invalidate the type-cache
158363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fMatrix.getType();
159363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
160363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
161363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
162363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkMatrix44 fMatrix;
163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef Matrix44Bench INHERITED;
164363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
165363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new EqualsMatrix44Bench(p); )
167363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new PreScaleMatrix44Bench(p); )
168363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new PostScaleMatrix44Bench(p); )
169363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new InvertMatrix44Bench(p); )
170363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new SetConcatMatrix44Bench(p); )
171363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new GetTypeMatrix44Bench(p); )
172