blob: 4e892b6a067e4b715beeef4900347611354c1348 [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 Derbydfa492e2016-11-17 21:12:36 -050010#include "SkBitmapProcShader.h"
11#include "SkColor.h"
Herb Derbyac04fef2017-01-13 17:34:33 -050012#include "SkArenaAlloc.h"
herbfeec8782016-02-17 10:00:07 -080013#include "SkImage.h"
Herb Derbydfa492e2016-11-17 21:12:36 -050014#include "SkLinearBitmapPipeline.h"
15#include "SkPM4f.h"
16#include "SkShader.h"
herbfeec8782016-02-17 10:00:07 -080017
18struct CommonBitmapFPBenchmark : public Benchmark {
19 CommonBitmapFPBenchmark(
20 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -070021 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -080022 SkMatrix m,
23 bool useBilerp,
24 SkShader::TileMode xTile,
25 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -070026 : fIsSRGB(isSRGB)
herbfeec8782016-02-17 10:00:07 -080027 , fM{m}
28 , fUseBilerp{useBilerp}
29 , fXTile{xTile}
30 , fYTile{yTile} {
31 fSrcSize = srcSize;
32 }
33
34 static SkString tileName(const char* pre, SkShader::TileMode mode) {
35 SkString name{pre};
36 switch (mode) {
37 case SkShader::kClamp_TileMode:
38 name.append("Clamp");
39 return name;
40 case SkShader::kRepeat_TileMode:
41 name.append("Repeat");
42 return name;
43 case SkShader::kMirror_TileMode:
44 name.append("Mirror");
45 return name;
46 default:
47 name.append("Unknown");
48 return name;
49 }
50 }
51
52 const char* onGetName() override {
herb134ad3e2016-02-17 11:57:24 -080053 fName.set("SkBitmapFP");
herbfeec8782016-02-17 10:00:07 -080054 if (fM.getType() & SkMatrix::kPerspective_Mask) {
herb134ad3e2016-02-17 11:57:24 -080055 fName.append("Perspective");
herbfeec8782016-02-17 10:00:07 -080056 } else if (fM.getType() & SkMatrix::kAffine_Mask) {
herb134ad3e2016-02-17 11:57:24 -080057 fName.append("Affine");
herbfeec8782016-02-17 10:00:07 -080058 } else if (fM.getType() & SkMatrix::kScale_Mask) {
herb134ad3e2016-02-17 11:57:24 -080059 fName.append("Scale");
herbfeec8782016-02-17 10:00:07 -080060 } else if (fM.getType() & SkMatrix::kTranslate_Mask) {
herb134ad3e2016-02-17 11:57:24 -080061 fName.append("Translate");
herbfeec8782016-02-17 10:00:07 -080062 } else {
herb134ad3e2016-02-17 11:57:24 -080063 fName.append("Identity");
herbfeec8782016-02-17 10:00:07 -080064 }
65
herb134ad3e2016-02-17 11:57:24 -080066 fName.append(tileName("X", fXTile));
67 fName.append(tileName("Y", fYTile));
herbfeec8782016-02-17 10:00:07 -080068
69 if (fUseBilerp) {
herb134ad3e2016-02-17 11:57:24 -080070 fName.append("Filter");
herbfeec8782016-02-17 10:00:07 -080071 } else {
herb134ad3e2016-02-17 11:57:24 -080072 fName.append("Nearest");
herbfeec8782016-02-17 10:00:07 -080073 }
74
herb134ad3e2016-02-17 11:57:24 -080075 fName.appendf("%s", BaseName().c_str());
herbfeec8782016-02-17 10:00:07 -080076
herb134ad3e2016-02-17 11:57:24 -080077 return fName.c_str();
herbfeec8782016-02-17 10:00:07 -080078 }
79
80 void onPreDraw(SkCanvas*) override {
81 int width = fSrcSize.fWidth;
82 int height = fSrcSize.fHeight;
83 fBitmap.reset(new uint32_t[width * height]);
84 for (int y = 0; y < height; y++) {
85 for (int x = 0; x < width; x++) {
86 fBitmap[y * width + x] = (y << 8) + x + (128<<24);
87 }
88 }
89
90 bool trash = fM.invert(&fInvert);
91 sk_ignore_unused_variable(trash);
92
reeddabe5d32016-06-21 10:28:14 -070093 fInfo = SkImageInfo::MakeN32Premul(width, height, fIsSRGB ?
Brian Osman526972e2016-10-24 09:24:02 -040094 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named) : nullptr);
herbfeec8782016-02-17 10:00:07 -080095 }
96
97 bool isSuitableFor(Backend backend) override {
98 return backend == kNonRendering_Backend;
99 }
100
101 virtual SkString BaseName() = 0;
102
herb134ad3e2016-02-17 11:57:24 -0800103 SkString fName;
herbfeec8782016-02-17 10:00:07 -0800104 SkISize fSrcSize;
reeddabe5d32016-06-21 10:28:14 -0700105 bool fIsSRGB;
herbfeec8782016-02-17 10:00:07 -0800106 SkMatrix fM;
107 SkMatrix fInvert;
108 bool fUseBilerp;
109 SkShader::TileMode fXTile;
110 SkShader::TileMode fYTile;
111 SkImageInfo fInfo;
112 std::unique_ptr<uint32_t[]> fBitmap;
113};
114
115struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark {
116 SkBitmapFPGeneral(
117 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700118 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800119 SkMatrix m,
120 bool useBilerp,
121 SkShader::TileMode xTile,
122 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700123 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800124
herbfeec8782016-02-17 10:00:07 -0800125 SkString BaseName() override {
126 SkString name;
reeddabe5d32016-06-21 10:28:14 -0700127 if (fInfo.gammaCloseToSRGB()) {
herbfeec8782016-02-17 10:00:07 -0800128 name.set("sRGB");
129 } else {
130 name.set("Linr");
131 }
132 return name;
133 }
134
135 void onDraw(int loops, SkCanvas*) override {
136 int width = fSrcSize.fWidth;
137 int height = fSrcSize.fHeight;
138
mtkleinb65fcd42016-02-17 13:50:46 -0800139 SkAutoTMalloc<SkPM4f> FPbuffer(width*height);
herbfeec8782016-02-17 10:00:07 -0800140
herbc5eddd72016-02-17 19:50:05 -0800141 SkFilterQuality filterQuality;
142 if (fUseBilerp) {
143 filterQuality = SkFilterQuality::kLow_SkFilterQuality;
144 } else {
145 filterQuality = SkFilterQuality::kNone_SkFilterQuality;
146 }
147
herbed545042016-02-18 13:55:02 -0800148 SkPixmap srcPixmap{fInfo, fBitmap.get(), static_cast<size_t>(4 * width)};
149
Herb Derbydfa492e2016-11-17 21:12:36 -0500150
151 char storage[600];
Herb Derby0497f082017-01-13 11:30:44 -0500152 SkArenaAlloc allocator{storage, sizeof(storage), 512};
herbc5eddd72016-02-17 19:50:05 -0800153 SkLinearBitmapPipeline pipeline{
Herb Derbydfa492e2016-11-17 21:12:36 -0500154 fInvert, filterQuality, fXTile, fYTile, SK_ColorBLACK, srcPixmap, &allocator};
herbfeec8782016-02-17 10:00:07 -0800155
156 int count = 100;
157
158 for (int n = 0; n < 1000*loops; n++) {
159 pipeline.shadeSpan4f(3, 6, FPbuffer, count);
160 }
herbfeec8782016-02-17 10:00:07 -0800161 }
162};
163
164struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark {
165 SkBitmapFPOrigShader(
166 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700167 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800168 SkMatrix m,
169 bool useBilerp,
170 SkShader::TileMode xTile,
171 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700172 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800173
herbfeec8782016-02-17 10:00:07 -0800174 SkString BaseName() override {
175 SkString name{"Orig"};
176 return name;
177 }
178
179 void onPreDraw(SkCanvas* c) override {
180 CommonBitmapFPBenchmark::onPreDraw(c);
181
reed9ce9d672016-03-17 10:51:11 -0700182 fImage = SkImage::MakeRasterCopy(
183 SkPixmap(fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth));
reed5671c5b2016-03-09 14:47:34 -0800184 fPaint.setShader(fImage->makeShader(fXTile, fYTile));
herbfeec8782016-02-17 10:00:07 -0800185 if (fUseBilerp) {
186 fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality);
187 } else {
188 fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality);
189 }
herbfeec8782016-02-17 10:00:07 -0800190 }
191
192 void onPostDraw(SkCanvas*) override {
193
194 }
195
196 void onDraw(int loops, SkCanvas*) override {
197 int width = fSrcSize.fWidth;
198 int height = fSrcSize.fHeight;
199
mtkleinb65fcd42016-02-17 13:50:46 -0800200 SkAutoTMalloc<SkPMColor> buffer4b(width*height);
herbfeec8782016-02-17 10:00:07 -0800201
herb42da45d2016-04-08 14:24:37 -0700202 uint32_t storage[kSkBlitterContextSize];
fmalitad0c4e092016-02-22 17:19:04 -0800203 const SkShader::ContextRec rec(fPaint, fM, nullptr,
Brian Osman11970e52016-12-05 15:26:50 -0500204 SkShader::ContextRec::kPMColor_DstType,
205 nullptr);
fmalita8d9f2e42016-02-22 10:39:41 -0800206 SkASSERT(fPaint.getShader()->contextSize(rec) <= sizeof(storage));
207 SkShader::Context* ctx = fPaint.getShader()->createContext(rec, storage);
herbfeec8782016-02-17 10:00:07 -0800208
209 int count = 100;
210
211 for (int n = 0; n < 1000*loops; n++) {
212 ctx->shadeSpan(3, 6, buffer4b, count);
213 }
214
215 ctx->~Context();
herbfeec8782016-02-17 10:00:07 -0800216 }
217 SkPaint fPaint;
reed9ce9d672016-03-17 10:51:11 -0700218 sk_sp<SkImage> fImage;
herbfeec8782016-02-17 10:00:07 -0800219};
220
reeddabe5d32016-06-21 10:28:14 -0700221const bool gSRGB = true;
222const bool gLinearRGB = false;
herbfeec8782016-02-17 10:00:07 -0800223static SkISize srcSize = SkISize::Make(120, 100);
224static SkMatrix mI = SkMatrix::I();
225DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700226 srcSize, gSRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800227 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
228
229DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700230 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800231 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
232
233DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700234 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800235 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
236
237DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700238 srcSize, gSRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800239 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
240
241DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700242 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800243 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
244
245DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700246 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800247 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
248
249static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f);
250DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700251 srcSize, gSRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800252 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
253
254DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700255 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800256 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
257
258DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700259 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800260 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
261
262DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700263 srcSize, gSRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800264 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
265
266DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700267 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800268 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
269
270DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700271 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800272 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
273
herb6eff52a2016-03-23 09:00:33 -0700274// Repeat
275DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700276 srcSize, gSRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700277 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
278
279DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700280 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700281 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
282
283DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700284 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700285 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
286
287DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700288 srcSize, gSRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700289 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
290
291DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700292 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700293 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
294
295DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700296 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700297 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
298
herbfeec8782016-02-17 10:00:07 -0800299static SkMatrix rotate(SkScalar r) {
300 SkMatrix m;
301 m.setRotate(30);
302 return m;
303}
304
305static SkMatrix mR = rotate(30);
306DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700307 srcSize, gSRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800308 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
309
310DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700311 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800312 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
313
314DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700315 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800316 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
317
318DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700319 srcSize, gSRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800320 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
321
322DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700323 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800324 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
325
326DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700327 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800328 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
329
herb6eff52a2016-03-23 09:00:33 -0700330// Repeat
331DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700332 srcSize, gSRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700333 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
334
335DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700336 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700337 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
338
339DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700340 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700341 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
342
343DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700344 srcSize, gSRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700345 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
346
347DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700348 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700349 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
350
351DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700352 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700353 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)