blob: 461cd8d72df1ae3a835029ba4b35d59b958b98ea [file] [log] [blame]
djsollen@google.com809a2a92012-02-23 20:57:09 +00001/*
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 */
Mike Kleinc0bd9f92019-04-23 12:05:21 -05007#include "bench/Benchmark.h"
8#include "include/core/SkCanvas.h"
9#include "include/core/SkColor.h"
10#include "include/core/SkPaint.h"
11#include "include/core/SkPicture.h"
12#include "include/core/SkPictureRecorder.h"
13#include "include/core/SkPoint.h"
14#include "include/core/SkRect.h"
15#include "include/core/SkString.h"
16#include "include/utils/SkRandom.h"
djsollen@google.com809a2a92012-02-23 20:57:09 +000017
18// This is designed to emulate about 4 screens of textual content
19
djsollen@google.com809a2a92012-02-23 20:57:09 +000020///////////////////////////////////////////////////////////////////////////////
21
mtkleinbf5dd412014-11-11 10:39:27 -080022// Chrome draws into small tiles with impl-side painting.
23// This benchmark measures the relative performance of our bounding-box hierarchies,
24// both when querying tiles perfectly and when not.
mtklein703dd2e2015-01-09 06:41:48 -080025enum BBH { kNone, kRTree };
mtkleinbf5dd412014-11-11 10:39:27 -080026enum Mode { kTiled, kRandom };
27class TiledPlaybackBench : public Benchmark {
28public:
29 TiledPlaybackBench(BBH bbh, Mode mode) : fBBH(bbh), fMode(mode), fName("tiled_playback") {
30 switch (fBBH) {
31 case kNone: fName.append("_none" ); break;
32 case kRTree: fName.append("_rtree" ); break;
mtkleinbf5dd412014-11-11 10:39:27 -080033 }
34 switch (fMode) {
35 case kTiled: fName.append("_tiled" ); break;
36 case kRandom: fName.append("_random"); break;
37 }
38 }
39
mtklein36352bf2015-03-25 18:17:31 -070040 const char* onGetName() override { return fName.c_str(); }
41 SkIPoint onGetSize() override { return SkIPoint::Make(1024,1024); }
mtkleinbf5dd412014-11-11 10:39:27 -080042
joshualitt8a6697a2015-09-30 12:11:07 -070043 void onDelayedSetup() override {
Ben Wagner145dbcd2016-11-03 14:40:50 -040044 std::unique_ptr<SkBBHFactory> factory;
mtkleinbf5dd412014-11-11 10:39:27 -080045 switch (fBBH) {
46 case kNone: break;
47 case kRTree: factory.reset(new SkRTreeFactory); break;
mtkleinbf5dd412014-11-11 10:39:27 -080048 }
49
50 SkPictureRecorder recorder;
Ben Wagner145dbcd2016-11-03 14:40:50 -040051 SkCanvas* canvas = recorder.beginRecording(1024, 1024, factory.get());
mtkleinbf5dd412014-11-11 10:39:27 -080052 SkRandom rand;
53 for (int i = 0; i < 10000; i++) {
54 SkScalar x = rand.nextRangeScalar(0, 1024),
55 y = rand.nextRangeScalar(0, 1024),
56 w = rand.nextRangeScalar(0, 128),
57 h = rand.nextRangeScalar(0, 128);
58 SkPaint paint;
59 paint.setColor(rand.nextU());
60 paint.setAlpha(0xFF);
61 canvas->drawRect(SkRect::MakeXYWH(x,y,w,h), paint);
62 }
reedca2622b2016-03-18 07:25:55 -070063 fPic = recorder.finishRecordingAsPicture();
mtkleinbf5dd412014-11-11 10:39:27 -080064 }
65
mtkleina1ebeb22015-10-01 09:43:39 -070066 void onDraw(int loops, SkCanvas* canvas) override {
mtkleinbf5dd412014-11-11 10:39:27 -080067 for (int i = 0; i < loops; i++) {
68 // This inner loop guarantees we make the same choices for all bench variants.
69 SkRandom rand;
70 for (int j = 0; j < 10; j++) {
71 SkScalar x = 0, y = 0;
72 switch (fMode) {
73 case kTiled: x = SkScalar(256 * rand.nextULessThan(4));
74 y = SkScalar(256 * rand.nextULessThan(4));
75 break;
76 case kRandom: x = rand.nextRangeScalar(0, 768);
77 y = rand.nextRangeScalar(0, 768);
78 break;
79 }
80 SkAutoCanvasRestore ar(canvas, true/*save now*/);
81 canvas->clipRect(SkRect::MakeXYWH(x,y,256,256));
82 fPic->playback(canvas);
83 }
84 }
85 }
86
87private:
reedca2622b2016-03-18 07:25:55 -070088 BBH fBBH;
89 Mode fMode;
90 SkString fName;
91 sk_sp<SkPicture> fPic;
mtkleinbf5dd412014-11-11 10:39:27 -080092};
93
94DEF_BENCH( return new TiledPlaybackBench(kNone, kRandom); )
95DEF_BENCH( return new TiledPlaybackBench(kNone, kTiled ); )
96DEF_BENCH( return new TiledPlaybackBench(kRTree, kRandom); )
97DEF_BENCH( return new TiledPlaybackBench(kRTree, kTiled ); )