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