blob: 29f28895bf4cd96b03b8db8061c54020f4d2590f [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>
herbfeec8782016-02-17 10:00:07 -08009#include "Benchmark.h"
Herb Derby83e939b2017-02-07 14:25:11 -050010
11#include "SkArenaAlloc.h"
Herb Derbydfa492e2016-11-17 21:12:36 -050012#include "SkBitmapProcShader.h"
13#include "SkColor.h"
Herb Derbyac04fef2017-01-13 17:34:33 -050014#include "SkArenaAlloc.h"
herbfeec8782016-02-17 10:00:07 -080015#include "SkImage.h"
Herb Derbydfa492e2016-11-17 21:12:36 -050016#include "SkLinearBitmapPipeline.h"
17#include "SkPM4f.h"
18#include "SkShader.h"
herbfeec8782016-02-17 10:00:07 -080019
20struct CommonBitmapFPBenchmark : public Benchmark {
21 CommonBitmapFPBenchmark(
22 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -070023 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -080024 SkMatrix m,
25 bool useBilerp,
26 SkShader::TileMode xTile,
27 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -070028 : fIsSRGB(isSRGB)
herbfeec8782016-02-17 10:00:07 -080029 , fM{m}
30 , fUseBilerp{useBilerp}
31 , fXTile{xTile}
32 , fYTile{yTile} {
33 fSrcSize = srcSize;
34 }
35
36 static SkString tileName(const char* pre, SkShader::TileMode mode) {
37 SkString name{pre};
38 switch (mode) {
39 case SkShader::kClamp_TileMode:
40 name.append("Clamp");
41 return name;
42 case SkShader::kRepeat_TileMode:
43 name.append("Repeat");
44 return name;
45 case SkShader::kMirror_TileMode:
46 name.append("Mirror");
47 return name;
48 default:
49 name.append("Unknown");
50 return name;
51 }
52 }
53
54 const char* onGetName() override {
herb134ad3e2016-02-17 11:57:24 -080055 fName.set("SkBitmapFP");
herbfeec8782016-02-17 10:00:07 -080056 if (fM.getType() & SkMatrix::kPerspective_Mask) {
herb134ad3e2016-02-17 11:57:24 -080057 fName.append("Perspective");
herbfeec8782016-02-17 10:00:07 -080058 } else if (fM.getType() & SkMatrix::kAffine_Mask) {
herb134ad3e2016-02-17 11:57:24 -080059 fName.append("Affine");
herbfeec8782016-02-17 10:00:07 -080060 } else if (fM.getType() & SkMatrix::kScale_Mask) {
herb134ad3e2016-02-17 11:57:24 -080061 fName.append("Scale");
herbfeec8782016-02-17 10:00:07 -080062 } else if (fM.getType() & SkMatrix::kTranslate_Mask) {
herb134ad3e2016-02-17 11:57:24 -080063 fName.append("Translate");
herbfeec8782016-02-17 10:00:07 -080064 } else {
herb134ad3e2016-02-17 11:57:24 -080065 fName.append("Identity");
herbfeec8782016-02-17 10:00:07 -080066 }
67
herb134ad3e2016-02-17 11:57:24 -080068 fName.append(tileName("X", fXTile));
69 fName.append(tileName("Y", fYTile));
herbfeec8782016-02-17 10:00:07 -080070
71 if (fUseBilerp) {
herb134ad3e2016-02-17 11:57:24 -080072 fName.append("Filter");
herbfeec8782016-02-17 10:00:07 -080073 } else {
herb134ad3e2016-02-17 11:57:24 -080074 fName.append("Nearest");
herbfeec8782016-02-17 10:00:07 -080075 }
76
herb134ad3e2016-02-17 11:57:24 -080077 fName.appendf("%s", BaseName().c_str());
herbfeec8782016-02-17 10:00:07 -080078
herb134ad3e2016-02-17 11:57:24 -080079 return fName.c_str();
herbfeec8782016-02-17 10:00:07 -080080 }
81
82 void onPreDraw(SkCanvas*) override {
83 int width = fSrcSize.fWidth;
84 int height = fSrcSize.fHeight;
85 fBitmap.reset(new uint32_t[width * height]);
86 for (int y = 0; y < height; y++) {
87 for (int x = 0; x < width; x++) {
88 fBitmap[y * width + x] = (y << 8) + x + (128<<24);
89 }
90 }
91
92 bool trash = fM.invert(&fInvert);
93 sk_ignore_unused_variable(trash);
94
reeddabe5d32016-06-21 10:28:14 -070095 fInfo = SkImageInfo::MakeN32Premul(width, height, fIsSRGB ?
Matt Sarett77a7a1b2017-02-07 13:56:11 -050096 SkColorSpace::MakeSRGB() : nullptr);
herbfeec8782016-02-17 10:00:07 -080097 }
98
99 bool isSuitableFor(Backend backend) override {
100 return backend == kNonRendering_Backend;
101 }
102
103 virtual SkString BaseName() = 0;
104
herb134ad3e2016-02-17 11:57:24 -0800105 SkString fName;
herbfeec8782016-02-17 10:00:07 -0800106 SkISize fSrcSize;
reeddabe5d32016-06-21 10:28:14 -0700107 bool fIsSRGB;
herbfeec8782016-02-17 10:00:07 -0800108 SkMatrix fM;
109 SkMatrix fInvert;
110 bool fUseBilerp;
111 SkShader::TileMode fXTile;
112 SkShader::TileMode fYTile;
113 SkImageInfo fInfo;
114 std::unique_ptr<uint32_t[]> fBitmap;
115};
116
117struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark {
118 SkBitmapFPGeneral(
119 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700120 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800121 SkMatrix m,
122 bool useBilerp,
123 SkShader::TileMode xTile,
124 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700125 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800126
herbfeec8782016-02-17 10:00:07 -0800127 SkString BaseName() override {
128 SkString name;
reeddabe5d32016-06-21 10:28:14 -0700129 if (fInfo.gammaCloseToSRGB()) {
herbfeec8782016-02-17 10:00:07 -0800130 name.set("sRGB");
131 } else {
132 name.set("Linr");
133 }
134 return name;
135 }
136
137 void onDraw(int loops, SkCanvas*) override {
138 int width = fSrcSize.fWidth;
139 int height = fSrcSize.fHeight;
140
mtkleinb65fcd42016-02-17 13:50:46 -0800141 SkAutoTMalloc<SkPM4f> FPbuffer(width*height);
herbfeec8782016-02-17 10:00:07 -0800142
herbc5eddd72016-02-17 19:50:05 -0800143 SkFilterQuality filterQuality;
144 if (fUseBilerp) {
145 filterQuality = SkFilterQuality::kLow_SkFilterQuality;
146 } else {
147 filterQuality = SkFilterQuality::kNone_SkFilterQuality;
148 }
149
herbed545042016-02-18 13:55:02 -0800150 SkPixmap srcPixmap{fInfo, fBitmap.get(), static_cast<size_t>(4 * width)};
151
Herb Derbydfa492e2016-11-17 21:12:36 -0500152
153 char storage[600];
Herb Derby0497f082017-01-13 11:30:44 -0500154 SkArenaAlloc allocator{storage, sizeof(storage), 512};
herbc5eddd72016-02-17 19:50:05 -0800155 SkLinearBitmapPipeline pipeline{
Herb Derbydfa492e2016-11-17 21:12:36 -0500156 fInvert, filterQuality, fXTile, fYTile, SK_ColorBLACK, srcPixmap, &allocator};
herbfeec8782016-02-17 10:00:07 -0800157
158 int count = 100;
159
160 for (int n = 0; n < 1000*loops; n++) {
161 pipeline.shadeSpan4f(3, 6, FPbuffer, count);
162 }
herbfeec8782016-02-17 10:00:07 -0800163 }
164};
165
166struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark {
167 SkBitmapFPOrigShader(
168 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700169 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800170 SkMatrix m,
171 bool useBilerp,
172 SkShader::TileMode xTile,
173 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700174 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800175
herbfeec8782016-02-17 10:00:07 -0800176 SkString BaseName() override {
177 SkString name{"Orig"};
178 return name;
179 }
180
181 void onPreDraw(SkCanvas* c) override {
182 CommonBitmapFPBenchmark::onPreDraw(c);
183
reed9ce9d672016-03-17 10:51:11 -0700184 fImage = SkImage::MakeRasterCopy(
185 SkPixmap(fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth));
reed5671c5b2016-03-09 14:47:34 -0800186 fPaint.setShader(fImage->makeShader(fXTile, fYTile));
herbfeec8782016-02-17 10:00:07 -0800187 if (fUseBilerp) {
188 fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality);
189 } else {
190 fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality);
191 }
herbfeec8782016-02-17 10:00:07 -0800192 }
193
194 void onPostDraw(SkCanvas*) override {
195
196 }
197
198 void onDraw(int loops, SkCanvas*) override {
199 int width = fSrcSize.fWidth;
200 int height = fSrcSize.fHeight;
201
mtkleinb65fcd42016-02-17 13:50:46 -0800202 SkAutoTMalloc<SkPMColor> buffer4b(width*height);
herbfeec8782016-02-17 10:00:07 -0800203
Herb Derby83e939b2017-02-07 14:25:11 -0500204 SkArenaAlloc alloc{kSkBlitterContextSize * sizeof(uint32_t)};
fmalitad0c4e092016-02-22 17:19:04 -0800205 const SkShader::ContextRec rec(fPaint, fM, nullptr,
Brian Osman11970e52016-12-05 15:26:50 -0500206 SkShader::ContextRec::kPMColor_DstType,
207 nullptr);
Herb Derby83e939b2017-02-07 14:25:11 -0500208 SkShader::Context* ctx = fPaint.getShader()->makeContext(rec, &alloc);
herbfeec8782016-02-17 10:00:07 -0800209
210 int count = 100;
211
212 for (int n = 0; n < 1000*loops; n++) {
213 ctx->shadeSpan(3, 6, buffer4b, count);
214 }
215
216 ctx->~Context();
herbfeec8782016-02-17 10:00:07 -0800217 }
218 SkPaint fPaint;
reed9ce9d672016-03-17 10:51:11 -0700219 sk_sp<SkImage> fImage;
herbfeec8782016-02-17 10:00:07 -0800220};
221
reeddabe5d32016-06-21 10:28:14 -0700222const bool gSRGB = true;
223const bool gLinearRGB = false;
herbfeec8782016-02-17 10:00:07 -0800224static SkISize srcSize = SkISize::Make(120, 100);
225static SkMatrix mI = SkMatrix::I();
226DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700227 srcSize, gSRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800228 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
229
230DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700231 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800232 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
233
234DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700235 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800236 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
237
238DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700239 srcSize, gSRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800240 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
241
242DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700243 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800244 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
245
246DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700247 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800248 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
249
250static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f);
251DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700252 srcSize, gSRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800253 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
254
255DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700256 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800257 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
258
259DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700260 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800261 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
262
263DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700264 srcSize, gSRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800265 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
266
267DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700268 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800269 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
270
271DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700272 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800273 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
274
herb6eff52a2016-03-23 09:00:33 -0700275// Repeat
276DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700277 srcSize, gSRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700278 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
279
280DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700281 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700282 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
283
284DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700285 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700286 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
287
288DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700289 srcSize, gSRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700290 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
291
292DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700293 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700294 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
295
296DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700297 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700298 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
299
herbfeec8782016-02-17 10:00:07 -0800300static SkMatrix rotate(SkScalar r) {
301 SkMatrix m;
302 m.setRotate(30);
303 return m;
304}
305
306static SkMatrix mR = rotate(30);
307DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700308 srcSize, gSRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800309 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
310
311DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700312 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800313 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
314
315DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700316 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800317 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
318
319DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700320 srcSize, gSRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800321 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
322
323DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700324 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800325 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
326
327DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700328 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800329 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
330
herb6eff52a2016-03-23 09:00:33 -0700331// Repeat
332DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700333 srcSize, gSRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700334 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
335
336DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700337 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700338 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
339
340DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700341 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700342 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
343
344DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700345 srcSize, gSRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700346 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
347
348DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700349 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700350 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
351
352DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700353 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700354 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)