1f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
2b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkColorPriv.h"
3b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkMatrix.h"
4f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkPaint.h"
5b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkRandom.h"
6b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkString.h"
7b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
8b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#define TILE(x, width)  (((x) & 0xFFFF) * width >> 16)
9b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
10f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass InterpBench : public Benchmark {
11b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    enum {
12b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        kBuffer = 128,
13b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        kLoop   = 20000
14b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    };
15b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    SkString    fName;
16b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    int16_t     fDst[kBuffer];
17b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    float       fFx, fDx;
18b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic:
19410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    InterpBench(const char name[])  {
20b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        fName.printf("interp_%s", name);
2109042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com        fFx = 3.3f;
2209042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com        fDx = 0.1257f;
23644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
24644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
25644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
26644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
27b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
28b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
29b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual void performTest(int16_t dst[], float x, float dx, int count) = 0;
30b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
31b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected:
32b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual int mulLoopCount() const { return 1; }
33b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
34b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual const char* onGetName() {
35b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        return fName.c_str();
36b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
37b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
383361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
393361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        int n = loops * this->mulLoopCount();
40b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        for (int i = 0; i < n; i++) {
41b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            this->performTest(fDst, fFx, fDx, kBuffer);
42b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        }
43b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
44b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
45b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate:
46f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
47b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com};
48b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
49b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass Fixed16D16Interp : public InterpBench {
50b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic:
51410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    Fixed16D16Interp() : INHERITED("16.16") {}
52fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
53b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected:
54b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
55b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        SkFixed curr = SkFloatToFixed(fx);
56b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        SkFixed step = SkFloatToFixed(dx);
57b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        for (int i = 0; i < count; i += 4) {
58b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            dst[i + 0] = TILE(curr, count); curr += step;
59b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            dst[i + 1] = TILE(curr, count); curr += step;
60b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            dst[i + 2] = TILE(curr, count); curr += step;
61b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            dst[i + 3] = TILE(curr, count); curr += step;
62b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        }
63b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
64b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate:
65b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    typedef InterpBench INHERITED;
66b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com};
67b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
68b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass Fixed32D32Interp : public InterpBench {
69b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic:
70410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    Fixed32D32Interp() : INHERITED("32.32") {}
71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
72b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected:
73b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
74b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        int64_t curr = (int64_t)(fx * 65536 * 655536);
75b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        int64_t step = (int64_t)(dx * 65536 * 655536);
76b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        SkFixed tmp;
77b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        for (int i = 0; i < count; i += 4) {
78fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            tmp = (SkFixed)(curr >> 16);
79fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            dst[i + 0] = TILE(tmp, count);
804debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com            curr += step;
814debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com
82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            tmp = (SkFixed)(curr >> 16);
83fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            dst[i + 1] = TILE(tmp, count);
844debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com            curr += step;
854debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com
86fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            tmp = (SkFixed)(curr >> 16);
87fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            dst[i + 2] = TILE(tmp, count);
884debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com            curr += step;
894debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com
90fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            tmp = (SkFixed)(curr >> 16);
91fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com            dst[i + 3] = TILE(tmp, count);
924debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com            curr += step;
93b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        }
94b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
95b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate:
96b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    typedef InterpBench INHERITED;
97b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com};
98b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
99b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass Fixed16D48Interp : public InterpBench {
100b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic:
101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    Fixed16D48Interp() : INHERITED("16.48") {}
102fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
103b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected:
104b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
105b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536);
106b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        int64_t step = (int64_t)(dx * 65536 * 655536 * 65536);
107b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        SkFixed tmp;
108b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        for (int i = 0; i < count; i += 4) {
10919069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com            tmp = (SkFixed) (curr >> 32); dst[i + 0] = TILE(tmp, count); curr += step;
11019069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com            tmp = (SkFixed) (curr >> 32); dst[i + 1] = TILE(tmp, count); curr += step;
11119069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com            tmp = (SkFixed) (curr >> 32); dst[i + 2] = TILE(tmp, count); curr += step;
11219069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com            tmp = (SkFixed) (curr >> 32); dst[i + 3] = TILE(tmp, count); curr += step;
113b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        }
114b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
115b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate:
116b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    typedef InterpBench INHERITED;
117b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com};
118b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
119b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass FloatInterp : public InterpBench {
120b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic:
121410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    FloatInterp() : INHERITED("float") {}
122fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
123b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected:
124b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
125b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        SkFixed tmp;
126b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        for (int i = 0; i < count; i += 4) {
127b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx;
128b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx;
129b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx;
130b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx;
131b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        }
132b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
133b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate:
134b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    typedef InterpBench INHERITED;
135b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com};
136b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
137b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass DoubleInterp : public InterpBench {
138b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic:
139410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DoubleInterp() : INHERITED("double") {}
140fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
141b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected:
142b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
143b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        double ffx = fx;
144b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        double ddx = dx;
145b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        SkFixed tmp;
146b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        for (int i = 0; i < count; i += 4) {
147b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += ddx;
148b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += ddx;
149b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += ddx;
150b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com            tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += ddx;
151b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com        }
152b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    }
153b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate:
154b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com    typedef InterpBench INHERITED;
155b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com};
156b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
157b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com///////////////////////////////////////////////////////////////////////////////
158b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com
159410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Fixed16D16Interp(); )
160410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Fixed32D32Interp(); )
161410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Fixed16D48Interp(); )
162410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new FloatInterp(); )
163410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DoubleInterp(); )
164