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

Side by Side Diff: bench/BitmapBench.cpp

Issue 16069010: extend SkBenchmark to allow a bench to return a durationScale, which allows it to perform fewer act… (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « bench/BenchTimer.cpp ('k') | bench/SkBenchmark.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "SkBenchmark.h" 8 #include "SkBenchmark.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkPaint.h" 10 #include "SkPaint.h"
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 #include "SkColorPriv.h" 12 #include "SkColorPriv.h"
13 #include "SkRandom.h" 13 #include "SkRandom.h"
14 #include "SkString.h" 14 #include "SkString.h"
15 15
16 static const char* gTileName[] = {
17 "clamp", "repeat", "mirror"
18 };
19
20 static const char* gConfigName[] = { 16 static const char* gConfigName[] = {
21 "ERROR", "a1", "a8", "index8", "565", "4444", "8888" 17 "ERROR", "a1", "a8", "index8", "565", "4444", "8888"
22 }; 18 };
23 19
24 static int conv6ToByte(int x) { 20 static int conv6ToByte(int x) {
25 return x * 0xFF / 5; 21 return x * 0xFF / 5;
26 } 22 }
27 23
28 static int convByteTo6(int x) { 24 static int convByteTo6(int x) {
29 return x * 5 / 255; 25 return x * 5 / 255;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 - matrix options: translate, scale, rotate, persp 71 - matrix options: translate, scale, rotate, persp
76 - tiling: none, repeat, mirror, clamp 72 - tiling: none, repeat, mirror, clamp
77 73
78 */ 74 */
79 75
80 class BitmapBench : public SkBenchmark { 76 class BitmapBench : public SkBenchmark {
81 SkBitmap fBitmap; 77 SkBitmap fBitmap;
82 SkPaint fPaint; 78 SkPaint fPaint;
83 bool fIsOpaque; 79 bool fIsOpaque;
84 bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache 80 bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache
85 int fTileX, fTileY; // -1 means don't use shader
86 bool fIsVolatile; 81 bool fIsVolatile;
87 SkBitmap::Config fConfig; 82 SkBitmap::Config fConfig;
88 SkString fName; 83 SkString fName;
89 enum { N = SkBENCHLOOP(300) }; 84 enum { BICUBIC_DUR_SCALE = 20 };
85 enum { N = SkBENCHLOOP(15 * BICUBIC_DUR_SCALE) };
90 enum { W = 128 }; 86 enum { W = 128 };
91 enum { H = 128 }; 87 enum { H = 128 };
92 public: 88 public:
93 BitmapBench(void* param, bool isOpaque, SkBitmap::Config c, 89 BitmapBench(void* param, bool isOpaque, SkBitmap::Config c,
94 bool forceUpdate = false, bool bitmapVolatile = false, 90 bool forceUpdate = false, bool bitmapVolatile = false)
95 int tx = -1, int ty = -1)
96 : INHERITED(param) 91 : INHERITED(param)
97 , fIsOpaque(isOpaque) 92 , fIsOpaque(isOpaque)
98 , fForceUpdate(forceUpdate) 93 , fForceUpdate(forceUpdate)
99 , fTileX(tx)
100 , fTileY(ty)
101 , fIsVolatile(bitmapVolatile) 94 , fIsVolatile(bitmapVolatile)
102 , fConfig(c) { 95 , fConfig(c) {
103 } 96 }
104 97
105 protected: 98 protected:
106 virtual const char* onGetName() { 99 virtual const char* onGetName() {
107 fName.set("bitmap"); 100 fName.set("bitmap");
108 if (fTileX >= 0) {
109 fName.appendf("_%s", gTileName[fTileX]);
110 if (fTileY != fTileX) {
111 fName.appendf("_%s", gTileName[fTileY]);
112 }
113 }
114 fName.appendf("_%s%s", gConfigName[fConfig], 101 fName.appendf("_%s%s", gConfigName[fConfig],
115 fIsOpaque ? "" : "_A"); 102 fIsOpaque ? "" : "_A");
116 if (fForceUpdate) 103 if (fForceUpdate)
117 fName.append("_update"); 104 fName.append("_update");
118 if (fIsVolatile) 105 if (fIsVolatile)
119 fName.append("_volatile"); 106 fName.append("_volatile");
120 107
121 return fName.c_str(); 108 return fName.c_str();
122 } 109 }
123 110
(...skipping 28 matching lines...) Expand all
152 SkIPoint dim = this->getSize(); 139 SkIPoint dim = this->getSize();
153 SkRandom rand; 140 SkRandom rand;
154 141
155 SkPaint paint(fPaint); 142 SkPaint paint(fPaint);
156 this->setupPaint(&paint); 143 this->setupPaint(&paint);
157 144
158 const SkBitmap& bitmap = fBitmap; 145 const SkBitmap& bitmap = fBitmap;
159 const SkScalar x0 = SkIntToScalar(-bitmap.width() / 2); 146 const SkScalar x0 = SkIntToScalar(-bitmap.width() / 2);
160 const SkScalar y0 = SkIntToScalar(-bitmap.height() / 2); 147 const SkScalar y0 = SkIntToScalar(-bitmap.height() / 2);
161 148
162 for (int i = 0; i < N; i++) { 149 int count = N;
150 #ifdef SK_RELEASE
151 // in DEBUG, N is always 1
152 if (paint.getFlags() & SkPaint::kBicubicFilterBitmap_Flag) {
153 count /= BICUBIC_DUR_SCALE;
154 }
155 #endif
156 for (int i = 0; i < count; i++) {
163 SkScalar x = x0 + rand.nextUScalar1() * dim.fX; 157 SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
164 SkScalar y = y0 + rand.nextUScalar1() * dim.fY; 158 SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
165 159
166 if (fForceUpdate) 160 if (fForceUpdate)
167 bitmap.notifyPixelsChanged(); 161 bitmap.notifyPixelsChanged();
168 162
169 canvas->drawBitmap(bitmap, x, y, &paint); 163 canvas->drawBitmap(bitmap, x, y, &paint);
170 } 164 }
171 } 165 }
172 166
167 virtual float onGetDurationScale() SK_OVERRIDE {
168 SkPaint paint;
169 this->setupPaint(&paint);
170 #ifdef SK_DEBUG
171 return 1;
172 #else
173 return (paint.getFlags() & SkPaint::kBicubicFilterBitmap_Flag) ?
174 BICUBIC_DUR_SCALE : 1;
175 #endif
176 }
177
173 virtual void onDrawIntoBitmap(const SkBitmap& bm) { 178 virtual void onDrawIntoBitmap(const SkBitmap& bm) {
174 const int w = bm.width(); 179 const int w = bm.width();
175 const int h = bm.height(); 180 const int h = bm.height();
176 181
177 SkCanvas canvas(bm); 182 SkCanvas canvas(bm);
178 SkPaint p; 183 SkPaint p;
179 p.setAntiAlias(true); 184 p.setAntiAlias(true);
180 p.setColor(SK_ColorRED); 185 p.setColor(SK_ColorRED);
181 canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2, 186 canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
182 SkIntToScalar(SkMin32(w, h))*3/8, p); 187 SkIntToScalar(SkMin32(w, h))*3/8, p);
183 188
184 SkRect r; 189 SkRect r;
185 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); 190 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
186 p.setStyle(SkPaint::kStroke_Style); 191 p.setStyle(SkPaint::kStroke_Style);
187 p.setStrokeWidth(SkIntToScalar(4)); 192 p.setStrokeWidth(SkIntToScalar(4));
188 p.setColor(SK_ColorBLUE); 193 p.setColor(SK_ColorBLUE);
189 canvas.drawRect(r, p); 194 canvas.drawRect(r, p);
190 } 195 }
191 196
192 private: 197 private:
193 typedef SkBenchmark INHERITED; 198 typedef SkBenchmark INHERITED;
194 }; 199 };
195 200
196 /** Explicitly invoke some filter types to improve coverage of acceleration 201 /** Explicitly invoke some filter types to improve coverage of acceleration
197 procs. */ 202 procs. */
198 203
204 enum Flags {
205 kScale_Flag = 1 << 0,
206 kRotate_Flag = 1 << 1,
207 kBilerp_Flag = 1 << 2,
208 kBicubic_Flag = 1 << 3,
209 };
210
211 static bool isBilerp(uint32_t flags) {
212 return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag);
213 }
214
215 static bool isBicubic(uint32_t flags) {
216 return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_ Flag);
217 }
218
199 class FilterBitmapBench : public BitmapBench { 219 class FilterBitmapBench : public BitmapBench {
200 bool fScale; 220 uint32_t fFlags;
201 bool fRotate;
202 bool fFilter;
203 SkString fFullName; 221 SkString fFullName;
204 enum { N = SkBENCHLOOP(300) }; 222 enum { N = SkBENCHLOOP(300) };
205 public: 223 public:
206 FilterBitmapBench(void* param, bool isOpaque, SkBitmap::Config c, 224 FilterBitmapBench(void* param, bool isOpaque, SkBitmap::Config c,
207 bool forceUpdate = false, bool bitmapVolatile = false, 225 bool forceUpdate, bool isVolitile, uint32_t flags)
208 int tx = -1, int ty = -1, bool addScale = false, 226 : INHERITED(param, isOpaque, c, forceUpdate, isVolitile)
209 bool addRotate = false, bool addFilter = false) 227 , fFlags(flags) {
210 : INHERITED(param, isOpaque, c, forceUpdate, bitmapVolatile, tx, ty)
211 , fScale(addScale), fRotate(addRotate), fFilter(addFilter) {
212
213 } 228 }
214 229
215 protected: 230 protected:
216 virtual const char* onGetName() { 231 virtual const char* onGetName() {
217 fFullName.set(INHERITED::onGetName()); 232 fFullName.set(INHERITED::onGetName());
218 if (fScale) 233 if (fFlags & kScale_Flag) {
219 fFullName.append("_scale"); 234 fFullName.append("_scale");
220 if (fRotate) 235 }
236 if (fFlags & kRotate_Flag) {
221 fFullName.append("_rotate"); 237 fFullName.append("_rotate");
222 if (fFilter) 238 }
223 fFullName.append("_filter"); 239 if (isBilerp(fFlags)) {
240 fFullName.append("_bilerp");
241 } else if (isBicubic(fFlags)) {
242 fFullName.append("_bicubic");
243 }
224 244
225 return fFullName.c_str(); 245 return fFullName.c_str();
226 } 246 }
227 247
228 virtual void onDraw(SkCanvas* canvas) { 248 virtual void onDraw(SkCanvas* canvas) {
229 SkISize dim = canvas->getDeviceSize(); 249 SkISize dim = canvas->getDeviceSize();
230 if (fScale) { 250 if (fFlags & kScale_Flag) {
231 const SkScalar x = SkIntToScalar(dim.fWidth) / 2; 251 const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
232 const SkScalar y = SkIntToScalar(dim.fHeight) / 2; 252 const SkScalar y = SkIntToScalar(dim.fHeight) / 2;
233 253
234 canvas->translate(x, y); 254 canvas->translate(x, y);
235 // just enough so we can't take the sprite case 255 // just enough so we can't take the sprite case
236 canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100); 256 canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100);
237 canvas->translate(-x, -y); 257 canvas->translate(-x, -y);
238 } 258 }
239 if (fRotate) { 259 if (fFlags & kRotate_Flag) {
240 const SkScalar x = SkIntToScalar(dim.fWidth) / 2; 260 const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
241 const SkScalar y = SkIntToScalar(dim.fHeight) / 2; 261 const SkScalar y = SkIntToScalar(dim.fHeight) / 2;
242 262
243 canvas->translate(x, y); 263 canvas->translate(x, y);
244 canvas->rotate(SkIntToScalar(35)); 264 canvas->rotate(SkIntToScalar(35));
245 canvas->translate(-x, -y); 265 canvas->translate(-x, -y);
246 } 266 }
247 267
248 this->setForceFilter(fFilter); 268 uint32_t orMask = 0;
269 uint32_t clearMask = SkPaint::kFilterBitmap_Flag | SkPaint::kBicubicFilt erBitmap_Flag;
270 if (fFlags & kBilerp_Flag) {
271 orMask |= SkPaint::kFilterBitmap_Flag;
272 }
273 if (fFlags & kBicubic_Flag) {
274 orMask |= SkPaint::kBicubicFilterBitmap_Flag;
275 }
276 this->setPaintMasks(orMask, clearMask);
277
249 INHERITED::onDraw(canvas); 278 INHERITED::onDraw(canvas);
250 } 279 }
251 280
252 private: 281 private:
253 typedef BitmapBench INHERITED; 282 typedef BitmapBench INHERITED;
254 }; 283 };
255 284
256 /** Verify optimizations that test source alpha values. */ 285 /** Verify optimizations that test source alpha values. */
257 286
258 class SourceAlphaBitmapBench : public BitmapBench { 287 class SourceAlphaBitmapBench : public BitmapBench {
259 public: 288 public:
260 enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha, 289 enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha,
261 kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha}; 290 kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha};
262 private: 291 private:
263 SkString fFullName; 292 SkString fFullName;
264 SourceAlpha fSourceAlpha; 293 SourceAlpha fSourceAlpha;
265 public: 294 public:
266 SourceAlphaBitmapBench(void* param, SourceAlpha alpha, SkBitmap::Config c, 295 SourceAlphaBitmapBench(void* param, SourceAlpha alpha, SkBitmap::Config c,
267 bool forceUpdate = false, bool bitmapVolatile = false, 296 bool forceUpdate = false, bool bitmapVolatile = false)
268 int tx = -1, int ty = -1) 297 : INHERITED(param, false, c, forceUpdate, bitmapVolatile)
269 : INHERITED(param, false, c, forceUpdate, bitmapVolatile, tx, ty)
270 , fSourceAlpha(alpha) { 298 , fSourceAlpha(alpha) {
271 } 299 }
272 300
273 protected: 301 protected:
274 virtual const char* onGetName() { 302 virtual const char* onGetName() {
275 fFullName.set(INHERITED::onGetName()); 303 fFullName.set(INHERITED::onGetName());
276 304
277 if (fSourceAlpha == kOpaque_SourceAlpha) { 305 if (fSourceAlpha == kOpaque_SourceAlpha) {
278 fFullName.append("_source_opaque"); 306 fFullName.append("_source_opaque");
279 } else if (fSourceAlpha == kTransparent_SourceAlpha) { 307 } else if (fSourceAlpha == kTransparent_SourceAlpha) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config); ) 375 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config); )
348 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kRGB_565_Config); ) 376 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kRGB_565_Config); )
349 DEF_BENCH( return new BitmapBench(p, false, SkBitmap::kARGB_4444_Config); ) 377 DEF_BENCH( return new BitmapBench(p, false, SkBitmap::kARGB_4444_Config); )
350 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_4444_Config); ) 378 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_4444_Config); )
351 DEF_BENCH( return new BitmapBench(p, false, SkBitmap::kIndex8_Config); ) 379 DEF_BENCH( return new BitmapBench(p, false, SkBitmap::kIndex8_Config); )
352 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kIndex8_Config); ) 380 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kIndex8_Config); )
353 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, tr ue); ) 381 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, tr ue); )
354 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, fa lse); ) 382 DEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, fa lse); )
355 383
356 // scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S 32_D16_filter_DX_SSE2 384 // scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S 32_D16_filter_DX_SSE2
357 DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, f alse, false, -1, -1, true, false, true); ) 385 DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, f alse, false, kScale_Flag | kBilerp_Flag); )
358 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, fa lse, false, -1, -1, true, false, true); ) 386 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, fa lse, false, kScale_Flag | kBilerp_Flag); )
359 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, true, -1, -1, true, false, true); ) 387 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, true, kScale_Flag | kBilerp_Flag); )
360 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, false, -1, -1, true, false, true); ) 388 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, false, kScale_Flag | kBilerp_Flag); )
361 389
362 // scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3} 390 // scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3}
363 DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, f alse, false, -1, -1, true, true, true); ) 391 DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, f alse, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
364 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, fa lse, false, -1, -1, true, true, true); ) 392 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, fa lse, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
365 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, true, -1, -1, true, true, true); ) 393 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
366 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, false, -1, -1, true, true, true); ) 394 DEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, tr ue, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
395
396 DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, f alse, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); )
397 DEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, f alse, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); )
367 398
368 // source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon} 399 // source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon}
369 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kOpaque_ SourceAlpha, SkBitmap::kARGB_8888_Config); ) 400 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kOpaque_ SourceAlpha, SkBitmap::kARGB_8888_Config); )
370 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTranspa rent_SourceAlpha, SkBitmap::kARGB_8888_Config); ) 401 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTranspa rent_SourceAlpha, SkBitmap::kARGB_8888_Config); )
371 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTwoStri pes_SourceAlpha, SkBitmap::kARGB_8888_Config); ) 402 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTwoStri pes_SourceAlpha, SkBitmap::kARGB_8888_Config); )
372 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kThreeSt ripes_SourceAlpha, SkBitmap::kARGB_8888_Config); ) 403 DEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kThreeSt ripes_SourceAlpha, SkBitmap::kARGB_8888_Config); )
OLDNEW
« no previous file with comments | « bench/BenchTimer.cpp ('k') | bench/SkBenchmark.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698