blob: 1c99ab433e1e9e219aa0b63632402ea2a2b23f8f [file] [log] [blame]
reed@google.com3fb51872011-06-01 15:11:22 +00001#include "SkBenchmark.h"
2#include "SkMatrix.h"
3#include "SkString.h"
4
5class MatrixBench : public SkBenchmark {
6 SkString fName;
7 enum { N = 100000 };
8public:
9 MatrixBench(void* param, const char name[]) : INHERITED(param) {
10 fName.printf("matrix_%s", name);
11 }
12
13 virtual void performTest() = 0;
14
15protected:
16 virtual const char* onGetName() {
17 return fName.c_str();
18 }
19
20 virtual void onDraw(SkCanvas* canvas) {
21 for (int i = 0; i < N; i++) {
22 this->performTest();
23 }
24 }
25
26private:
27 typedef SkBenchmark INHERITED;
28};
29
30// we want to stop the compiler from eliminating code that it thinks is a no-op
31// so we have a non-static global we increment, hoping that will convince the
32// compiler to execute everything
33int gMatrixBench_NonStaticGlobal;
34
35#define always_do(pred) \
36 do { \
37 if (pred) { \
38 ++gMatrixBench_NonStaticGlobal; \
39 } \
40 } while (0)
41
42class EqualsMatrixBench : public MatrixBench {
43public:
44 EqualsMatrixBench(void* param) : INHERITED(param, "equals") {}
45protected:
46 virtual void performTest() {
47 SkMatrix m0, m1, m2;
48
49 m0.reset();
50 m1.reset();
51 m2.reset();
52 always_do(m0 == m1);
53 always_do(m1 == m2);
54 always_do(m2 == m0);
55 always_do(m0.getType());
56 always_do(m1.getType());
57 always_do(m2.getType());
58 }
59private:
60 typedef MatrixBench INHERITED;
61};
62
63class ScaleMatrixBench : public MatrixBench {
64public:
65 ScaleMatrixBench(void* param) : INHERITED(param, "scale") {
66
67 fM0.reset();
68 fM1.setScale(fSX, fSY);
69 fM2.setTranslate(fSX, fSY);
70 fSX = fSY = SkFloatToScalar(1.5f);
71 }
72protected:
73 virtual void performTest() {
74 SkMatrix m;
75 m = fM0; m.preScale(fSX, fSY);
76 m = fM1; m.preScale(fSX, fSY);
77 m = fM2; m.preScale(fSX, fSY);
78 }
79private:
80 SkMatrix fM0, fM1, fM2;
81 SkScalar fSX, fSY;
82 typedef MatrixBench INHERITED;
83};
84
85static SkBenchmark* M0(void* p) { return new EqualsMatrixBench(p); }
86static SkBenchmark* M1(void* p) { return new ScaleMatrixBench(p); }
87
88static BenchRegistry gReg0(M0);
89static BenchRegistry gReg1(M1);
90