| Index: bench/SkLinearBitmapPipelineBench.cpp
|
| diff --git a/bench/SkLinearBitmapPipelineBench.cpp b/bench/SkLinearBitmapPipelineBench.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..39f1b8e7099d97e94914f726c242f5e70c21766a
|
| --- /dev/null
|
| +++ b/bench/SkLinearBitmapPipelineBench.cpp
|
| @@ -0,0 +1,271 @@
|
| +/*
|
| + * 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;
|
| + }
|
| + }
|
| +
|
| + 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();
|
| + }
|
| +
|
| + 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);
|
| + }
|
| + }
|
| +
|
| + (void)fM.invert(&fInvert);
|
| +
|
| + 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 {
|
| + using CommonBitmapFPBenchmark::CommonBitmapFPBenchmark;
|
| + SkString BaseName() override {
|
| + SkString name;
|
| + if (fInfo.isSRGB()) {
|
| + name.set("sRGB");
|
| + } else {
|
| + name.set("Linr");
|
| + }
|
| + return name;
|
| + }
|
| +
|
| + void onPreDraw(SkCanvas* c) override {
|
| + CommonBitmapFPBenchmark::onPreDraw(c);
|
| +
|
| + fPipeline.reset(
|
| + new SkLinearBitmapPipeline{fInvert, fXTile, fYTile, fInfo, fBitmap.get(), });
|
| + }
|
| +
|
| + void onDraw(int loops, SkCanvas*) override {
|
| + int width = fSrcSize.fWidth;
|
| + int height = fSrcSize.fHeight;
|
| +
|
| + SkPM4f FPbuffer[width * height];
|
| +
|
| + int count = 100;
|
| +
|
| + for (int n = 0; n < 1000*loops; n++) {
|
| + fPipeline->shadeSpan4f(3, 6, FPbuffer, count);
|
| + }
|
| +
|
| + }
|
| +
|
| + std::unique_ptr<SkLinearBitmapPipeline> fPipeline;
|
| +};
|
| +
|
| +struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark {
|
| + using CommonBitmapFPBenchmark::CommonBitmapFPBenchmark;
|
| + 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();
|
| + SkASSERT(fPaint.getShader()->contextSize() <= sizeof(fStorage));
|
| + fCtx = fPaint.getShader()->createContext(
|
| + {fPaint, fM, nullptr},
|
| + fStorage);
|
| + }
|
| +
|
| + void onPostDraw(SkCanvas*) override {
|
| + fCtx->~Context();
|
| + }
|
| +
|
| + void onDraw(int loops, SkCanvas*) override {
|
| + int width = fSrcSize.fWidth;
|
| + int height = fSrcSize.fHeight;
|
| + SkPMColor buffer4b[width * height];
|
| +
|
| +
|
| + int count = 100;
|
| +
|
| + for (int n = 0; n < 1000*loops; n++) {
|
| + fCtx->shadeSpan(3, 6, buffer4b, count);
|
| + }
|
| + }
|
| + SkPaint fPaint;
|
| + uint32_t fStorage[200];
|
| + SkShader::Context* fCtx;
|
| + 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);)
|
| +
|
|
|