summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/bench/InterpBench.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/bench/InterpBench.cpp')
-rw-r--r--chromium/third_party/skia/bench/InterpBench.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/chromium/third_party/skia/bench/InterpBench.cpp b/chromium/third_party/skia/bench/InterpBench.cpp
new file mode 100644
index 00000000000..b19af8f35fa
--- /dev/null
+++ b/chromium/third_party/skia/bench/InterpBench.cpp
@@ -0,0 +1,163 @@
+#include "Benchmark.h"
+#include "SkColorPriv.h"
+#include "SkMatrix.h"
+#include "SkPaint.h"
+#include "SkRandom.h"
+#include "SkString.h"
+
+#define TILE(x, width) (((x) & 0xFFFF) * width >> 16)
+
+class InterpBench : public Benchmark {
+ enum {
+ kBuffer = 128,
+ kLoop = 20000
+ };
+ SkString fName;
+ int16_t fDst[kBuffer];
+ float fFx, fDx;
+public:
+ InterpBench(const char name[]) {
+ fName.printf("interp_%s", name);
+ fFx = 3.3f;
+ fDx = 0.1257f;
+ }
+
+ virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
+ return backend == kNonRendering_Backend;
+ }
+
+ virtual void performTest(int16_t dst[], float x, float dx, int count) = 0;
+
+protected:
+ virtual int mulLoopCount() const { return 1; }
+
+ virtual const char* onGetName() {
+ return fName.c_str();
+ }
+
+ virtual void onDraw(const int loops, SkCanvas*) {
+ int n = loops * this->mulLoopCount();
+ for (int i = 0; i < n; i++) {
+ this->performTest(fDst, fFx, fDx, kBuffer);
+ }
+ }
+
+private:
+ typedef Benchmark INHERITED;
+};
+
+class Fixed16D16Interp : public InterpBench {
+public:
+ Fixed16D16Interp() : INHERITED("16.16") {}
+
+protected:
+ virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
+ SkFixed curr = SkFloatToFixed(fx);
+ SkFixed step = SkFloatToFixed(dx);
+ for (int i = 0; i < count; i += 4) {
+ dst[i + 0] = TILE(curr, count); curr += step;
+ dst[i + 1] = TILE(curr, count); curr += step;
+ dst[i + 2] = TILE(curr, count); curr += step;
+ dst[i + 3] = TILE(curr, count); curr += step;
+ }
+ }
+private:
+ typedef InterpBench INHERITED;
+};
+
+class Fixed32D32Interp : public InterpBench {
+public:
+ Fixed32D32Interp() : INHERITED("32.32") {}
+
+protected:
+ virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
+ int64_t curr = (int64_t)(fx * 65536 * 655536);
+ int64_t step = (int64_t)(dx * 65536 * 655536);
+ SkFixed tmp;
+ for (int i = 0; i < count; i += 4) {
+ tmp = (SkFixed)(curr >> 16);
+ dst[i + 0] = TILE(tmp, count);
+ curr += step;
+
+ tmp = (SkFixed)(curr >> 16);
+ dst[i + 1] = TILE(tmp, count);
+ curr += step;
+
+ tmp = (SkFixed)(curr >> 16);
+ dst[i + 2] = TILE(tmp, count);
+ curr += step;
+
+ tmp = (SkFixed)(curr >> 16);
+ dst[i + 3] = TILE(tmp, count);
+ curr += step;
+ }
+ }
+private:
+ typedef InterpBench INHERITED;
+};
+
+class Fixed16D48Interp : public InterpBench {
+public:
+ Fixed16D48Interp() : INHERITED("16.48") {}
+
+protected:
+ virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
+ int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536);
+ int64_t step = (int64_t)(dx * 65536 * 655536 * 65536);
+ SkFixed tmp;
+ for (int i = 0; i < count; i += 4) {
+ tmp = (SkFixed) (curr >> 32); dst[i + 0] = TILE(tmp, count); curr += step;
+ tmp = (SkFixed) (curr >> 32); dst[i + 1] = TILE(tmp, count); curr += step;
+ tmp = (SkFixed) (curr >> 32); dst[i + 2] = TILE(tmp, count); curr += step;
+ tmp = (SkFixed) (curr >> 32); dst[i + 3] = TILE(tmp, count); curr += step;
+ }
+ }
+private:
+ typedef InterpBench INHERITED;
+};
+
+class FloatInterp : public InterpBench {
+public:
+ FloatInterp() : INHERITED("float") {}
+
+protected:
+ virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
+ SkFixed tmp;
+ for (int i = 0; i < count; i += 4) {
+ tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx;
+ tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx;
+ tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx;
+ tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx;
+ }
+ }
+private:
+ typedef InterpBench INHERITED;
+};
+
+class DoubleInterp : public InterpBench {
+public:
+ DoubleInterp() : INHERITED("double") {}
+
+protected:
+ virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE {
+ double ffx = fx;
+ double ddx = dx;
+ SkFixed tmp;
+ for (int i = 0; i < count; i += 4) {
+ tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += ddx;
+ tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += ddx;
+ tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += ddx;
+ tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += ddx;
+ }
+ }
+private:
+ typedef InterpBench INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+DEF_BENCH( return new Fixed16D16Interp(); )
+DEF_BENCH( return new Fixed32D32Interp(); )
+DEF_BENCH( return new Fixed16D48Interp(); )
+DEF_BENCH( return new FloatInterp(); )
+DEF_BENCH( return new DoubleInterp(); )