OLD | NEW |
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 "SkMatrix.h" | 9 #include "SkMatrix.h" |
10 #include "SkRandom.h" | 10 #include "SkRandom.h" |
11 #include "SkString.h" | 11 #include "SkString.h" |
12 | 12 |
13 class MatrixBench : public SkBenchmark { | 13 class MatrixBench : public SkBenchmark { |
14 SkString fName; | 14 SkString fName; |
15 enum { N = 100000 }; | |
16 public: | 15 public: |
17 MatrixBench(void* param, const char name[]) : INHERITED(param) { | 16 MatrixBench(void* param, const char name[]) : INHERITED(param) { |
18 fName.printf("matrix_%s", name); | 17 fName.printf("matrix_%s", name); |
19 fIsRendering = false; | 18 fIsRendering = false; |
20 } | 19 } |
21 | 20 |
22 virtual void performTest() = 0; | 21 virtual void performTest() = 0; |
23 | 22 |
24 protected: | 23 protected: |
25 virtual int mulLoopCount() const { return 1; } | 24 virtual int mulLoopCount() const { return 1; } |
26 | 25 |
27 virtual const char* onGetName() { | 26 virtual const char* onGetName() { |
28 return fName.c_str(); | 27 return fName.c_str(); |
29 } | 28 } |
30 | 29 |
31 virtual void onDraw(SkCanvas*) { | 30 virtual void onDraw(SkCanvas*) { |
32 int n = SkBENCHLOOP(N * this->mulLoopCount()); | 31 for (int i = 0; i < this->getLoops(); i++) { |
33 for (int i = 0; i < n; i++) { | |
34 this->performTest(); | 32 this->performTest(); |
35 } | 33 } |
36 } | 34 } |
37 | 35 |
38 private: | 36 private: |
39 typedef SkBenchmark INHERITED; | 37 typedef SkBenchmark INHERITED; |
40 }; | 38 }; |
41 | 39 |
42 // we want to stop the compiler from eliminating code that it thinks is a no-op | 40 // we want to stop the compiler from eliminating code that it thinks is a no-op |
43 // so we have a non-static global we increment, hoping that will convince the | 41 // so we have a non-static global we increment, hoping that will convince the |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 float ty = fMatrix[SkMatrix::kMTransY]; | 287 float ty = fMatrix[SkMatrix::kMTransY]; |
290 do { | 288 do { |
291 dst->fY = SkScalarMulAdd(src->fY, my, ty); | 289 dst->fY = SkScalarMulAdd(src->fY, my, ty); |
292 dst->fX = SkScalarMulAdd(src->fX, mx, tx); | 290 dst->fX = SkScalarMulAdd(src->fX, mx, tx); |
293 src += 1; | 291 src += 1; |
294 dst += 1; | 292 dst += 1; |
295 } while (--count); | 293 } while (--count); |
296 } | 294 } |
297 private: | 295 private: |
298 enum { | 296 enum { |
299 kCount = SkBENCHLOOP(16) | 297 kCount = 16 |
300 }; | 298 }; |
301 SkMatrix fMatrix; | 299 SkMatrix fMatrix; |
302 SkPoint fSrc [16]; | 300 SkPoint fSrc [kCount]; |
303 SkPoint fDst [16]; | 301 SkPoint fDst [kCount]; |
304 SkRandom fRandom; | 302 SkRandom fRandom; |
305 typedef MatrixBench INHERITED; | 303 typedef MatrixBench INHERITED; |
306 }; | 304 }; |
307 | 305 |
308 class ScaleTransDoubleMatrixBench : public MatrixBench { | 306 class ScaleTransDoubleMatrixBench : public MatrixBench { |
309 public: | 307 public: |
310 ScaleTransDoubleMatrixBench(void* p) : INHERITED(p, "scaletrans_double") { | 308 ScaleTransDoubleMatrixBench(void* p) : INHERITED(p, "scaletrans_double") { |
311 init9(fMatrix); | 309 init9(fMatrix); |
312 int i; | 310 int i; |
313 for (i = 0; i < kCount; i++) { | 311 for (i = 0; i < kCount; i++) { |
(...skipping 15 matching lines...) Expand all Loading... |
329 float ty = (float) fMatrix[SkMatrix::kMTransY]; | 327 float ty = (float) fMatrix[SkMatrix::kMTransY]; |
330 do { | 328 do { |
331 dst->fY = src->fY * my + ty; | 329 dst->fY = src->fY * my + ty; |
332 dst->fX = src->fX * mx + tx; | 330 dst->fX = src->fX * mx + tx; |
333 src += 1; | 331 src += 1; |
334 dst += 1; | 332 dst += 1; |
335 } while (--count); | 333 } while (--count); |
336 } | 334 } |
337 private: | 335 private: |
338 enum { | 336 enum { |
339 kCount = SkBENCHLOOP(16) | 337 kCount = 16 |
340 }; | 338 }; |
341 double fMatrix [9]; | 339 double fMatrix [9]; |
342 SkPoint fSrc [16]; | 340 SkPoint fSrc [kCount]; |
343 SkPoint fDst [16]; | 341 SkPoint fDst [kCount]; |
344 SkRandom fRandom; | 342 SkRandom fRandom; |
345 typedef MatrixBench INHERITED; | 343 typedef MatrixBench INHERITED; |
346 }; | 344 }; |
347 | 345 |
348 class InvertMapRectMatrixBench : public MatrixBench { | 346 class InvertMapRectMatrixBench : public MatrixBench { |
349 public: | 347 public: |
350 InvertMapRectMatrixBench(void* param, const char* name, int flags) | 348 InvertMapRectMatrixBench(void* param, const char* name, int flags) |
351 : INHERITED(param, name) | 349 : INHERITED(param, name) |
352 , fFlags(flags) { | 350 , fFlags(flags) { |
353 fMatrix.reset(); | 351 fMatrix.reset(); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 | 435 |
438 DEF_BENCH( return new InvertMapRectMatrixBench(p, | 436 DEF_BENCH( return new InvertMapRectMatrixBench(p, |
439 "invert_maprect_typemask_nonpersp", | 437 "invert_maprect_typemask_nonpersp", |
440 InvertMapRectMatrixBench::kUncachedTypeMask_Flag | | 438 InvertMapRectMatrixBench::kUncachedTypeMask_Flag | |
441 InvertMapRectMatrixBench::kScale_Flag | | 439 InvertMapRectMatrixBench::kScale_Flag | |
442 InvertMapRectMatrixBench::kRotate_Flag | | 440 InvertMapRectMatrixBench::kRotate_Flag | |
443 InvertMapRectMatrixBench::kTranslate_Flag); ) | 441 InvertMapRectMatrixBench::kTranslate_Flag); ) |
444 | 442 |
445 DEF_BENCH( return new ScaleTransMixedMatrixBench(p); ) | 443 DEF_BENCH( return new ScaleTransMixedMatrixBench(p); ) |
446 DEF_BENCH( return new ScaleTransDoubleMatrixBench(p); ) | 444 DEF_BENCH( return new ScaleTransDoubleMatrixBench(p); ) |
OLD | NEW |