1/*
2 * Copyright 2011 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#include "Benchmark.h"
8#include "SkCanvas.h"
9#include "SkPaint.h"
10#include "SkString.h"
11
12/**
13   Benchmarks that try to emulate a particular Skia call pattern observed in Chrome.
14*/
15
16/// blitRect() calls emitted by Chrome while scrolling through gmail: count, width, height.
17int gmailScrollingRectSpec [431*3] = {
18      1, 1254, 1160,
19      1, 64, 112,
20      1, 1034, 261,
21      1, 1166, 1,
22      1, 1166, 20,
23      1, 1254, 40,
24      1, 140, 20,
25      1, 22, 30,
26      1, 22, 39,
27      1, 294, 29,
28      1, 336, 25,
29      1, 336, 5,
30      1, 37, 3,
31      1, 37, 4,
32      1, 37, 5,
33      1, 41, 29,
34      1, 57, 15,
35      1, 72, 5,
36      1, 72, 8,
37      1, 76, 29,
38      1, 981, 88,
39      1, 990, 2,
40      1, 990, 6,
41      2, 220, 88,
42      2, 294, 1,
43      2, 37, 6,
44      2, 391, 55,
45      2, 57, 11,
46      2, 57, 14,
47      2, 57, 7,
48      2, 981, 30,
49      2, 990, 15,
50      2, 990, 19,
51      3, 114, 16,
52      3, 1166, 39,
53      3, 1254, 154,
54      3, 12, 12,
55      3, 162, 7,
56      3, 164, 479,
57      3, 167, 449,
58      3, 16, 24,
59      3, 204, 497,
60      3, 205, 434,
61      3, 220, 1127,
62      3, 220, 1132,
63      3, 220, 931,
64      3, 220, 933,
65      3, 220, 934,
66      3, 297, 8,
67      3, 72, 25,
68      3, 87, 30,
69      3, 981, 1,
70      3, 981, 126,
71      3, 990, 27,
72      3, 990, 36,
73      3, 991, 29,
74      4, 1254, 306,
75      4, 1254, 36,
76      4, 1, 1,
77      4, 1, 14,
78      4, 1, 19,
79      4, 1, 7,
80      4, 21, 21,
81      4, 220, 30,
82      4, 46, 949,
83      4, 509, 30,
84      4, 57, 2,
85      4, 57, 6,
86      4, 990, 11,
87      5, 13, 8,
88      5, 198, 24,
89      5, 24, 24,
90      5, 25, 24,
91      5, 2, 24,
92      5, 37, 33,
93      5, 57, 4,
94      5, 599, 24,
95      5, 90, 24,
96      5, 981, 19,
97      5, 990, 23,
98      5, 990, 8,
99      6, 101, 29,
100      6, 117, 29,
101      6, 1254, 88,
102      6, 139, 29,
103      6, 13, 12,
104      6, 15, 15,
105      6, 164, 25,
106      6, 16, 16,
107      6, 198, 7,
108      6, 1, 12,
109      6, 1, 15,
110      6, 1, 27,
111      6, 220, 936,
112      6, 24, 7,
113      6, 25, 7,
114      6, 2, 7,
115      6, 326, 29,
116      6, 336, 29,
117      6, 599, 7,
118      6, 86, 29,
119      6, 90, 7,
120      6, 96, 29,
121      6, 991, 31,
122      7, 198, 12,
123      7, 198, 20,
124      7, 198, 33,
125      7, 198, 35,
126      7, 24, 12,
127      7, 24, 20,
128      7, 24, 33,
129      7, 24, 35,
130      7, 25, 12,
131      7, 25, 20,
132      7, 25, 33,
133      7, 25, 35,
134      7, 2, 12,
135      7, 2, 20,
136      7, 2, 33,
137      7, 2, 35,
138      7, 304, 1,
139      7, 38, 29,
140      7, 51, 29,
141      7, 599, 12,
142      7, 599, 20,
143      7, 599, 33,
144      7, 599, 35,
145      7, 90, 12,
146      7, 90, 20,
147      7, 90, 33,
148      7, 90, 35,
149      8, 13, 5,
150      8, 198, 13,
151      8, 198, 23,
152      8, 220, 1,
153      8, 24, 13,
154      8, 24, 23,
155      8, 25, 13,
156      8, 25, 23,
157      8, 2, 13,
158      8, 2, 23,
159      8, 329, 28,
160      8, 57, 10,
161      8, 599, 13,
162      8, 599, 23,
163      8, 90, 13,
164      8, 90, 23,
165      9, 198, 17,
166      9, 198, 19,
167      9, 198, 37,
168      9, 198, 5,
169      9, 198, 8,
170      9, 24, 17,
171      9, 24, 19,
172      9, 24, 37,
173      9, 24, 5,
174      9, 24, 8,
175      9, 25, 17,
176      9, 25, 19,
177      9, 25, 37,
178      9, 25, 5,
179      9, 25, 8,
180      9, 2, 17,
181      9, 2, 19,
182      9, 2, 37,
183      9, 2, 5,
184      9, 2, 8,
185      9, 599, 17,
186      9, 599, 19,
187      9, 599, 37,
188      9, 599, 5,
189      9, 599, 8,
190      9, 72, 29,
191      9, 90, 17,
192      9, 90, 19,
193      9, 90, 37,
194      9, 90, 5,
195      9, 90, 8,
196     10, 13, 11,
197     10, 13, 9,
198     10, 198, 26,
199     10, 198, 28,
200     10, 1, 23,
201     10, 1, 4,
202     10, 1, 6,
203     10, 24, 26,
204     10, 24, 28,
205     10, 25, 26,
206     10, 25, 28,
207     10, 26, 24,
208     10, 2, 26,
209     10, 2, 28,
210     10, 599, 26,
211     10, 599, 28,
212     10, 90, 26,
213     10, 90, 28,
214     11, 198, 27,
215     11, 24, 27,
216     11, 25, 27,
217     11, 2, 27,
218     11, 599, 27,
219     11, 90, 27,
220     12, 198, 14,
221     12, 198, 21,
222     12, 198, 3,
223     12, 1, 11,
224     12, 1, 2,
225     12, 1, 8,
226     12, 24, 14,
227     12, 24, 21,
228     12, 24, 3,
229     12, 25, 14,
230     12, 25, 21,
231     12, 25, 3,
232     12, 26, 7,
233     12, 2, 14,
234     12, 2, 21,
235     12, 2, 3,
236     12, 329, 14,
237     12, 38, 2,
238     12, 599, 14,
239     12, 599, 21,
240     12, 599, 3,
241     12, 90, 14,
242     12, 90, 21,
243     12, 90, 3,
244     13, 198, 11,
245     13, 198, 15,
246     13, 198, 31,
247     13, 24, 11,
248     13, 24, 15,
249     13, 24, 31,
250     13, 25, 11,
251     13, 25, 15,
252     13, 25, 31,
253     13, 2, 11,
254     13, 2, 15,
255     13, 2, 31,
256     13, 57, 13,
257     13, 599, 11,
258     13, 599, 15,
259     13, 599, 31,
260     13, 71, 29,
261     13, 90, 11,
262     13, 90, 15,
263     13, 90, 31,
264     14, 13, 2,
265     14, 198, 10,
266     14, 24, 10,
267     14, 25, 10,
268     14, 26, 12,
269     14, 26, 20,
270     14, 26, 33,
271     14, 26, 35,
272     14, 2, 10,
273     14, 336, 1,
274     14, 45, 29,
275     14, 599, 10,
276     14, 63, 29,
277     14, 90, 10,
278     15, 13, 3,
279     15, 198, 2,
280     15, 198, 29,
281     15, 198, 34,
282     15, 24, 2,
283     15, 24, 29,
284     15, 24, 34,
285     15, 25, 2,
286     15, 25, 29,
287     15, 25, 34,
288     15, 2, 2,
289     15, 2, 29,
290     15, 2, 34,
291     15, 599, 2,
292     15, 599, 29,
293     15, 599, 34,
294     15, 90, 2,
295     15, 90, 29,
296     15, 90, 34,
297     16, 13, 4,
298     16, 13, 6,
299     16, 198, 16,
300     16, 198, 9,
301     16, 1, 10,
302     16, 24, 16,
303     16, 24, 9,
304     16, 25, 16,
305     16, 25, 9,
306     16, 26, 13,
307     16, 26, 23,
308     16, 2, 16,
309     16, 2, 9,
310     16, 599, 16,
311     16, 599, 9,
312     16, 90, 16,
313     16, 90, 9,
314     17, 13, 7,
315     17, 198, 18,
316     17, 24, 18,
317     17, 25, 18,
318     17, 2, 18,
319     17, 599, 18,
320     17, 90, 18,
321     18, 198, 22,
322     18, 198, 32,
323     18, 198, 36,
324     18, 198, 4,
325     18, 24, 22,
326     18, 24, 32,
327     18, 24, 36,
328     18, 24, 4,
329     18, 25, 22,
330     18, 25, 32,
331     18, 25, 36,
332     18, 25, 4,
333     18, 26, 17,
334     18, 26, 19,
335     18, 26, 37,
336     18, 26, 5,
337     18, 26, 8,
338     18, 2, 22,
339     18, 2, 32,
340     18, 2, 36,
341     18, 2, 4,
342     18, 599, 22,
343     18, 599, 32,
344     18, 599, 36,
345     18, 599, 4,
346     18, 90, 22,
347     18, 90, 32,
348     18, 90, 36,
349     18, 90, 4,
350     19, 13, 10,
351     20, 1254, 30,
352     20, 16, 1007,
353     20, 26, 26,
354     20, 26, 28,
355     21, 198, 6,
356     21, 24, 6,
357     21, 25, 6,
358     21, 2, 6,
359     21, 599, 6,
360     21, 90, 6,
361     22, 198, 38,
362     22, 22, 40,
363     22, 24, 38,
364     22, 25, 38,
365     22, 26, 27,
366     22, 2, 38,
367     22, 599, 38,
368     22, 90, 38,
369     23, 1254, 1160,
370     24, 220, 930,
371     24, 26, 14,
372     24, 26, 21,
373     24, 26, 3,
374     26, 11, 11,
375     26, 1, 13,
376     26, 26, 11,
377     26, 26, 15,
378     26, 26, 31,
379     28, 26, 10,
380     30, 176, 60,
381     30, 26, 2,
382     30, 26, 29,
383     30, 26, 34,
384     32, 26, 16,
385     32, 26, 9,
386     34, 26, 18,
387     36, 26, 22,
388     36, 26, 32,
389     36, 26, 36,
390     36, 26, 4,
391     36, 37, 26,
392     42, 26, 6,
393     43, 115, 29,
394     44, 198, 25,
395     44, 24, 25,
396     44, 25, 25,
397     44, 26, 38,
398     44, 2, 25,
399     44, 599, 25,
400     44, 90, 25,
401     46, 22, 1,
402     47, 198, 30,
403     47, 25, 30,
404     47, 2, 30,
405     47, 599, 30,
406     47, 90, 30,
407     48, 24, 30,
408     52, 176, 30,
409     58, 140, 24,
410     58, 4, 30,
411     63, 990, 29,
412     64, 1254, 1,
413     88, 26, 25,
414     92, 198, 39,
415     92, 25, 39,
416     92, 2, 39,
417     92, 599, 39,
418     92, 90, 39,
419     93, 24, 39,
420     94, 26, 30,
421    108, 1254, 1051,
422    117, 140, 1,
423    119, 160, 1,
424    126, 1, 29,
425    132, 135, 16,
426    147, 72, 16,
427    184, 26, 39,
428    238, 990, 1,
429    376, 11, 1007,
430    380, 11, 487,
431   1389, 1034, 1007,
432   1870, 57, 16,
433   4034, 1, 16,
434   8521, 198, 40,
435   8521, 25, 40,
436   8521, 2, 40,
437   8521, 599, 40,
438   8521, 90, 40,
439   8543, 24, 40,
440   8883, 13, 13,
441  17042, 26, 40,
442  17664, 198, 1,
443  17664, 25, 1,
444  17664, 2, 1,
445  17664, 599, 1,
446  17664, 90, 1,
447  17710, 24, 1,
448  35328, 26, 1,
449};
450
451/// Emulates the mix of rects blitted by gmail during scrolling
452class ScrollGmailBench : public Benchmark {
453    enum {
454        W = 1254,
455        H = 1160,
456        N = 431
457    };
458public:
459    ScrollGmailBench()  { }
460
461protected:
462
463    virtual const char* onGetName() { return "chrome_scrollGmail"; }
464    virtual void onDraw(const int loops, SkCanvas* canvas) {
465        SkDEBUGCODE(this->validateBounds(canvas));
466        SkPaint paint;
467        this->setupPaint(&paint);
468        for (int i = 0; i < N; i++) {
469            SkRect current;
470            setRectangle(current, i);
471            for (int j = 0; j < loops * gmailScrollingRectSpec[i*3]; j++) {
472                canvas->drawRect(current, paint);
473            }
474        }
475    }
476    virtual SkIPoint onGetSize() { return SkIPoint::Make(W, H); }
477
478    void setRectangle(SkRect& current, int i) {
479        current.set(0, 0,
480                    SkIntToScalar(gmailScrollingRectSpec[i*3+1]), SkIntToScalar(gmailScrollingRectSpec[i*3+2]));
481    }
482    void validateBounds(SkCanvas* canvas) {
483        SkIRect bounds;
484        canvas->getClipDeviceBounds(&bounds);
485        SkASSERT(bounds.right()-bounds.left() >= W);
486        SkASSERT(bounds.bottom()-bounds.top() >= H);
487    }
488
489
490private:
491    typedef Benchmark INHERITED;
492};
493
494// Disabled this benchmark: it takes 15x longer than any other benchmark
495// and is probably not giving us important information.
496// DEF_BENCH(return SkNEW(ScrollGmailBench));
497