+++ /dev/null
-
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "SkBenchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
-
-class FPSBench : public SkBenchmark {
- int32_t fWidth;
- int32_t fHeight;
-public:
- FPSBench(void* p) : INHERITED(p) {
- fWidth = 640;
- (void)this->findDefine32("width", &fWidth);
- fHeight = 480;
- (void)this->findDefine32("height", &fHeight);
- }
-
- int width() const { return fWidth; }
- int height() const { return fHeight; }
-
-protected:
- virtual SkIPoint onGetSize() { return SkIPoint::Make(fWidth, fHeight); }
-
-private:
- typedef SkBenchmark INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-class Color_FPSBench : public FPSBench {
-public:
- Color_FPSBench(void* p, SkColor c, const char name[]) : INHERITED(p) {
- fColor = c;
- fName = name;
- }
-
-protected:
- virtual const char* onGetName() { return fName; }
- virtual void onDraw(SkCanvas* canvas) {
- canvas->drawColor(fColor);
- }
-
-private:
- const char* fName;
- SkColor fColor;
-
- typedef FPSBench INHERITED;
-};
-
-class Bitmap_FPSBench : public FPSBench {
-public:
- Bitmap_FPSBench(void* p, SkBitmap::Config config, bool doOpaque, bool doScale) : INHERITED(p) {
- fBitmap.setConfig(config, this->width(), this->height());
- fBitmap.allocPixels();
- fBitmap.eraseColor(0xFFFF0000);
- if (doOpaque) {
- fBitmap.setIsOpaque(true);
- }
-
- const char* configStr = "565";
- if (config == SkBitmap::kARGB_8888_Config) {
- if (doOpaque) {
- configStr = "X888";
- } else {
- configStr = "8888";
- }
- }
- fName.printf("fps_bitmap_%s_%s", configStr,
- doScale ? "scale" : "noscale");
-
- fMatrix.reset();
- if (doScale) {
- fMatrix.setScale(SkIntToScalar(3)/2, SkIntToScalar(3)/2);
- }
-
- }
-
-protected:
- virtual const char* onGetName() { return fName.c_str(); }
- virtual void onDraw(SkCanvas* canvas) {
- this->setupPaint(&fPaint);
- canvas->drawBitmapMatrix(fBitmap, fMatrix, &fPaint);
- }
-
-private:
- SkBitmap fBitmap;
- SkMatrix fMatrix;
- SkPaint fPaint;
- SkString fName;
-
- typedef FPSBench INHERITED;
-};
-
-static SkBenchmark* FillFactory(void* p) { return SkNEW_ARGS(Color_FPSBench, (p, 0xFFFF0000, "fps_fill")); }
-static SkBenchmark* BlendFactory(void* p) { return SkNEW_ARGS(Color_FPSBench, (p, 0x80FF0000, "fps_blend")); }
-static SkBenchmark* BMFactory0(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kARGB_8888_Config, false, false)); }
-static SkBenchmark* BMFactory1(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kARGB_8888_Config, false, true)); }
-static SkBenchmark* BMFactory2(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kARGB_8888_Config, true, false)); }
-static SkBenchmark* BMFactory3(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kARGB_8888_Config, true, true)); }
-static SkBenchmark* BMFactory4(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kRGB_565_Config, false, false)); }
-static SkBenchmark* BMFactory5(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kRGB_565_Config, false, true)); }
-
-static BenchRegistry gFillReg(FillFactory);
-static BenchRegistry gBlendReg(BlendFactory);
-static BenchRegistry gBMReg0(BMFactory0);
-static BenchRegistry gBMReg1(BMFactory1);
-static BenchRegistry gBMReg2(BMFactory2);
-static BenchRegistry gBMReg3(BMFactory3);
-static BenchRegistry gBMReg4(BMFactory4);
-static BenchRegistry gBMReg5(BMFactory5);
-
#include "SkBenchmark.h"
+#include "SkColorPriv.h"
#include "SkMatrix.h"
#include "SkRandom.h"
#include "SkString.h"
typedef SkBenchmark INHERITED;
};
-int gMathBench_NonStaticGlobal;
+class MathBenchU32 : public MathBench {
+public:
+ MathBenchU32(void* param, const char name[]) : INHERITED(param, name) {}
+
+protected:
+ virtual void performITest(uint32_t* dst, const uint32_t* src, int count) = 0;
+
+ virtual void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src,
+ int count) SK_OVERRIDE {
+ uint32_t* d = SkTCast<uint32_t*>(dst);
+ const uint32_t* s = SkTCast<const uint32_t*>(src);
+ this->performITest(d, s, count);
+ }
+private:
+ typedef MathBench INHERITED;
+};
-#define always_do(pred) \
- do { \
- if (pred) { \
- ++gMathBench_NonStaticGlobal; \
- } \
- } while (0)
+///////////////////////////////////////////////////////////////////////////////
class NoOpMathBench : public MathBench {
public:
typedef MathBench INHERITED;
};
+static inline uint32_t QMul64(uint32_t value, U8CPU alpha) {
+ SkASSERT((uint8_t)alpha == alpha);
+ const uint32_t mask = 0xFF00FF;
+
+ uint64_t tmp = value;
+ tmp = (tmp & mask) | ((tmp & ~mask) << 24);
+ tmp *= alpha;
+ return ((tmp >> 8) & mask) | ((tmp >> 32) & ~mask);
+}
+
+class QMul64Bench : public MathBenchU32 {
+public:
+ QMul64Bench(void* param) : INHERITED(param, "qmul64") {}
+protected:
+ virtual void performITest(uint32_t* SK_RESTRICT dst,
+ const uint32_t* SK_RESTRICT src,
+ int count) SK_OVERRIDE {
+ for (int i = 0; i < count; ++i) {
+ dst[i] = QMul64(src[i], (uint8_t)i);
+ }
+ }
+private:
+ typedef MathBenchU32 INHERITED;
+};
+
+class QMul32Bench : public MathBenchU32 {
+public:
+ QMul32Bench(void* param) : INHERITED(param, "qmul32") {}
+protected:
+ virtual void performITest(uint32_t* SK_RESTRICT dst,
+ const uint32_t* SK_RESTRICT src,
+ int count) SK_OVERRIDE {
+ for (int i = 0; i < count; ++i) {
+ dst[i] = SkAlphaMulQ(src[i], (uint8_t)i);
+ }
+ }
+private:
+ typedef MathBenchU32 INHERITED;
+};
+
///////////////////////////////////////////////////////////////////////////////
static SkBenchmark* M0(void* p) { return new NoOpMathBench(p); }
static SkBenchmark* M1(void* p) { return new SlowISqrtMathBench(p); }
static SkBenchmark* M2(void* p) { return new FastISqrtMathBench(p); }
+static SkBenchmark* M3(void* p) { return new QMul64Bench(p); }
+static SkBenchmark* M4(void* p) { return new QMul32Bench(p); }
static BenchRegistry gReg0(M0);
static BenchRegistry gReg1(M1);
static BenchRegistry gReg2(M2);
+static BenchRegistry gReg3(M3);
+static BenchRegistry gReg4(M4);