Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: bench/SkLinearBitmapPipelineBench.cpp

Issue 1704583003: Simplified linear pipeline. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | gm/SkLinearBitmapPipelineGM.cpp » ('j') | src/core/SkLinearBitmapPipeline.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
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"
11 #include "Benchmark.h"
12 #include "SkShader.h"
13 #include "SkImage.h"
14
15 struct CommonBitmapFPBenchmark : public Benchmark {
16 CommonBitmapFPBenchmark(
17 SkISize srcSize,
18 SkColorProfileType colorProfile,
19 SkMatrix m,
20 bool useBilerp,
21 SkShader::TileMode xTile,
22 SkShader::TileMode yTile)
23 : fColorProfile(colorProfile)
24 , fM{m}
25 , fUseBilerp{useBilerp}
26 , fXTile{xTile}
27 , fYTile{yTile} {
28 fSrcSize = srcSize;
29 }
30
31 static SkString tileName(const char* pre, SkShader::TileMode mode) {
32 SkString name{pre};
33 switch (mode) {
34 case SkShader::kClamp_TileMode:
35 name.append("Clamp");
36 return name;
37 case SkShader::kRepeat_TileMode:
38 name.append("Repeat");
39 return name;
40 case SkShader::kMirror_TileMode:
41 name.append("Mirror");
42 return name;
43 }
44 }
45
46 const char* onGetName() override {
47 SkString name {"SkBitmapFP"};
48 if (fM.getType() & SkMatrix::kPerspective_Mask) {
49 name.append("Perspective");
50 } else if (fM.getType() & SkMatrix::kAffine_Mask) {
51 name.append("Affine");
52 } else if (fM.getType() & SkMatrix::kScale_Mask) {
53 name.append("Scale");
54 } else if (fM.getType() & SkMatrix::kTranslate_Mask) {
55 name.append("Translate");
56 } else {
57 name.append("Identity");
58 }
59
60 name.append(tileName("X", fXTile));
61 name.append(tileName("Y", fYTile));
62
63 if (fUseBilerp) {
64 name.append("Filter");
65 } else {
66 name.append("Nearest");
67 }
68
69 name.appendf("%s", BaseName().c_str());
70
71 return name.c_str();
72 }
73
74 void onPreDraw(SkCanvas*) override {
75 int width = fSrcSize.fWidth;
76 int height = fSrcSize.fHeight;
77 fBitmap.reset(new uint32_t[width * height]);
78 for (int y = 0; y < height; y++) {
79 for (int x = 0; x < width; x++) {
80 fBitmap[y * width + x] = (y << 8) + x + (128<<24);
81 }
82 }
83
84 (void)fM.invert(&fInvert);
85
86 fInfo = SkImageInfo::MakeN32Premul(width, height, fColorProfile);
87 }
88
89 bool isSuitableFor(Backend backend) override {
90 return backend == kNonRendering_Backend;
91 }
92
93 virtual SkString BaseName() = 0;
94
95 SkISize fSrcSize;
96 SkColorProfileType fColorProfile;
97 SkMatrix fM;
98 SkMatrix fInvert;
99 bool fUseBilerp;
100 SkShader::TileMode fXTile;
101 SkShader::TileMode fYTile;
102 SkImageInfo fInfo;
103 std::unique_ptr<uint32_t[]> fBitmap;
104 };
105
106 struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark {
107 using CommonBitmapFPBenchmark::CommonBitmapFPBenchmark;
108 SkString BaseName() override {
109 SkString name;
110 if (fInfo.isSRGB()) {
111 name.set("sRGB");
112 } else {
113 name.set("Linr");
114 }
115 return name;
116 }
117
118 void onPreDraw(SkCanvas* c) override {
119 CommonBitmapFPBenchmark::onPreDraw(c);
120
121 fPipeline.reset(
122 new SkLinearBitmapPipeline{fInvert, fXTile, fYTile, fInfo, fBitmap.g et(), });
123 }
124
125 void onDraw(int loops, SkCanvas*) override {
126 int width = fSrcSize.fWidth;
127 int height = fSrcSize.fHeight;
128
129 SkPM4f FPbuffer[width * height];
130
131 int count = 100;
132
133 for (int n = 0; n < 1000*loops; n++) {
134 fPipeline->shadeSpan4f(3, 6, FPbuffer, count);
135 }
136
137 }
138
139 std::unique_ptr<SkLinearBitmapPipeline> fPipeline;
140 };
141
142 struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark {
143 using CommonBitmapFPBenchmark::CommonBitmapFPBenchmark;
144 SkString BaseName() override {
145 SkString name{"Orig"};
146 return name;
147 }
148
149 void onPreDraw(SkCanvas* c) override {
150 CommonBitmapFPBenchmark::onPreDraw(c);
151
152 SkImage* image = SkImage::NewRasterCopy(
153 fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth);
154 fImage.reset(image);
155 SkShader* shader = fImage->newShader(fXTile, fYTile);
156 if (fUseBilerp) {
157 fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality);
158 } else {
159 fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality);
160 }
161 fPaint.setShader(shader)->unref();
162 SkASSERT(fPaint.getShader()->contextSize() <= sizeof(fStorage));
163 fCtx = fPaint.getShader()->createContext(
164 {fPaint, fM, nullptr},
165 fStorage);
166 }
167
168 void onPostDraw(SkCanvas*) override {
169 fCtx->~Context();
170 }
171
172 void onDraw(int loops, SkCanvas*) override {
173 int width = fSrcSize.fWidth;
174 int height = fSrcSize.fHeight;
175 SkPMColor buffer4b[width * height];
176
177
178 int count = 100;
179
180 for (int n = 0; n < 1000*loops; n++) {
181 fCtx->shadeSpan(3, 6, buffer4b, count);
182 }
183 }
184 SkPaint fPaint;
185 uint32_t fStorage[200];
186 SkShader::Context* fCtx;
187 SkAutoTUnref<SkImage> fImage;
188 };
189
190 static SkISize srcSize = SkISize::Make(120, 100);
191 static SkMatrix mI = SkMatrix::I();
192 DEF_BENCH(return new SkBitmapFPGeneral(
193 srcSize, kSRGB_SkColorProfileType, mI, false,
194 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
195
196 DEF_BENCH(return new SkBitmapFPGeneral(
197 srcSize, kLinear_SkColorProfileType, mI, false,
198 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
199
200 DEF_BENCH(return new SkBitmapFPOrigShader(
201 srcSize, kLinear_SkColorProfileType, mI, false,
202 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
203
204 DEF_BENCH(return new SkBitmapFPGeneral(
205 srcSize, kSRGB_SkColorProfileType, mI, true,
206 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
207
208 DEF_BENCH(return new SkBitmapFPGeneral(
209 srcSize, kLinear_SkColorProfileType, mI, true,
210 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
211
212 DEF_BENCH(return new SkBitmapFPOrigShader(
213 srcSize, kLinear_SkColorProfileType, mI, true,
214 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
215
216 static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f);
217 DEF_BENCH(return new SkBitmapFPGeneral(
218 srcSize, kSRGB_SkColorProfileType, mS, false,
219 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
220
221 DEF_BENCH(return new SkBitmapFPGeneral(
222 srcSize, kLinear_SkColorProfileType, mS, false,
223 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
224
225 DEF_BENCH(return new SkBitmapFPOrigShader(
226 srcSize, kLinear_SkColorProfileType, mS, false,
227 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
228
229 DEF_BENCH(return new SkBitmapFPGeneral(
230 srcSize, kSRGB_SkColorProfileType, mS, true,
231 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
232
233 DEF_BENCH(return new SkBitmapFPGeneral(
234 srcSize, kLinear_SkColorProfileType, mS, true,
235 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
236
237 DEF_BENCH(return new SkBitmapFPOrigShader(
238 srcSize, kLinear_SkColorProfileType, mS, true,
239 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
240
241 static SkMatrix rotate(SkScalar r) {
242 SkMatrix m;
243 m.setRotate(30);
244 return m;
245 }
246
247 static SkMatrix mR = rotate(30);
248 DEF_BENCH(return new SkBitmapFPGeneral(
249 srcSize, kSRGB_SkColorProfileType, mR, false,
250 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
251
252 DEF_BENCH(return new SkBitmapFPGeneral(
253 srcSize, kLinear_SkColorProfileType, mR, false,
254 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
255
256 DEF_BENCH(return new SkBitmapFPOrigShader(
257 srcSize, kLinear_SkColorProfileType, mR, false,
258 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
259
260 DEF_BENCH(return new SkBitmapFPGeneral(
261 srcSize, kSRGB_SkColorProfileType, mR, true,
262 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
263
264 DEF_BENCH(return new SkBitmapFPGeneral(
265 srcSize, kLinear_SkColorProfileType, mR, true,
266 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
267
268 DEF_BENCH(return new SkBitmapFPOrigShader(
269 srcSize, kLinear_SkColorProfileType, mR, true,
270 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);)
271
OLDNEW
« no previous file with comments | « no previous file | gm/SkLinearBitmapPipelineGM.cpp » ('j') | src/core/SkLinearBitmapPipeline.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698