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