| Index: bench/BitmapBench.cpp
|
| diff --git a/bench/BitmapBench.cpp b/bench/BitmapBench.cpp
|
| index 0efdde3840a3af2a943383570313429fd8cf7f96..bd2ba685f22109842569299250c0166c4140f692 100644
|
| --- a/bench/BitmapBench.cpp
|
| +++ b/bench/BitmapBench.cpp
|
| @@ -21,25 +21,6 @@ static const char* gConfigName[] = {
|
| "ERROR", "a1", "a8", "index8", "565", "4444", "8888"
|
| };
|
|
|
| -static void drawIntoBitmap(const SkBitmap& bm) {
|
| - const int w = bm.width();
|
| - const int h = bm.height();
|
| -
|
| - SkCanvas canvas(bm);
|
| - SkPaint p;
|
| - p.setAntiAlias(true);
|
| - p.setColor(SK_ColorRED);
|
| - canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
|
| - SkIntToScalar(SkMin32(w, h))*3/8, p);
|
| -
|
| - SkRect r;
|
| - r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
|
| - p.setStyle(SkPaint::kStroke_Style);
|
| - p.setStrokeWidth(SkIntToScalar(4));
|
| - p.setColor(SK_ColorBLUE);
|
| - canvas.drawRect(r, p);
|
| -}
|
| -
|
| static int conv6ToByte(int x) {
|
| return x * 0xFF / 5;
|
| }
|
| @@ -102,38 +83,23 @@ class BitmapBench : public SkBenchmark {
|
| bool fIsOpaque;
|
| bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache
|
| int fTileX, fTileY; // -1 means don't use shader
|
| + bool fIsVolatile;
|
| + SkBitmap::Config fConfig;
|
| SkString fName;
|
| enum { N = SkBENCHLOOP(300) };
|
| + enum { W = 128 };
|
| + enum { H = 128 };
|
| public:
|
| BitmapBench(void* param, bool isOpaque, SkBitmap::Config c,
|
| bool forceUpdate = false, bool bitmapVolatile = false,
|
| int tx = -1, int ty = -1)
|
| - : INHERITED(param), fIsOpaque(isOpaque), fForceUpdate(forceUpdate), fTileX(tx), fTileY(ty) {
|
| - const int w = 128;
|
| - const int h = 128;
|
| - SkBitmap bm;
|
| -
|
| - if (SkBitmap::kIndex8_Config == c) {
|
| - bm.setConfig(SkBitmap::kARGB_8888_Config, w, h);
|
| - } else {
|
| - bm.setConfig(c, w, h);
|
| - }
|
| - bm.allocPixels();
|
| - bm.eraseColor(isOpaque ? SK_ColorBLACK : 0);
|
| -
|
| - drawIntoBitmap(bm);
|
| -
|
| - if (SkBitmap::kIndex8_Config == c) {
|
| - convertToIndex666(bm, &fBitmap);
|
| - } else {
|
| - fBitmap = bm;
|
| - }
|
| -
|
| - if (fBitmap.getColorTable()) {
|
| - fBitmap.getColorTable()->setIsOpaque(isOpaque);
|
| - }
|
| - fBitmap.setIsOpaque(isOpaque);
|
| - fBitmap.setIsVolatile(bitmapVolatile);
|
| + : INHERITED(param)
|
| + , fIsOpaque(isOpaque)
|
| + , fForceUpdate(forceUpdate)
|
| + , fTileX(tx)
|
| + , fTileY(ty)
|
| + , fIsVolatile(bitmapVolatile)
|
| + , fConfig(c) {
|
| }
|
|
|
| protected:
|
| @@ -145,16 +111,43 @@ protected:
|
| fName.appendf("_%s", gTileName[fTileY]);
|
| }
|
| }
|
| - fName.appendf("_%s%s", gConfigName[fBitmap.config()],
|
| + fName.appendf("_%s%s", gConfigName[fConfig],
|
| fIsOpaque ? "" : "_A");
|
| if (fForceUpdate)
|
| fName.append("_update");
|
| - if (fBitmap.isVolatile())
|
| + if (fIsVolatile)
|
| fName.append("_volatile");
|
|
|
| return fName.c_str();
|
| }
|
|
|
| + virtual void onPreDraw() {
|
| + SkBitmap bm;
|
| +
|
| + if (SkBitmap::kIndex8_Config == fConfig) {
|
| + bm.setConfig(SkBitmap::kARGB_8888_Config, W, H);
|
| + } else {
|
| + bm.setConfig(fConfig, W, H);
|
| + }
|
| +
|
| + bm.allocPixels();
|
| + bm.eraseColor(fIsOpaque ? SK_ColorBLACK : 0);
|
| +
|
| + onDrawIntoBitmap(bm);
|
| +
|
| + if (SkBitmap::kIndex8_Config == fConfig) {
|
| + convertToIndex666(bm, &fBitmap);
|
| + } else {
|
| + fBitmap = bm;
|
| + }
|
| +
|
| + if (fBitmap.getColorTable()) {
|
| + fBitmap.getColorTable()->setIsOpaque(fIsOpaque);
|
| + }
|
| + fBitmap.setIsOpaque(fIsOpaque);
|
| + fBitmap.setIsVolatile(fIsVolatile);
|
| + }
|
| +
|
| virtual void onDraw(SkCanvas* canvas) {
|
| SkIPoint dim = this->getSize();
|
| SkRandom rand;
|
| @@ -177,6 +170,25 @@ protected:
|
| }
|
| }
|
|
|
| + virtual void onDrawIntoBitmap(const SkBitmap& bm) {
|
| + const int w = bm.width();
|
| + const int h = bm.height();
|
| +
|
| + SkCanvas canvas(bm);
|
| + SkPaint p;
|
| + p.setAntiAlias(true);
|
| + p.setColor(SK_ColorRED);
|
| + canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
|
| + SkIntToScalar(SkMin32(w, h))*3/8, p);
|
| +
|
| + SkRect r;
|
| + r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
|
| + p.setStyle(SkPaint::kStroke_Style);
|
| + p.setStrokeWidth(SkIntToScalar(4));
|
| + p.setColor(SK_ColorBLUE);
|
| + canvas.drawRect(r, p);
|
| + }
|
| +
|
| private:
|
| typedef SkBenchmark INHERITED;
|
| };
|
| @@ -241,6 +253,95 @@ private:
|
| typedef BitmapBench INHERITED;
|
| };
|
|
|
| +/** Verify optimizations that test source alpha values. */
|
| +
|
| +class SourceAlphaBitmapBench : public BitmapBench {
|
| +public:
|
| + enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha,
|
| + kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha};
|
| +private:
|
| + SkString fFullName;
|
| + SourceAlpha fSourceAlpha;
|
| +public:
|
| + SourceAlphaBitmapBench(void* param, SourceAlpha alpha, SkBitmap::Config c,
|
| + bool forceUpdate = false, bool bitmapVolatile = false,
|
| + int tx = -1, int ty = -1)
|
| + : INHERITED(param, false, c, forceUpdate, bitmapVolatile, tx, ty)
|
| + , fSourceAlpha(alpha) {
|
| + }
|
| +
|
| +protected:
|
| + virtual const char* onGetName() {
|
| + fFullName.set(INHERITED::onGetName());
|
| +
|
| + if (fSourceAlpha == kOpaque_SourceAlpha) {
|
| + fFullName.append("_source_opaque");
|
| + } else if (fSourceAlpha == kTransparent_SourceAlpha) {
|
| + fFullName.append("_source_transparent");
|
| + } else if (fSourceAlpha == kTwoStripes_SourceAlpha) {
|
| + fFullName.append("_source_stripes_two");
|
| + } else if (fSourceAlpha == kThreeStripes_SourceAlpha) {
|
| + fFullName.append("_source_stripes_three");
|
| + }
|
| +
|
| + return fFullName.c_str();
|
| + }
|
| +
|
| + virtual void onDrawIntoBitmap(const SkBitmap& bm) SK_OVERRIDE {
|
| + const int w = bm.width();
|
| + const int h = bm.height();
|
| +
|
| + if (kOpaque_SourceAlpha == fSourceAlpha) {
|
| + bm.eraseColor(SK_ColorBLACK);
|
| + } else if (kTransparent_SourceAlpha == fSourceAlpha) {
|
| + bm.eraseColor(0);
|
| + } else if (kTwoStripes_SourceAlpha == fSourceAlpha) {
|
| + bm.eraseColor(0);
|
| +
|
| + SkCanvas canvas(bm);
|
| + SkPaint p;
|
| + p.setAntiAlias(false);
|
| + p.setStyle(SkPaint::kFill_Style);
|
| + p.setColor(SK_ColorRED);
|
| +
|
| + // Draw red vertical stripes on transparent background
|
| + SkRect r;
|
| + for (int x = 0; x < w; x+=2)
|
| + {
|
| + r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
|
| + canvas.drawRect(r, p);
|
| + }
|
| +
|
| + } else if (kThreeStripes_SourceAlpha == fSourceAlpha) {
|
| + bm.eraseColor(0);
|
| +
|
| + SkCanvas canvas(bm);
|
| + SkPaint p;
|
| + p.setAntiAlias(false);
|
| + p.setStyle(SkPaint::kFill_Style);
|
| +
|
| + // Draw vertical stripes on transparent background with a pattern
|
| + // where the first pixel is fully transparent, the next is semi-transparent
|
| + // and the third is fully opaque.
|
| + SkRect r;
|
| + for (int x = 0; x < w; x++)
|
| + {
|
| + if (x % 3 == 0) {
|
| + continue; // Keep transparent
|
| + } else if (x % 3 == 1) {
|
| + p.setColor(SkColorSetARGB(127, 127, 127, 127)); // Semi-transparent
|
| + } else if (x % 3 == 2) {
|
| + p.setColor(SK_ColorRED); // Opaque
|
| + }
|
| + r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
|
| + canvas.drawRect(r, p);
|
| + }
|
| + }
|
| + }
|
| +
|
| +private:
|
| + typedef BitmapBench INHERITED;
|
| +};
|
| static SkBenchmark* Fact0(void* p) { return new BitmapBench(p, false, SkBitmap::kARGB_8888_Config); }
|
| static SkBenchmark* Fact1(void* p) { return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config); }
|
| static SkBenchmark* Fact2(void* p) { return new BitmapBench(p, true, SkBitmap::kRGB_565_Config); }
|
| @@ -263,6 +364,12 @@ static SkBenchmark* Fact14(void* p) { return new FilterBitmapBench(p, true, SkBi
|
| static SkBenchmark* Fact15(void* p) { return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, -1, -1, true, true, true); }
|
| static SkBenchmark* Fact16(void* p) { return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, -1, -1, true, true, true); }
|
|
|
| +// source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon}
|
| +static SkBenchmark* Fact17(void* p) { return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kOpaque_SourceAlpha, SkBitmap::kARGB_8888_Config); }
|
| +static SkBenchmark* Fact18(void* p) { return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTransparent_SourceAlpha, SkBitmap::kARGB_8888_Config); }
|
| +static SkBenchmark* Fact19(void* p) { return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTwoStripes_SourceAlpha, SkBitmap::kARGB_8888_Config); }
|
| +static SkBenchmark* Fact20(void* p) { return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kThreeStripes_SourceAlpha, SkBitmap::kARGB_8888_Config); }
|
| +
|
| static BenchRegistry gReg0(Fact0);
|
| static BenchRegistry gReg1(Fact1);
|
| static BenchRegistry gReg2(Fact2);
|
| @@ -282,3 +389,8 @@ static BenchRegistry gReg13(Fact13);
|
| static BenchRegistry gReg14(Fact14);
|
| static BenchRegistry gReg15(Fact15);
|
| static BenchRegistry gReg16(Fact16);
|
| +
|
| +static BenchRegistry gReg17(Fact17);
|
| +static BenchRegistry gReg18(Fact18);
|
| +static BenchRegistry gReg19(Fact19);
|
| +static BenchRegistry gReg20(Fact20);
|
|
|