blob: ad5cf618825e7dc11a3c51566c24f9dc66b5009d [file] [log] [blame]
herbfeec8782016-02-17 10:00:07 -08001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include <memory>
9#include "SkColor.h"
10#include "SkLinearBitmapPipeline.h"
herb42da45d2016-04-08 14:24:37 -070011#include "SkBitmapProcShader.h"
reeddd9ffea2016-02-18 12:39:14 -080012#include "SkPM4f.h"
herbfeec8782016-02-17 10:00:07 -080013#include "Benchmark.h"
14#include "SkShader.h"
15#include "SkImage.h"
16
17struct CommonBitmapFPBenchmark : public Benchmark {
18 CommonBitmapFPBenchmark(
19 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -070020 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -080021 SkMatrix m,
22 bool useBilerp,
23 SkShader::TileMode xTile,
24 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -070025 : fIsSRGB(isSRGB)
herbfeec8782016-02-17 10:00:07 -080026 , fM{m}
27 , fUseBilerp{useBilerp}
28 , fXTile{xTile}
29 , fYTile{yTile} {
30 fSrcSize = srcSize;
31 }
32
33 static SkString tileName(const char* pre, SkShader::TileMode mode) {
34 SkString name{pre};
35 switch (mode) {
36 case SkShader::kClamp_TileMode:
37 name.append("Clamp");
38 return name;
39 case SkShader::kRepeat_TileMode:
40 name.append("Repeat");
41 return name;
42 case SkShader::kMirror_TileMode:
43 name.append("Mirror");
44 return name;
45 default:
46 name.append("Unknown");
47 return name;
48 }
49 }
50
51 const char* onGetName() override {
herb134ad3e2016-02-17 11:57:24 -080052 fName.set("SkBitmapFP");
herbfeec8782016-02-17 10:00:07 -080053 if (fM.getType() & SkMatrix::kPerspective_Mask) {
herb134ad3e2016-02-17 11:57:24 -080054 fName.append("Perspective");
herbfeec8782016-02-17 10:00:07 -080055 } else if (fM.getType() & SkMatrix::kAffine_Mask) {
herb134ad3e2016-02-17 11:57:24 -080056 fName.append("Affine");
herbfeec8782016-02-17 10:00:07 -080057 } else if (fM.getType() & SkMatrix::kScale_Mask) {
herb134ad3e2016-02-17 11:57:24 -080058 fName.append("Scale");
herbfeec8782016-02-17 10:00:07 -080059 } else if (fM.getType() & SkMatrix::kTranslate_Mask) {
herb134ad3e2016-02-17 11:57:24 -080060 fName.append("Translate");
herbfeec8782016-02-17 10:00:07 -080061 } else {
herb134ad3e2016-02-17 11:57:24 -080062 fName.append("Identity");
herbfeec8782016-02-17 10:00:07 -080063 }
64
herb134ad3e2016-02-17 11:57:24 -080065 fName.append(tileName("X", fXTile));
66 fName.append(tileName("Y", fYTile));
herbfeec8782016-02-17 10:00:07 -080067
68 if (fUseBilerp) {
herb134ad3e2016-02-17 11:57:24 -080069 fName.append("Filter");
herbfeec8782016-02-17 10:00:07 -080070 } else {
herb134ad3e2016-02-17 11:57:24 -080071 fName.append("Nearest");
herbfeec8782016-02-17 10:00:07 -080072 }
73
herb134ad3e2016-02-17 11:57:24 -080074 fName.appendf("%s", BaseName().c_str());
herbfeec8782016-02-17 10:00:07 -080075
herb134ad3e2016-02-17 11:57:24 -080076 return fName.c_str();
herbfeec8782016-02-17 10:00:07 -080077 }
78
79 void onPreDraw(SkCanvas*) override {
80 int width = fSrcSize.fWidth;
81 int height = fSrcSize.fHeight;
82 fBitmap.reset(new uint32_t[width * height]);
83 for (int y = 0; y < height; y++) {
84 for (int x = 0; x < width; x++) {
85 fBitmap[y * width + x] = (y << 8) + x + (128<<24);
86 }
87 }
88
89 bool trash = fM.invert(&fInvert);
90 sk_ignore_unused_variable(trash);
91
reeddabe5d32016-06-21 10:28:14 -070092 fInfo = SkImageInfo::MakeN32Premul(width, height, fIsSRGB ?
93 SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : nullptr);
herbfeec8782016-02-17 10:00:07 -080094 }
95
96 bool isSuitableFor(Backend backend) override {
97 return backend == kNonRendering_Backend;
98 }
99
100 virtual SkString BaseName() = 0;
101
herb134ad3e2016-02-17 11:57:24 -0800102 SkString fName;
herbfeec8782016-02-17 10:00:07 -0800103 SkISize fSrcSize;
reeddabe5d32016-06-21 10:28:14 -0700104 bool fIsSRGB;
herbfeec8782016-02-17 10:00:07 -0800105 SkMatrix fM;
106 SkMatrix fInvert;
107 bool fUseBilerp;
108 SkShader::TileMode fXTile;
109 SkShader::TileMode fYTile;
110 SkImageInfo fInfo;
111 std::unique_ptr<uint32_t[]> fBitmap;
112};
113
114struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark {
115 SkBitmapFPGeneral(
116 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700117 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800118 SkMatrix m,
119 bool useBilerp,
120 SkShader::TileMode xTile,
121 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700122 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800123
herbfeec8782016-02-17 10:00:07 -0800124 SkString BaseName() override {
125 SkString name;
reeddabe5d32016-06-21 10:28:14 -0700126 if (fInfo.gammaCloseToSRGB()) {
herbfeec8782016-02-17 10:00:07 -0800127 name.set("sRGB");
128 } else {
129 name.set("Linr");
130 }
131 return name;
132 }
133
134 void onDraw(int loops, SkCanvas*) override {
135 int width = fSrcSize.fWidth;
136 int height = fSrcSize.fHeight;
137
mtkleinb65fcd42016-02-17 13:50:46 -0800138 SkAutoTMalloc<SkPM4f> FPbuffer(width*height);
herbfeec8782016-02-17 10:00:07 -0800139
herbc5eddd72016-02-17 19:50:05 -0800140 SkFilterQuality filterQuality;
141 if (fUseBilerp) {
142 filterQuality = SkFilterQuality::kLow_SkFilterQuality;
143 } else {
144 filterQuality = SkFilterQuality::kNone_SkFilterQuality;
145 }
146
herbed545042016-02-18 13:55:02 -0800147 SkPixmap srcPixmap{fInfo, fBitmap.get(), static_cast<size_t>(4 * width)};
148
herbc5eddd72016-02-17 19:50:05 -0800149 SkLinearBitmapPipeline pipeline{
herb670f01f2016-05-13 10:04:46 -0700150 fInvert, filterQuality, fXTile, fYTile, SK_ColorBLACK, srcPixmap};
herbfeec8782016-02-17 10:00:07 -0800151
152 int count = 100;
153
154 for (int n = 0; n < 1000*loops; n++) {
155 pipeline.shadeSpan4f(3, 6, FPbuffer, count);
156 }
herbfeec8782016-02-17 10:00:07 -0800157 }
158};
159
160struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark {
161 SkBitmapFPOrigShader(
162 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700163 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800164 SkMatrix m,
165 bool useBilerp,
166 SkShader::TileMode xTile,
167 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700168 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800169
herbfeec8782016-02-17 10:00:07 -0800170 SkString BaseName() override {
171 SkString name{"Orig"};
172 return name;
173 }
174
175 void onPreDraw(SkCanvas* c) override {
176 CommonBitmapFPBenchmark::onPreDraw(c);
177
reed9ce9d672016-03-17 10:51:11 -0700178 fImage = SkImage::MakeRasterCopy(
179 SkPixmap(fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth));
reed5671c5b2016-03-09 14:47:34 -0800180 fPaint.setShader(fImage->makeShader(fXTile, fYTile));
herbfeec8782016-02-17 10:00:07 -0800181 if (fUseBilerp) {
182 fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality);
183 } else {
184 fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality);
185 }
herbfeec8782016-02-17 10:00:07 -0800186 }
187
188 void onPostDraw(SkCanvas*) override {
189
190 }
191
192 void onDraw(int loops, SkCanvas*) override {
193 int width = fSrcSize.fWidth;
194 int height = fSrcSize.fHeight;
195
mtkleinb65fcd42016-02-17 13:50:46 -0800196 SkAutoTMalloc<SkPMColor> buffer4b(width*height);
herbfeec8782016-02-17 10:00:07 -0800197
herb42da45d2016-04-08 14:24:37 -0700198 uint32_t storage[kSkBlitterContextSize];
fmalitad0c4e092016-02-22 17:19:04 -0800199 const SkShader::ContextRec rec(fPaint, fM, nullptr,
200 SkShader::ContextRec::kPMColor_DstType);
fmalita8d9f2e42016-02-22 10:39:41 -0800201 SkASSERT(fPaint.getShader()->contextSize(rec) <= sizeof(storage));
202 SkShader::Context* ctx = fPaint.getShader()->createContext(rec, storage);
herbfeec8782016-02-17 10:00:07 -0800203
204 int count = 100;
205
206 for (int n = 0; n < 1000*loops; n++) {
207 ctx->shadeSpan(3, 6, buffer4b, count);
208 }
209
210 ctx->~Context();
herbfeec8782016-02-17 10:00:07 -0800211 }
212 SkPaint fPaint;
reed9ce9d672016-03-17 10:51:11 -0700213 sk_sp<SkImage> fImage;
herbfeec8782016-02-17 10:00:07 -0800214};
215
reeddabe5d32016-06-21 10:28:14 -0700216const bool gSRGB = true;
217const bool gLinearRGB = false;
herbfeec8782016-02-17 10:00:07 -0800218static SkISize srcSize = SkISize::Make(120, 100);
219static SkMatrix mI = SkMatrix::I();
220DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700221 srcSize, gSRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800222 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
223
224DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700225 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800226 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
227
228DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700229 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800230 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
231
232DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700233 srcSize, gSRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800234 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
235
236DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700237 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800238 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
239
240DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700241 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800242 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
243
244static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f);
245DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700246 srcSize, gSRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800247 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
248
249DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700250 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800251 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
252
253DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700254 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800255 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
256
257DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700258 srcSize, gSRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800259 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
260
261DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700262 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800263 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
264
265DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700266 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800267 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
268
herb6eff52a2016-03-23 09:00:33 -0700269// Repeat
270DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700271 srcSize, gSRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700272 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
273
274DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700275 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700276 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
277
278DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700279 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700280 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
281
282DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700283 srcSize, gSRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700284 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
285
286DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700287 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700288 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
289
290DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700291 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700292 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
293
herbfeec8782016-02-17 10:00:07 -0800294static SkMatrix rotate(SkScalar r) {
295 SkMatrix m;
296 m.setRotate(30);
297 return m;
298}
299
300static SkMatrix mR = rotate(30);
301DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700302 srcSize, gSRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800303 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
304
305DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700306 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800307 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
308
309DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700310 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800311 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
312
313DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700314 srcSize, gSRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800315 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
316
317DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700318 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800319 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
320
321DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700322 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800323 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
324
herb6eff52a2016-03-23 09:00:33 -0700325// Repeat
326DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700327 srcSize, gSRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700328 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
329
330DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700331 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700332 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
333
334DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700335 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700336 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
337
338DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700339 srcSize, gSRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700340 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
341
342DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700343 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700344 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
345
346DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700347 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700348 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)