blob: d7d63adfb44ddf7d395de70d5298ae4fad9a499f [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 */
John Stilesfbd050b2020-08-03 13:21:46 -04007#include <memory>
8
Mike Kleinc0bd9f92019-04-23 12:05:21 -05009#include "bench/Benchmark.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
12#include "include/core/SkPaint.h"
13#include "include/core/SkPicture.h"
14#include "include/core/SkPictureRecorder.h"
15#include "include/core/SkPoint.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkString.h"
18#include "include/utils/SkRandom.h"
djsollen@google.com809a2a92012-02-23 20:57:09 +000019
20// This is designed to emulate about 4 screens of textual content
21
djsollen@google.com809a2a92012-02-23 20:57:09 +000022///////////////////////////////////////////////////////////////////////////////
23
mtkleinbf5dd412014-11-11 10:39:27 -080024// Chrome draws into small tiles with impl-side painting.
25// This benchmark measures the relative performance of our bounding-box hierarchies,
26// both when querying tiles perfectly and when not.
mtklein703dd2e2015-01-09 06:41:48 -080027enum BBH { kNone, kRTree };
mtkleinbf5dd412014-11-11 10:39:27 -080028enum Mode { kTiled, kRandom };
29class TiledPlaybackBench : public Benchmark {
30public:
31 TiledPlaybackBench(BBH bbh, Mode mode) : fBBH(bbh), fMode(mode), fName("tiled_playback") {
32 switch (fBBH) {
33 case kNone: fName.append("_none" ); break;
34 case kRTree: fName.append("_rtree" ); break;
mtkleinbf5dd412014-11-11 10:39:27 -080035 }
36 switch (fMode) {
37 case kTiled: fName.append("_tiled" ); break;
38 case kRandom: fName.append("_random"); break;
39 }
40 }
41
mtklein36352bf2015-03-25 18:17:31 -070042 const char* onGetName() override { return fName.c_str(); }
43 SkIPoint onGetSize() override { return SkIPoint::Make(1024,1024); }
mtkleinbf5dd412014-11-11 10:39:27 -080044
joshualitt8a6697a2015-09-30 12:11:07 -070045 void onDelayedSetup() override {
Ben Wagner145dbcd2016-11-03 14:40:50 -040046 std::unique_ptr<SkBBHFactory> factory;
mtkleinbf5dd412014-11-11 10:39:27 -080047 switch (fBBH) {
John Stilesfbd050b2020-08-03 13:21:46 -040048 case kNone: break;
49 case kRTree: factory = std::make_unique<SkRTreeFactory>(); break;
mtkleinbf5dd412014-11-11 10:39:27 -080050 }
51
52 SkPictureRecorder recorder;
Ben Wagner145dbcd2016-11-03 14:40:50 -040053 SkCanvas* canvas = recorder.beginRecording(1024, 1024, factory.get());
mtkleinbf5dd412014-11-11 10:39:27 -080054 SkRandom rand;
55 for (int i = 0; i < 10000; i++) {
56 SkScalar x = rand.nextRangeScalar(0, 1024),
57 y = rand.nextRangeScalar(0, 1024),
58 w = rand.nextRangeScalar(0, 128),
59 h = rand.nextRangeScalar(0, 128);
60 SkPaint paint;
61 paint.setColor(rand.nextU());
62 paint.setAlpha(0xFF);
63 canvas->drawRect(SkRect::MakeXYWH(x,y,w,h), paint);
64 }
reedca2622b2016-03-18 07:25:55 -070065 fPic = recorder.finishRecordingAsPicture();
mtkleinbf5dd412014-11-11 10:39:27 -080066 }
67
mtkleina1ebeb22015-10-01 09:43:39 -070068 void onDraw(int loops, SkCanvas* canvas) override {
mtkleinbf5dd412014-11-11 10:39:27 -080069 for (int i = 0; i < loops; i++) {
70 // This inner loop guarantees we make the same choices for all bench variants.
71 SkRandom rand;
72 for (int j = 0; j < 10; j++) {
73 SkScalar x = 0, y = 0;
74 switch (fMode) {
75 case kTiled: x = SkScalar(256 * rand.nextULessThan(4));
76 y = SkScalar(256 * rand.nextULessThan(4));
77 break;
78 case kRandom: x = rand.nextRangeScalar(0, 768);
79 y = rand.nextRangeScalar(0, 768);
80 break;
81 }
82 SkAutoCanvasRestore ar(canvas, true/*save now*/);
83 canvas->clipRect(SkRect::MakeXYWH(x,y,256,256));
84 fPic->playback(canvas);
85 }
86 }
87 }
88
89private:
reedca2622b2016-03-18 07:25:55 -070090 BBH fBBH;
91 Mode fMode;
92 SkString fName;
93 sk_sp<SkPicture> fPic;
mtkleinbf5dd412014-11-11 10:39:27 -080094};
95
96DEF_BENCH( return new TiledPlaybackBench(kNone, kRandom); )
97DEF_BENCH( return new TiledPlaybackBench(kNone, kTiled ); )
98DEF_BENCH( return new TiledPlaybackBench(kRTree, kRandom); )
99DEF_BENCH( return new TiledPlaybackBench(kRTree, kTiled ); )