blob: 89841f8a6905e50c7f4a6ba58d7d52f81b4c2e98 [file] [log] [blame]
reed@google.comb8c39172012-03-07 12:36:07 +00001#include "SkBenchmark.h"
2#include "SkColorPriv.h"
3#include "SkMatrix.h"
4#include "SkRandom.h"
5#include "SkString.h"
6#include "SkPaint.h"
7
8#define TILE(x, width) (((x) & 0xFFFF) * width >> 16)
9
10class InterpBench : public SkBenchmark {
11 enum {
12 kBuffer = 128,
13 kLoop = 20000
14 };
15 SkString fName;
16 int16_t fDst[kBuffer];
17 float fFx, fDx;
18public:
19 InterpBench(void* param, const char name[]) : INHERITED(param) {
20 fName.printf("interp_%s", name);
robertphillips@google.com09042b82012-04-06 20:01:46 +000021 fFx = 3.3f;
22 fDx = 0.1257f;
reed@google.comb8c39172012-03-07 12:36:07 +000023 }
24
25 virtual void performTest(int16_t dst[], float x, float dx, int count) = 0;
26
27protected:
28 virtual int mulLoopCount() const { return 1; }
29
30 virtual const char* onGetName() {
31 return fName.c_str();
32 }
33
34 virtual void onDraw(SkCanvas* canvas) {
35 int n = SkBENCHLOOP(kLoop * this->mulLoopCount());
36 for (int i = 0; i < n; i++) {
37 this->performTest(fDst, fFx, fDx, kBuffer);
38 }
39 }
40
41private:
42 typedef SkBenchmark INHERITED;
43};
44
45class Fixed16D16Interp : public InterpBench {
46public:
47 Fixed16D16Interp(void* param) : INHERITED(param, "16.16") {}
48
49protected:
50 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
51 SkFixed curr = SkFloatToFixed(fx);
52 SkFixed step = SkFloatToFixed(dx);
53 for (int i = 0; i < count; i += 4) {
54 dst[i + 0] = TILE(curr, count); curr += step;
55 dst[i + 1] = TILE(curr, count); curr += step;
56 dst[i + 2] = TILE(curr, count); curr += step;
57 dst[i + 3] = TILE(curr, count); curr += step;
58 }
59 }
60private:
61 typedef InterpBench INHERITED;
62};
63
64class Fixed32D32Interp : public InterpBench {
65public:
66 Fixed32D32Interp(void* param) : INHERITED(param, "32.32") {}
67
68protected:
69 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
70 int64_t curr = (int64_t)(fx * 65536 * 655536);
71 int64_t step = (int64_t)(dx * 65536 * 655536);
72 SkFixed tmp;
73 for (int i = 0; i < count; i += 4) {
robertphillips@google.com4debcac2012-05-14 16:33:36 +000074 tmp = (SkFixed)(curr >> 16);
75 dst[i + 0] = TILE(tmp, count);
76 curr += step;
77
78 tmp = (SkFixed)(curr >> 16);
79 dst[i + 1] = TILE(tmp, count);
80 curr += step;
81
82 tmp = (SkFixed)(curr >> 16);
83 dst[i + 2] = TILE(tmp, count);
84 curr += step;
85
86 tmp = (SkFixed)(curr >> 16);
87 dst[i + 3] = TILE(tmp, count);
88 curr += step;
reed@google.comb8c39172012-03-07 12:36:07 +000089 }
90 }
91private:
92 typedef InterpBench INHERITED;
93};
94
95class Fixed16D48Interp : public InterpBench {
96public:
97 Fixed16D48Interp(void* param) : INHERITED(param, "16.48") {}
98
99protected:
100 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
101 int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536);
102 int64_t step = (int64_t)(dx * 65536 * 655536 * 65536);
103 SkFixed tmp;
104 for (int i = 0; i < count; i += 4) {
105 tmp = curr >> 32; dst[i + 0] = TILE(tmp, count); curr += step;
106 tmp = curr >> 32; dst[i + 1] = TILE(tmp, count); curr += step;
107 tmp = curr >> 32; dst[i + 2] = TILE(tmp, count); curr += step;
108 tmp = curr >> 32; dst[i + 3] = TILE(tmp, count); curr += step;
109 }
110 }
111private:
112 typedef InterpBench INHERITED;
113};
114
115class FloatInterp : public InterpBench {
116public:
117 FloatInterp(void* param) : INHERITED(param, "float") {}
118
119protected:
120 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
121 SkFixed tmp;
122 for (int i = 0; i < count; i += 4) {
123 tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx;
124 tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx;
125 tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx;
126 tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx;
127 }
128 }
129private:
130 typedef InterpBench INHERITED;
131};
132
133class DoubleInterp : public InterpBench {
134public:
135 DoubleInterp(void* param) : INHERITED(param, "double") {}
136
137protected:
138 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
139 double ffx = fx;
140 double ddx = dx;
141 SkFixed tmp;
142 for (int i = 0; i < count; i += 4) {
143 tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += ddx;
144 tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += ddx;
145 tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += ddx;
146 tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += ddx;
147 }
148 }
149private:
150 typedef InterpBench INHERITED;
151};
152
153///////////////////////////////////////////////////////////////////////////////
154
155static SkBenchmark* M0(void* p) { return new Fixed16D16Interp(p); }
156static SkBenchmark* M1(void* p) { return new Fixed32D32Interp(p); }
157static SkBenchmark* M2(void* p) { return new Fixed16D48Interp(p); }
158static SkBenchmark* M3(void* p) { return new FloatInterp(p); }
159static SkBenchmark* M4(void* p) { return new DoubleInterp(p); }
160
161static BenchRegistry gReg0(M0);
162static BenchRegistry gReg1(M1);
163static BenchRegistry gReg2(M2);
164static BenchRegistry gReg3(M3);
165static BenchRegistry gReg4(M4);
166