blob: bbacac7431eb99bde81fd1807dbfff613e82477c [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"
Florin Malita4aed1382017-05-25 10:38:07 -040018#include "SkShaderBase.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
Florin Malita14a64302017-05-24 14:53:44 -0400153 SkSTArenaAlloc<600> allocator(512);
herbc5eddd72016-02-17 19:50:05 -0800154 SkLinearBitmapPipeline pipeline{
Herb Derbydfa492e2016-11-17 21:12:36 -0500155 fInvert, filterQuality, fXTile, fYTile, SK_ColorBLACK, srcPixmap, &allocator};
herbfeec8782016-02-17 10:00:07 -0800156
157 int count = 100;
158
159 for (int n = 0; n < 1000*loops; n++) {
160 pipeline.shadeSpan4f(3, 6, FPbuffer, count);
161 }
herbfeec8782016-02-17 10:00:07 -0800162 }
163};
164
165struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark {
166 SkBitmapFPOrigShader(
167 SkISize srcSize,
reeddabe5d32016-06-21 10:28:14 -0700168 bool isSRGB,
herbfeec8782016-02-17 10:00:07 -0800169 SkMatrix m,
170 bool useBilerp,
171 SkShader::TileMode xTile,
172 SkShader::TileMode yTile)
reeddabe5d32016-06-21 10:28:14 -0700173 : CommonBitmapFPBenchmark(srcSize, isSRGB, m, useBilerp, xTile, yTile) { }
herb134ad3e2016-02-17 11:57:24 -0800174
herbfeec8782016-02-17 10:00:07 -0800175 SkString BaseName() override {
176 SkString name{"Orig"};
177 return name;
178 }
179
180 void onPreDraw(SkCanvas* c) override {
181 CommonBitmapFPBenchmark::onPreDraw(c);
182
reed9ce9d672016-03-17 10:51:11 -0700183 fImage = SkImage::MakeRasterCopy(
184 SkPixmap(fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth));
reed5671c5b2016-03-09 14:47:34 -0800185 fPaint.setShader(fImage->makeShader(fXTile, fYTile));
herbfeec8782016-02-17 10:00:07 -0800186 if (fUseBilerp) {
187 fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality);
188 } else {
189 fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality);
190 }
herbfeec8782016-02-17 10:00:07 -0800191 }
192
193 void onPostDraw(SkCanvas*) override {
194
195 }
196
197 void onDraw(int loops, SkCanvas*) override {
198 int width = fSrcSize.fWidth;
199 int height = fSrcSize.fHeight;
200
mtkleinb65fcd42016-02-17 13:50:46 -0800201 SkAutoTMalloc<SkPMColor> buffer4b(width*height);
herbfeec8782016-02-17 10:00:07 -0800202
Herb Derby9852dc02017-02-07 17:57:47 -0500203 SkArenaAlloc alloc{0};
Florin Malita4aed1382017-05-25 10:38:07 -0400204 const SkShaderBase::ContextRec rec(fPaint, fM, nullptr,
205 SkShaderBase::ContextRec::kPMColor_DstType,
206 nullptr);
207 SkShaderBase::Context* ctx = as_SB(fPaint.getShader())->makeContext(rec, &alloc);
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 }
herbfeec8782016-02-17 10:00:07 -0800214 }
215 SkPaint fPaint;
reed9ce9d672016-03-17 10:51:11 -0700216 sk_sp<SkImage> fImage;
herbfeec8782016-02-17 10:00:07 -0800217};
218
reeddabe5d32016-06-21 10:28:14 -0700219const bool gSRGB = true;
220const bool gLinearRGB = false;
herbfeec8782016-02-17 10:00:07 -0800221static SkISize srcSize = SkISize::Make(120, 100);
222static SkMatrix mI = SkMatrix::I();
223DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700224 srcSize, gSRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800225 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
226
227DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700228 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800229 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
230
231DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700232 srcSize, gLinearRGB, mI, false,
herbfeec8782016-02-17 10:00:07 -0800233 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
234
235DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700236 srcSize, gSRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800237 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
238
239DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700240 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800241 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
242
243DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700244 srcSize, gLinearRGB, mI, true,
herbfeec8782016-02-17 10:00:07 -0800245 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
246
247static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f);
248DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700249 srcSize, gSRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800250 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
251
252DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700253 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800254 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
255
256DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700257 srcSize, gLinearRGB, mS, false,
herbfeec8782016-02-17 10:00:07 -0800258 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
259
260DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700261 srcSize, gSRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800262 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
263
264DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700265 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800266 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
267
268DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700269 srcSize, gLinearRGB, mS, true,
herbfeec8782016-02-17 10:00:07 -0800270 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
271
herb6eff52a2016-03-23 09:00:33 -0700272// Repeat
273DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700274 srcSize, gSRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700275 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
276
277DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700278 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700279 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
280
281DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700282 srcSize, gLinearRGB, mS, false,
herb6eff52a2016-03-23 09:00:33 -0700283 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
284
285DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700286 srcSize, gSRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700287 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
288
289DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700290 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700291 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
292
293DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700294 srcSize, gLinearRGB, mS, true,
herb6eff52a2016-03-23 09:00:33 -0700295 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
296
herbfeec8782016-02-17 10:00:07 -0800297static SkMatrix rotate(SkScalar r) {
298 SkMatrix m;
299 m.setRotate(30);
300 return m;
301}
302
303static SkMatrix mR = rotate(30);
304DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700305 srcSize, gSRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800306 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
307
308DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700309 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800310 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
311
312DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700313 srcSize, gLinearRGB, mR, false,
herbfeec8782016-02-17 10:00:07 -0800314 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
315
316DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700317 srcSize, gSRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800318 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
319
320DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700321 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800322 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
323
324DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700325 srcSize, gLinearRGB, mR, true,
herbfeec8782016-02-17 10:00:07 -0800326 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
327
herb6eff52a2016-03-23 09:00:33 -0700328// Repeat
329DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700330 srcSize, gSRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700331 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
332
333DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700334 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700335 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
336
337DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700338 srcSize, gLinearRGB, mR, false,
herb6eff52a2016-03-23 09:00:33 -0700339 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
340
341DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700342 srcSize, gSRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700343 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
344
345DEF_BENCH(return new SkBitmapFPGeneral(
reeddabe5d32016-06-21 10:28:14 -0700346 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700347 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
348
349DEF_BENCH(return new SkBitmapFPOrigShader(
reeddabe5d32016-06-21 10:28:14 -0700350 srcSize, gLinearRGB, mR, true,
herb6eff52a2016-03-23 09:00:33 -0700351 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)