2016-02-17 18:00:07 +00:00
|
|
|
/*
|
|
|
|
* 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 {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.set("SkBitmapFP");
|
2016-02-17 18:00:07 +00:00
|
|
|
if (fM.getType() & SkMatrix::kPerspective_Mask) {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Perspective");
|
2016-02-17 18:00:07 +00:00
|
|
|
} else if (fM.getType() & SkMatrix::kAffine_Mask) {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Affine");
|
2016-02-17 18:00:07 +00:00
|
|
|
} else if (fM.getType() & SkMatrix::kScale_Mask) {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Scale");
|
2016-02-17 18:00:07 +00:00
|
|
|
} else if (fM.getType() & SkMatrix::kTranslate_Mask) {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Translate");
|
2016-02-17 18:00:07 +00:00
|
|
|
} else {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Identity");
|
2016-02-17 18:00:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append(tileName("X", fXTile));
|
|
|
|
fName.append(tileName("Y", fYTile));
|
2016-02-17 18:00:07 +00:00
|
|
|
|
|
|
|
if (fUseBilerp) {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Filter");
|
2016-02-17 18:00:07 +00:00
|
|
|
} else {
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.append("Nearest");
|
2016-02-17 18:00:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-17 19:57:24 +00:00
|
|
|
fName.appendf("%s", BaseName().c_str());
|
2016-02-17 18:00:07 +00:00
|
|
|
|
2016-02-17 19:57:24 +00:00
|
|
|
return fName.c_str();
|
2016-02-17 18:00:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2016-02-17 19:57:24 +00:00
|
|
|
SkString fName;
|
2016-02-17 18:00:07 +00:00
|
|
|
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) { }
|
2016-02-17 19:57:24 +00:00
|
|
|
|
2016-02-17 18:00:07 +00:00
|
|
|
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;
|
|
|
|
|
2016-02-17 21:50:46 +00:00
|
|
|
SkAutoTMalloc<SkPM4f> FPbuffer(width*height);
|
2016-02-17 18:00:07 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
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) { }
|
2016-02-17 19:57:24 +00:00
|
|
|
|
2016-02-17 18:00:07 +00:00
|
|
|
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;
|
|
|
|
|
2016-02-17 21:50:46 +00:00
|
|
|
SkAutoTMalloc<SkPMColor> buffer4b(width*height);
|
2016-02-17 18:00:07 +00:00
|
|
|
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
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);)
|
|
|
|
|