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);) |
+ |