Chromium Code Reviews| Index: bench/SkLinearBitmapPipelineBench.cpp | 
| diff --git a/bench/SkLinearBitmapPipelineBench.cpp b/bench/SkLinearBitmapPipelineBench.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..9d2e48c2efb296c131b5b1d7be057098f49821d7 | 
| --- /dev/null | 
| +++ b/bench/SkLinearBitmapPipelineBench.cpp | 
| @@ -0,0 +1,288 @@ | 
| +/* | 
| + * Copyright 2016 Google Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include <memory> | 
| +#include "SkColor.h" | 
| +#include "SkLinearBitmapPipeline.h" | 
| +#include "Benchmark.h" | 
| +#include "SkShader.h" | 
| +#include "SkImage.h" | 
| + | 
| +struct CommonBitmapFPBenchmark : public Benchmark { | 
| + CommonBitmapFPBenchmark( | 
| + SkISize srcSize, | 
| + SkColorProfileType colorProfile, | 
| + SkMatrix m, | 
| + bool useBilerp, | 
| + SkShader::TileMode xTile, | 
| + SkShader::TileMode yTile) | 
| + : fColorProfile(colorProfile) | 
| + , fM{m} | 
| + , fUseBilerp{useBilerp} | 
| + , fXTile{xTile} | 
| + , fYTile{yTile} { | 
| + fSrcSize = srcSize; | 
| + } | 
| + | 
| + static SkString tileName(const char* pre, SkShader::TileMode mode) { | 
| + SkString name{pre}; | 
| + switch (mode) { | 
| + case SkShader::kClamp_TileMode: | 
| + name.append("Clamp"); | 
| + return name; | 
| + case SkShader::kRepeat_TileMode: | 
| + name.append("Repeat"); | 
| + return name; | 
| + case SkShader::kMirror_TileMode: | 
| + name.append("Mirror"); | 
| + return name; | 
| + default: | 
| + name.append("Unknown"); | 
| + return name; | 
| + } | 
| + } | 
| + | 
| + const char* onGetName() override { | 
| + SkString name {"SkBitmapFP"}; | 
| + if (fM.getType() & SkMatrix::kPerspective_Mask) { | 
| + name.append("Perspective"); | 
| + } else if (fM.getType() & SkMatrix::kAffine_Mask) { | 
| + name.append("Affine"); | 
| + } else if (fM.getType() & SkMatrix::kScale_Mask) { | 
| + name.append("Scale"); | 
| + } else if (fM.getType() & SkMatrix::kTranslate_Mask) { | 
| + name.append("Translate"); | 
| + } else { | 
| + name.append("Identity"); | 
| + } | 
| + | 
| + name.append(tileName("X", fXTile)); | 
| + name.append(tileName("Y", fYTile)); | 
| + | 
| + if (fUseBilerp) { | 
| + name.append("Filter"); | 
| + } else { | 
| + name.append("Nearest"); | 
| + } | 
| + | 
| + name.appendf("%s", BaseName().c_str()); | 
| + | 
| + return name.c_str(); | 
| 
 
bungeman-skia
2016/02/17 19:36:34
Gone! This is being reported by asan, because the
 
bungeman-skia
2016/02/17 20:10:18
This is now fixed with https://codereview.chromium
 
 | 
| + } | 
| + | 
| + void onPreDraw(SkCanvas*) override { | 
| + int width = fSrcSize.fWidth; | 
| + int height = fSrcSize.fHeight; | 
| + fBitmap.reset(new uint32_t[width * height]); | 
| + for (int y = 0; y < height; y++) { | 
| + for (int x = 0; x < width; x++) { | 
| + fBitmap[y * width + x] = (y << 8) + x + (128<<24); | 
| + } | 
| + } | 
| + | 
| + bool trash = fM.invert(&fInvert); | 
| + sk_ignore_unused_variable(trash); | 
| + | 
| + fInfo = SkImageInfo::MakeN32Premul(width, height, fColorProfile); | 
| + } | 
| + | 
| + bool isSuitableFor(Backend backend) override { | 
| + return backend == kNonRendering_Backend; | 
| + } | 
| + | 
| + virtual SkString BaseName() = 0; | 
| + | 
| + SkISize fSrcSize; | 
| + SkColorProfileType fColorProfile; | 
| + SkMatrix fM; | 
| + SkMatrix fInvert; | 
| + bool fUseBilerp; | 
| + SkShader::TileMode fXTile; | 
| + SkShader::TileMode fYTile; | 
| + SkImageInfo fInfo; | 
| + std::unique_ptr<uint32_t[]> fBitmap; | 
| +}; | 
| + | 
| +struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark { | 
| + SkBitmapFPGeneral( | 
| + SkISize srcSize, | 
| + SkColorProfileType colorProfile, | 
| + SkMatrix m, | 
| + bool useBilerp, | 
| + SkShader::TileMode xTile, | 
| + SkShader::TileMode yTile) | 
| + : CommonBitmapFPBenchmark(srcSize, colorProfile, m, useBilerp, xTile, yTile) { } | 
| + SkString BaseName() override { | 
| + SkString name; | 
| + if (fInfo.isSRGB()) { | 
| + name.set("sRGB"); | 
| + } else { | 
| + name.set("Linr"); | 
| + } | 
| + return name; | 
| + } | 
| + | 
| + void onDraw(int loops, SkCanvas*) override { | 
| + int width = fSrcSize.fWidth; | 
| + int height = fSrcSize.fHeight; | 
| + | 
| + SkPM4f* FPbuffer = new SkPM4f[width * height]; | 
| + | 
| + SkLinearBitmapPipeline pipeline{fInvert, fXTile, fYTile, fInfo, fBitmap.get(), }; | 
| + | 
| + int count = 100; | 
| + | 
| + for (int n = 0; n < 1000*loops; n++) { | 
| + pipeline.shadeSpan4f(3, 6, FPbuffer, count); | 
| + } | 
| + | 
| + delete [] FPbuffer; | 
| + | 
| + } | 
| +}; | 
| + | 
| +struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark { | 
| + SkBitmapFPOrigShader( | 
| + SkISize srcSize, | 
| + SkColorProfileType colorProfile, | 
| + SkMatrix m, | 
| + bool useBilerp, | 
| + SkShader::TileMode xTile, | 
| + SkShader::TileMode yTile) | 
| + : CommonBitmapFPBenchmark(srcSize, colorProfile, m, useBilerp, xTile, yTile) { } | 
| + SkString BaseName() override { | 
| + SkString name{"Orig"}; | 
| + return name; | 
| + } | 
| + | 
| + void onPreDraw(SkCanvas* c) override { | 
| + CommonBitmapFPBenchmark::onPreDraw(c); | 
| + | 
| + SkImage* image = SkImage::NewRasterCopy( | 
| + fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth); | 
| + fImage.reset(image); | 
| + SkShader* shader = fImage->newShader(fXTile, fYTile); | 
| + if (fUseBilerp) { | 
| + fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality); | 
| + } else { | 
| + fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality); | 
| + } | 
| + fPaint.setShader(shader)->unref(); | 
| + | 
| + } | 
| + | 
| + void onPostDraw(SkCanvas*) override { | 
| + | 
| + } | 
| + | 
| + void onDraw(int loops, SkCanvas*) override { | 
| + int width = fSrcSize.fWidth; | 
| + int height = fSrcSize.fHeight; | 
| + | 
| + SkPMColor *buffer4b = new SkPMColor[width * height]; | 
| + | 
| + uint32_t storage[200]; | 
| + SkASSERT(fPaint.getShader()->contextSize() <= sizeof(storage)); | 
| + SkShader::Context* ctx = fPaint.getShader()->createContext( | 
| + {fPaint, fM, nullptr}, | 
| + storage); | 
| + | 
| + int count = 100; | 
| + | 
| + for (int n = 0; n < 1000*loops; n++) { | 
| + ctx->shadeSpan(3, 6, buffer4b, count); | 
| + } | 
| + | 
| + ctx->~Context(); | 
| + delete buffer4b; | 
| 
 
bungeman-skia
2016/02/17 21:38:41
This is also causing asan issues...
delete [] buf
 
 | 
| + } | 
| + SkPaint fPaint; | 
| + SkAutoTUnref<SkImage> fImage; | 
| +}; | 
| + | 
| +static SkISize srcSize = SkISize::Make(120, 100); | 
| +static SkMatrix mI = SkMatrix::I(); | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kSRGB_SkColorProfileType, mI, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kLinear_SkColorProfileType, mI, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPOrigShader( | 
| + srcSize, kLinear_SkColorProfileType, mI, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kSRGB_SkColorProfileType, mI, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kLinear_SkColorProfileType, mI, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPOrigShader( | 
| + srcSize, kLinear_SkColorProfileType, mI, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f); | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kSRGB_SkColorProfileType, mS, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kLinear_SkColorProfileType, mS, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPOrigShader( | 
| + srcSize, kLinear_SkColorProfileType, mS, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kSRGB_SkColorProfileType, mS, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kLinear_SkColorProfileType, mS, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPOrigShader( | 
| + srcSize, kLinear_SkColorProfileType, mS, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +static SkMatrix rotate(SkScalar r) { | 
| + SkMatrix m; | 
| + m.setRotate(30); | 
| + return m; | 
| +} | 
| + | 
| +static SkMatrix mR = rotate(30); | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kSRGB_SkColorProfileType, mR, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kLinear_SkColorProfileType, mR, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPOrigShader( | 
| + srcSize, kLinear_SkColorProfileType, mR, false, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kSRGB_SkColorProfileType, mR, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPGeneral( | 
| + srcSize, kLinear_SkColorProfileType, mR, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + | 
| +DEF_BENCH(return new SkBitmapFPOrigShader( | 
| + srcSize, kLinear_SkColorProfileType, mR, true, | 
| + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) | 
| + |