OLD | NEW |
1 #include "Benchmark.h" | 1 #include "Benchmark.h" |
2 #include "SkColorPriv.h" | 2 #include "SkColorPriv.h" |
3 #include "SkMatrix.h" | 3 #include "SkMatrix.h" |
4 #include "SkPaint.h" | 4 #include "SkPaint.h" |
5 #include "SkRandom.h" | 5 #include "SkRandom.h" |
6 #include "SkString.h" | 6 #include "SkString.h" |
7 | 7 |
8 #define TILE(x, width) (((x) & 0xFFFF) * width >> 16) | 8 #define TILE(x, width) (((x) & 0xFFFF) * width >> 16) |
9 | 9 |
10 class InterpBench : public Benchmark { | 10 class InterpBench : public Benchmark { |
11 enum { | 11 enum { |
12 kBuffer = 128, | 12 kBuffer = 128, |
13 kLoop = 20000 | 13 kLoop = 20000 |
14 }; | 14 }; |
15 SkString fName; | 15 SkString fName; |
16 int16_t fDst[kBuffer]; | 16 int16_t fDst[kBuffer]; |
17 float fFx, fDx; | 17 float fFx, fDx; |
18 public: | 18 public: |
19 InterpBench(const char name[]) { | 19 InterpBench(const char name[]) { |
20 fName.printf("interp_%s", name); | 20 fName.printf("interp_%s", name); |
21 fFx = 3.3f; | 21 fFx = 3.3f; |
22 fDx = 0.1257f; | 22 fDx = 0.1257f; |
23 } | 23 } |
24 | 24 |
25 bool isSuitableFor(Backend backend) SK_OVERRIDE { | 25 bool isSuitableFor(Backend backend) override { |
26 return backend == kNonRendering_Backend; | 26 return backend == kNonRendering_Backend; |
27 } | 27 } |
28 | 28 |
29 virtual void performTest(int16_t dst[], float x, float dx, int count) = 0; | 29 virtual void performTest(int16_t dst[], float x, float dx, int count) = 0; |
30 | 30 |
31 protected: | 31 protected: |
32 virtual int mulLoopCount() const { return 1; } | 32 virtual int mulLoopCount() const { return 1; } |
33 | 33 |
34 virtual const char* onGetName() { | 34 virtual const char* onGetName() { |
35 return fName.c_str(); | 35 return fName.c_str(); |
36 } | 36 } |
37 | 37 |
38 virtual void onDraw(const int loops, SkCanvas*) { | 38 virtual void onDraw(const int loops, SkCanvas*) { |
39 int n = loops * this->mulLoopCount(); | 39 int n = loops * this->mulLoopCount(); |
40 for (int i = 0; i < n; i++) { | 40 for (int i = 0; i < n; i++) { |
41 this->performTest(fDst, fFx, fDx, kBuffer); | 41 this->performTest(fDst, fFx, fDx, kBuffer); |
42 } | 42 } |
43 } | 43 } |
44 | 44 |
45 private: | 45 private: |
46 typedef Benchmark INHERITED; | 46 typedef Benchmark INHERITED; |
47 }; | 47 }; |
48 | 48 |
49 class Fixed16D16Interp : public InterpBench { | 49 class Fixed16D16Interp : public InterpBench { |
50 public: | 50 public: |
51 Fixed16D16Interp() : INHERITED("16.16") {} | 51 Fixed16D16Interp() : INHERITED("16.16") {} |
52 | 52 |
53 protected: | 53 protected: |
54 void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { | 54 void performTest(int16_t dst[], float fx, float dx, int count) override { |
55 SkFixed curr = SkFloatToFixed(fx); | 55 SkFixed curr = SkFloatToFixed(fx); |
56 SkFixed step = SkFloatToFixed(dx); | 56 SkFixed step = SkFloatToFixed(dx); |
57 for (int i = 0; i < count; i += 4) { | 57 for (int i = 0; i < count; i += 4) { |
58 dst[i + 0] = TILE(curr, count); curr += step; | 58 dst[i + 0] = TILE(curr, count); curr += step; |
59 dst[i + 1] = TILE(curr, count); curr += step; | 59 dst[i + 1] = TILE(curr, count); curr += step; |
60 dst[i + 2] = TILE(curr, count); curr += step; | 60 dst[i + 2] = TILE(curr, count); curr += step; |
61 dst[i + 3] = TILE(curr, count); curr += step; | 61 dst[i + 3] = TILE(curr, count); curr += step; |
62 } | 62 } |
63 } | 63 } |
64 private: | 64 private: |
65 typedef InterpBench INHERITED; | 65 typedef InterpBench INHERITED; |
66 }; | 66 }; |
67 | 67 |
68 class Fixed32D32Interp : public InterpBench { | 68 class Fixed32D32Interp : public InterpBench { |
69 public: | 69 public: |
70 Fixed32D32Interp() : INHERITED("32.32") {} | 70 Fixed32D32Interp() : INHERITED("32.32") {} |
71 | 71 |
72 protected: | 72 protected: |
73 void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { | 73 void performTest(int16_t dst[], float fx, float dx, int count) override { |
74 int64_t curr = (int64_t)(fx * 65536 * 655536); | 74 int64_t curr = (int64_t)(fx * 65536 * 655536); |
75 int64_t step = (int64_t)(dx * 65536 * 655536); | 75 int64_t step = (int64_t)(dx * 65536 * 655536); |
76 SkFixed tmp; | 76 SkFixed tmp; |
77 for (int i = 0; i < count; i += 4) { | 77 for (int i = 0; i < count; i += 4) { |
78 tmp = (SkFixed)(curr >> 16); | 78 tmp = (SkFixed)(curr >> 16); |
79 dst[i + 0] = TILE(tmp, count); | 79 dst[i + 0] = TILE(tmp, count); |
80 curr += step; | 80 curr += step; |
81 | 81 |
82 tmp = (SkFixed)(curr >> 16); | 82 tmp = (SkFixed)(curr >> 16); |
83 dst[i + 1] = TILE(tmp, count); | 83 dst[i + 1] = TILE(tmp, count); |
(...skipping 10 matching lines...) Expand all Loading... |
94 } | 94 } |
95 private: | 95 private: |
96 typedef InterpBench INHERITED; | 96 typedef InterpBench INHERITED; |
97 }; | 97 }; |
98 | 98 |
99 class Fixed16D48Interp : public InterpBench { | 99 class Fixed16D48Interp : public InterpBench { |
100 public: | 100 public: |
101 Fixed16D48Interp() : INHERITED("16.48") {} | 101 Fixed16D48Interp() : INHERITED("16.48") {} |
102 | 102 |
103 protected: | 103 protected: |
104 void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { | 104 void performTest(int16_t dst[], float fx, float dx, int count) override { |
105 int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536); | 105 int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536); |
106 int64_t step = (int64_t)(dx * 65536 * 655536 * 65536); | 106 int64_t step = (int64_t)(dx * 65536 * 655536 * 65536); |
107 SkFixed tmp; | 107 SkFixed tmp; |
108 for (int i = 0; i < count; i += 4) { | 108 for (int i = 0; i < count; i += 4) { |
109 tmp = (SkFixed) (curr >> 32); dst[i + 0] = TILE(tmp, count); curr +=
step; | 109 tmp = (SkFixed) (curr >> 32); dst[i + 0] = TILE(tmp, count); curr +=
step; |
110 tmp = (SkFixed) (curr >> 32); dst[i + 1] = TILE(tmp, count); curr +=
step; | 110 tmp = (SkFixed) (curr >> 32); dst[i + 1] = TILE(tmp, count); curr +=
step; |
111 tmp = (SkFixed) (curr >> 32); dst[i + 2] = TILE(tmp, count); curr +=
step; | 111 tmp = (SkFixed) (curr >> 32); dst[i + 2] = TILE(tmp, count); curr +=
step; |
112 tmp = (SkFixed) (curr >> 32); dst[i + 3] = TILE(tmp, count); curr +=
step; | 112 tmp = (SkFixed) (curr >> 32); dst[i + 3] = TILE(tmp, count); curr +=
step; |
113 } | 113 } |
114 } | 114 } |
115 private: | 115 private: |
116 typedef InterpBench INHERITED; | 116 typedef InterpBench INHERITED; |
117 }; | 117 }; |
118 | 118 |
119 class FloatInterp : public InterpBench { | 119 class FloatInterp : public InterpBench { |
120 public: | 120 public: |
121 FloatInterp() : INHERITED("float") {} | 121 FloatInterp() : INHERITED("float") {} |
122 | 122 |
123 protected: | 123 protected: |
124 void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { | 124 void performTest(int16_t dst[], float fx, float dx, int count) override { |
125 SkFixed tmp; | 125 SkFixed tmp; |
126 for (int i = 0; i < count; i += 4) { | 126 for (int i = 0; i < count; i += 4) { |
127 tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx; | 127 tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx; |
128 tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx; | 128 tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx; |
129 tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx; | 129 tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx; |
130 tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx; | 130 tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx; |
131 } | 131 } |
132 } | 132 } |
133 private: | 133 private: |
134 typedef InterpBench INHERITED; | 134 typedef InterpBench INHERITED; |
135 }; | 135 }; |
136 | 136 |
137 class DoubleInterp : public InterpBench { | 137 class DoubleInterp : public InterpBench { |
138 public: | 138 public: |
139 DoubleInterp() : INHERITED("double") {} | 139 DoubleInterp() : INHERITED("double") {} |
140 | 140 |
141 protected: | 141 protected: |
142 void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { | 142 void performTest(int16_t dst[], float fx, float dx, int count) override { |
143 double ffx = fx; | 143 double ffx = fx; |
144 double ddx = dx; | 144 double ddx = dx; |
145 SkFixed tmp; | 145 SkFixed tmp; |
146 for (int i = 0; i < count; i += 4) { | 146 for (int i = 0; i < count; i += 4) { |
147 tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += dd
x; | 147 tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += dd
x; |
148 tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += dd
x; | 148 tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += dd
x; |
149 tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += dd
x; | 149 tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += dd
x; |
150 tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += dd
x; | 150 tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += dd
x; |
151 } | 151 } |
152 } | 152 } |
153 private: | 153 private: |
154 typedef InterpBench INHERITED; | 154 typedef InterpBench INHERITED; |
155 }; | 155 }; |
156 | 156 |
157 /////////////////////////////////////////////////////////////////////////////// | 157 /////////////////////////////////////////////////////////////////////////////// |
158 | 158 |
159 DEF_BENCH( return new Fixed16D16Interp(); ) | 159 DEF_BENCH( return new Fixed16D16Interp(); ) |
160 DEF_BENCH( return new Fixed32D32Interp(); ) | 160 DEF_BENCH( return new Fixed32D32Interp(); ) |
161 DEF_BENCH( return new Fixed16D48Interp(); ) | 161 DEF_BENCH( return new Fixed16D48Interp(); ) |
162 DEF_BENCH( return new FloatInterp(); ) | 162 DEF_BENCH( return new FloatInterp(); ) |
163 DEF_BENCH( return new DoubleInterp(); ) | 163 DEF_BENCH( return new DoubleInterp(); ) |
OLD | NEW |