1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "bench/Benchmark.h"
9 #include "include/core/SkM44.h"
10 #include "include/core/SkString.h"
11 #include "include/utils/SkRandom.h"
12 
13 class M4Bench : public Benchmark {
14     SkString    fName;
15 public:
M4Bench(const char name[])16     M4Bench(const char name[]) {
17         fName.printf("m4_%s", name);
18 
19         SkRandom rand;
20         float value[32];
21         for (auto& v : value) {
22             v = rand.nextF();
23         }
24         fM1 = SkM44::ColMajor(value + 0);
25         fM2 = SkM44::ColMajor(value + 16);
26     }
27 
isSuitableFor(Backend backend)28     bool isSuitableFor(Backend backend) override {
29         return backend == kNonRendering_Backend;
30     }
31 
32     virtual void performTest() = 0;
33 
34 protected:
35     SkM44 fM0, fM1, fM2;
36 
mulLoopCount() const37     virtual int mulLoopCount() const { return 1; }
38 
onGetName()39     const char* onGetName() override {
40         return fName.c_str();
41     }
42 
onDraw(int loops,SkCanvas *)43     void onDraw(int loops, SkCanvas*) override {
44         for (int i = 0; i < loops; i++) {
45             this->performTest();
46         }
47     }
48 
49 private:
50     using INHERITED = Benchmark;
51 };
52 
53 class M4NEQ : public M4Bench {
54 public:
M4NEQ()55     M4NEQ() : INHERITED("neq") {}
56 protected:
performTest()57     void performTest() override {
58         for (int i = 0; i < 10000; ++i) {
59             fEQ = (fM2 == fM1); // should always be false
60         }
61     }
62 private:
63     bool fEQ;
64     using INHERITED = M4Bench;
65 };
66 
67 class M4EQ : public M4Bench {
68 public:
M4EQ()69     M4EQ() : INHERITED("eq") {}
70 protected:
performTest()71     void performTest() override {
72         fM2 = fM1;
73         for (int i = 0; i < 10000; ++i) {
74             fEQ = (fM2 == fM1); // should always be true
75         }
76     }
77 private:
78     bool fEQ;
79     using INHERITED = M4Bench;
80 };
81 
82 class M4Concat : public M4Bench {
83 public:
M4Concat()84     M4Concat() : INHERITED("op_concat") {}
85 protected:
performTest()86     void performTest() override {
87         for (int i = 0; i < 10000; ++i) {
88             fM0 = SkM44(fM1, fM2);
89         }
90     }
91 private:
92     using INHERITED = M4Bench;
93 };
94 
95 class M4SetConcat : public M4Bench {
96 public:
M4SetConcat()97     M4SetConcat() : INHERITED("set_concat") {}
98 protected:
performTest()99     void performTest() override {
100         for (int i = 0; i < 10000; ++i) {
101             fM0.setConcat(fM1, fM2);
102         }
103     }
104 private:
105     using INHERITED = M4Bench;
106 };
107 
108 DEF_BENCH( return new M4EQ(); )
109 DEF_BENCH( return new M4NEQ(); )
110 DEF_BENCH( return new M4Concat(); )
111 DEF_BENCH( return new M4SetConcat(); )
112 
113 class M4_map4 : public M4Bench {
114 public:
M4_map4()115     M4_map4() : INHERITED("map4") {}
116 protected:
performTest()117     void performTest() override {
118         SkV4 v = {1, 2, 3, 4};
119         for (int i = 0; i < 100000; ++i) {
120             fV = fM0 * v;
121         }
122     }
123 private:
124     SkV4 fV;
125     using INHERITED = M4Bench;
126 };
127 DEF_BENCH( return new M4_map4(); )
128 
129 class M4_map2 : public M4Bench {
130 public:
M4_map2()131     M4_map2() : INHERITED("map2") {}
132 protected:
performTest()133     void performTest() override {
134         SkMatrix m;
135         m.setRotate(1);
136         for (int i = 0; i < 100000; ++i) {
137             fV = m.mapXY(5, 6);
138         }
139     }
140 private:
141     SkPoint fV;
142     using INHERITED = M4Bench;
143 };
144 DEF_BENCH( return new M4_map2(); )
145