Chromium Code Reviews| Index: bench/BitmapBench.cpp |
| diff --git a/bench/BitmapBench.cpp b/bench/BitmapBench.cpp |
| index eba55f50dacd149d3770743362c2e2cb46299b35..b209ede76e717b3b53abd3c950af7b015c3f5f31 100644 |
| --- a/bench/BitmapBench.cpp |
| +++ b/bench/BitmapBench.cpp |
| @@ -13,10 +13,6 @@ |
| #include "SkRandom.h" |
| #include "SkString.h" |
| -static const char* gTileName[] = { |
| - "clamp", "repeat", "mirror" |
| -}; |
| - |
| static const char* gConfigName[] = { |
| "ERROR", "a1", "a8", "index8", "565", "4444", "8888" |
| }; |
| @@ -82,22 +78,19 @@ class BitmapBench : public SkBenchmark { |
| SkPaint fPaint; |
| 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 { BICUBIC_DUR_SCALE = 20 }; |
| + enum { N = SkBENCHLOOP(15 * BICUBIC_DUR_SCALE) }; |
| 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) |
| + bool forceUpdate = false, bool bitmapVolatile = false) |
| : INHERITED(param) |
| , fIsOpaque(isOpaque) |
| , fForceUpdate(forceUpdate) |
| - , fTileX(tx) |
| - , fTileY(ty) |
| , fIsVolatile(bitmapVolatile) |
| , fConfig(c) { |
| } |
| @@ -105,12 +98,6 @@ public: |
| protected: |
| virtual const char* onGetName() { |
| fName.set("bitmap"); |
| - if (fTileX >= 0) { |
| - fName.appendf("_%s", gTileName[fTileX]); |
| - if (fTileY != fTileX) { |
| - fName.appendf("_%s", gTileName[fTileY]); |
| - } |
| - } |
| fName.appendf("_%s%s", gConfigName[fConfig], |
| fIsOpaque ? "" : "_A"); |
| if (fForceUpdate) |
| @@ -159,7 +146,11 @@ protected: |
| const SkScalar x0 = SkIntToScalar(-bitmap.width() / 2); |
| const SkScalar y0 = SkIntToScalar(-bitmap.height() / 2); |
| - for (int i = 0; i < N; i++) { |
| + int count = N; |
|
robertphillips
2013/05/29 13:14:17
make sure count remains 1 in debug?
reed1
2013/05/29 15:02:30
Done.
|
| + if (paint.getFlags() & SkPaint::kBicubicFilterBitmap_Flag) { |
| + count /= BICUBIC_DUR_SCALE; |
| + } |
| + for (int i = 0; i < count; i++) { |
| SkScalar x = x0 + rand.nextUScalar1() * dim.fX; |
| SkScalar y = y0 + rand.nextUScalar1() * dim.fY; |
| @@ -170,6 +161,14 @@ protected: |
| } |
| } |
| + virtual float onGetDurationScale() SK_OVERRIDE { |
| + SkPaint paint; |
| + this->setupPaint(&paint); |
| + |
|
robertphillips
2013/05/29 13:14:17
return 1 in debug?
reed1
2013/05/29 15:02:30
Done.
|
| + return (paint.getFlags() & SkPaint::kBicubicFilterBitmap_Flag) ? |
| + BICUBIC_DUR_SCALE : 1; |
| + } |
| + |
| virtual void onDrawIntoBitmap(const SkBitmap& bm) { |
| const int w = bm.width(); |
| const int h = bm.height(); |
| @@ -196,38 +195,53 @@ private: |
| /** Explicitly invoke some filter types to improve coverage of acceleration |
| procs. */ |
| +enum Flags { |
| + kScale_Flag = 1 << 0, |
| + kRotate_Flag = 1 << 1, |
| + kBilerp_Flag = 1 << 2, |
| + kBicubic_Flag = 1 << 3, |
| +}; |
| + |
| +static bool isBilerp(uint32_t flags) { |
| + return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag); |
| +} |
| + |
| +static bool isBicubic(uint32_t flags) { |
| + return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_Flag); |
| +} |
| + |
| class FilterBitmapBench : public BitmapBench { |
| - bool fScale; |
| - bool fRotate; |
| - bool fFilter; |
| + uint32_t fFlags; |
| SkString fFullName; |
| enum { N = SkBENCHLOOP(300) }; |
| public: |
| FilterBitmapBench(void* param, bool isOpaque, SkBitmap::Config c, |
| - bool forceUpdate = false, bool bitmapVolatile = false, |
| - int tx = -1, int ty = -1, bool addScale = false, |
| - bool addRotate = false, bool addFilter = false) |
| - : INHERITED(param, isOpaque, c, forceUpdate, bitmapVolatile, tx, ty) |
| - , fScale(addScale), fRotate(addRotate), fFilter(addFilter) { |
| - |
| + bool forceUpdate, bool isVolitile, uint32_t flags) |
| + : INHERITED(param, isOpaque, c, forceUpdate, isVolitile) |
| + , fFlags(flags) { |
| } |
| protected: |
| virtual const char* onGetName() { |
| fFullName.set(INHERITED::onGetName()); |
| - if (fScale) |
| + if (fFlags & kScale_Flag) { |
| fFullName.append("_scale"); |
| - if (fRotate) |
| + } |
| + if (fFlags & kRotate_Flag) { |
| fFullName.append("_rotate"); |
| - if (fFilter) |
| - fFullName.append("_filter"); |
| + } |
| + if (isBilerp(fFlags)) { |
| + fFullName.append("_bilerp"); |
| + } else if (isBicubic(fFlags)) { |
| + fFullName.append("_bicubic"); |
| + } |
| return fFullName.c_str(); |
| } |
| virtual void onDraw(SkCanvas* canvas) { |
| SkISize dim = canvas->getDeviceSize(); |
| - if (fScale) { |
| + if (fFlags & kScale_Flag) { |
| const SkScalar x = SkIntToScalar(dim.fWidth) / 2; |
| const SkScalar y = SkIntToScalar(dim.fHeight) / 2; |
| @@ -236,7 +250,7 @@ protected: |
| canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100); |
| canvas->translate(-x, -y); |
| } |
| - if (fRotate) { |
| + if (fFlags & kRotate_Flag) { |
| const SkScalar x = SkIntToScalar(dim.fWidth) / 2; |
| const SkScalar y = SkIntToScalar(dim.fHeight) / 2; |
| @@ -245,7 +259,16 @@ protected: |
| canvas->translate(-x, -y); |
| } |
| - this->setForceFilter(fFilter); |
| + uint32_t orMask = 0; |
| + uint32_t clearMask = SkPaint::kFilterBitmap_Flag | SkPaint::kBicubicFilterBitmap_Flag; |
| + if (fFlags & kBilerp_Flag) { |
| + orMask |= SkPaint::kFilterBitmap_Flag; |
| + } |
| + if (fFlags & kBicubic_Flag) { |
| + orMask |= SkPaint::kBicubicFilterBitmap_Flag; |
| + } |
| + this->setPaintFlags(orMask, clearMask); |
| + |
| INHERITED::onDraw(canvas); |
| } |
| @@ -264,9 +287,8 @@ private: |
| 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) |
| + bool forceUpdate = false, bool bitmapVolatile = false) |
| + : INHERITED(param, false, c, forceUpdate, bitmapVolatile) |
| , fSourceAlpha(alpha) { |
| } |
| @@ -354,16 +376,19 @@ DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, tr |
| DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false); ) |
| // scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S32_D16_filter_DX_SSE2 |
| -DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, -1, -1, true, false, true); ) |
| -DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, false, false, -1, -1, true, false, true); ) |
| -DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, -1, -1, true, false, true); ) |
| -DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, -1, -1, true, false, true); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kBilerp_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kBilerp_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, kScale_Flag | kBilerp_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, kScale_Flag | kBilerp_Flag); ) |
| // scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3} |
| -DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, -1, -1, true, true, true); ) |
| -DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, false, false, -1, -1, true, true, true); ) |
| -DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, -1, -1, true, true, true); ) |
| -DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, -1, -1, true, true, true); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) |
| + |
| +DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); ) |
| +DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); ) |
| // source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon} |
| DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kOpaque_SourceAlpha, SkBitmap::kARGB_8888_Config); ) |