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

Side by Side Diff: bench/GameBench.cpp

Issue 14772019: Added game-like bench marks (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 7 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 | « no previous file | gyp/bench.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 /*
2 * Copyright 2012 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 "SkBenchmark.h"
9 #include "SkCanvas.h"
10 #include "SkPaint.h"
11 #include "SkRandom.h"
12 #include "SkString.h"
13
14
15 // This bench simulates the calls Skia sees from various HTML5 canvas
bsalomon 2013/05/09 15:50:46 Maybe say which ones in case we forget?
16 // game bench marks
17 class GameBench : public SkBenchmark {
18 public:
19 static const unsigned int kNumRects = 5000;
bsalomon 2013/05/09 15:50:46 should this be in that macro that sets it to 1 in
robertphillips 2013/05/09 18:49:15 Done.
20 static const unsigned int kCheckerboardWidth = 64;
21 static const unsigned int kCheckerboardHeight = 128;
22 static const unsigned int kNumBeforeClear = 300;
23
24 enum Type {
25 kScale_Type,
26 kTranslate_Type,
27 kRotate_Type
28 };
29
30 GameBench(void* param, Type type, bool partialClear)
31 : INHERITED(param)
32 , fType(type)
33 , fPartialClear(partialClear)
34 , fName("game")
35 , fNumSaved(0) {
36
37 switch (fType) {
38 case kScale_Type:
39 fName.append("_scale");
40 break;
41 case kTranslate_Type:
42 fName.append("_trans");
43 break;
44 case kRotate_Type:
45 fName.append("_rot");
46 break;
47 };
48
49 if (partialClear) {
50 fName.append("_partial");
51 } else {
52 fName.append("_full");
53 }
54
55 // It's HTML 5 canvas, so always AA
56 fName.append("_aa");
57
58 this->makeCheckerboard();
reed1 2013/05/09 16:04:55 can we do this lazily, so the constructor is light
robertphillips 2013/05/09 18:49:15 Done.
59 }
60
61 protected:
62
63 virtual const char* onGetName() SK_OVERRIDE {
64 return fName.c_str();;
65 }
66
67 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
68 static SkMWCRandom scaleRand;
69 static SkMWCRandom transRand;
70 static SkMWCRandom rotRand;
71
72 SkPaint clearPaint;
73 clearPaint.setColor(0xFF000000);
74 clearPaint.setAntiAlias(true);
75
76 SkISize size = canvas->getDeviceSize();
77
78 SkScalar maxTransX, maxTransY;
79
80 if (kScale_Type == fType) {
81 maxTransX = size.fWidth - (1.5f * kCheckerboardWidth);
82 maxTransY = size.fHeight - (1.5f * kCheckerboardHeight);
83 } else if (kTranslate_Type == fType) {
84 maxTransX = SkIntToScalar(size.fWidth - kCheckerboardWidth);
85 maxTransY = SkIntToScalar(size.fHeight - kCheckerboardHeight);
86 } else {
87 SkASSERT(kRotate_Type == fType);
88 // Yes, some rotations will be off the top and left sides
89 maxTransX = size.fWidth - SK_ScalarSqrt2 * kCheckerboardHeight;
90 maxTransY = size.fHeight - SK_ScalarSqrt2 * kCheckerboardHeight;
91 }
92
93 SkMatrix mat;
94 SkIRect src = { 0, 0, kCheckerboardWidth, kCheckerboardHeight };
95 SkRect dst = { 0, 0, kCheckerboardWidth, kCheckerboardHeight };
96 SkRect clearRect = { -1.0f, -1.0f,
97 kCheckerboardWidth+1.0f, kCheckerboardHeight+1.0f } ;
98
99 SkPaint p;
100 p.setColor(0xFF000000);
101 p.setFilterBitmap(true);
102
103 for (int i = 0; i < kNumRects; ++i, ++fNumSaved) {
104
105 if (0 == i % kNumBeforeClear) {
106 if (fPartialClear) {
107 for (int j = 0; j < fNumSaved; ++j) {
108 canvas->setMatrix(SkMatrix::I());
109 mat.setTranslate(fSaved[j][0], fSaved[j][1]);
110
111 if (kScale_Type == fType) {
112 mat.preScale(fSaved[j][2], fSaved[j][2]);
113 } else if (kRotate_Type == fType) {
114 mat.preRotate(fSaved[j][2]);
115 }
116
117 canvas->concat(mat);
118 canvas->drawRect(clearRect, clearPaint);
119 }
120 } else {
121 canvas->clear(0xFF000000);
122 }
123
124 fNumSaved = 0;
125 }
126
127 SkASSERT(fNumSaved < kNumBeforeClear);
128
129 canvas->setMatrix(SkMatrix::I());
130
131 fSaved[fNumSaved][0] = transRand.nextRangeScalar(0.0f, maxTransX);
132 fSaved[fNumSaved][1] = transRand.nextRangeScalar(0.0f, maxTransY);
133
134 mat.setTranslate(fSaved[fNumSaved][0], fSaved[fNumSaved][1]);
135
136 if (kScale_Type == fType) {
137 fSaved[fNumSaved][2] = scaleRand.nextRangeScalar(0.5f, 1.5f);
138 mat.preScale(fSaved[fNumSaved][2], fSaved[fNumSaved][2]);
139 } else if (kRotate_Type == fType) {
140 fSaved[fNumSaved][2] = rotRand.nextRangeScalar(0.0f, 360.0f);
141 mat.preRotate(fSaved[fNumSaved][2]);
142 }
143
144 canvas->concat(mat);
145 canvas->drawBitmapRect(fCheckerboard, &src, dst, &p);
146 }
147 }
148
149 private:
150 Type fType;
151 bool fPartialClear;
152 SkString fName;
153 int fNumSaved; // num draws stored in 'fSaved'
154
155 // 0 & 1 are always x & y translate. 2 is either scale or rotate.
156 SkScalar fSaved[kNumBeforeClear][3];
157 SkBitmap fCheckerboard;
158
159 // Note: the resulting checker board has transparency
160 void makeCheckerboard() {
161 static unsigned int kCheckSize = 16;
162
163 fCheckerboard.setConfig(SkBitmap::kARGB_8888_Config,
164 kCheckerboardWidth, kCheckerboardHeight);
165 fCheckerboard.allocPixels();
166 SkAutoLockPixels lock(fCheckerboard);
167 for (unsigned int y = 0; y < kCheckerboardHeight; ++y) {
168 int even = (y / kCheckSize) % 2;
169
170 SkPMColor* scanline = fCheckerboard.getAddr32(0, y);
171
172 for (unsigned int x = 0; x < kCheckerboardWidth; ++x) {
173 if (even == (x / kCheckSize) % 2) {
174 *scanline++ = 0xFFFF0000;
175 } else {
176 *scanline++ = 0x00000000;
177 }
178 }
179 }
180 }
181
182 typedef SkBenchmark INHERITED;
183 };
184
185 // Partial clear
186 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kScale_Type, false)); )
187 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kTranslate_Type, false)); )
188 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kRotate_Type, false)); )
189
190 // Full clear
191 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kScale_Type, true)); )
192 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kTranslate_Type, true)); )
193 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kRotate_Type, true)); )
194
OLDNEW
« no previous file with comments | « no previous file | gyp/bench.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698