xref: /aosp_15_r20/external/skia/bench/RectanizerBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RectanizerPow2.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RectanizerSkyline.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker using namespace skgpu;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker /**
21*c8dee2aaSAndroid Build Coastguard Worker  * This bench exercises the GPU backend's Rectanizer classes. It exercises the following
22*c8dee2aaSAndroid Build Coastguard Worker  * rectanizers:
23*c8dee2aaSAndroid Build Coastguard Worker  *      Pow2 Rectanizer
24*c8dee2aaSAndroid Build Coastguard Worker  *      Skyline Rectanizer
25*c8dee2aaSAndroid Build Coastguard Worker  * in the following cases:
26*c8dee2aaSAndroid Build Coastguard Worker  *      random rects (e.g., pull-save-layers forward use case)
27*c8dee2aaSAndroid Build Coastguard Worker  *      random power of two rects
28*c8dee2aaSAndroid Build Coastguard Worker  *      small constant sized power of 2 rects (e.g., glyph cache use case)
29*c8dee2aaSAndroid Build Coastguard Worker  */
30*c8dee2aaSAndroid Build Coastguard Worker class RectanizerBench : public Benchmark {
31*c8dee2aaSAndroid Build Coastguard Worker public:
32*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr int kWidth = 1024;
33*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr int kHeight = 1024;
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker     enum RectanizerType {
36*c8dee2aaSAndroid Build Coastguard Worker         kPow2_RectanizerType,
37*c8dee2aaSAndroid Build Coastguard Worker         kSkyline_RectanizerType,
38*c8dee2aaSAndroid Build Coastguard Worker     };
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     enum RectType {
41*c8dee2aaSAndroid Build Coastguard Worker         kRand_RectType,
42*c8dee2aaSAndroid Build Coastguard Worker         kRandPow2_RectType,
43*c8dee2aaSAndroid Build Coastguard Worker         kSmallPow2_RectType
44*c8dee2aaSAndroid Build Coastguard Worker     };
45*c8dee2aaSAndroid Build Coastguard Worker 
RectanizerBench(RectanizerType rectanizerType,RectType rectType)46*c8dee2aaSAndroid Build Coastguard Worker     RectanizerBench(RectanizerType rectanizerType, RectType rectType)
47*c8dee2aaSAndroid Build Coastguard Worker         : fName("rectanizer_")
48*c8dee2aaSAndroid Build Coastguard Worker         , fRectanizerType(rectanizerType)
49*c8dee2aaSAndroid Build Coastguard Worker         , fRectType(rectType) {
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker         if (kPow2_RectanizerType == fRectanizerType) {
52*c8dee2aaSAndroid Build Coastguard Worker             fName.append("pow2_");
53*c8dee2aaSAndroid Build Coastguard Worker         } else {
54*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(kSkyline_RectanizerType == fRectanizerType);
55*c8dee2aaSAndroid Build Coastguard Worker             fName.append("skyline_");
56*c8dee2aaSAndroid Build Coastguard Worker         }
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker         if (kRand_RectType == fRectType) {
59*c8dee2aaSAndroid Build Coastguard Worker             fName.append("rand");
60*c8dee2aaSAndroid Build Coastguard Worker         } else if (kRandPow2_RectType == fRectType) {
61*c8dee2aaSAndroid Build Coastguard Worker             fName.append("rand2");
62*c8dee2aaSAndroid Build Coastguard Worker         } else {
63*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(kSmallPow2_RectType == fRectType);
64*c8dee2aaSAndroid Build Coastguard Worker             fName.append("sm2");
65*c8dee2aaSAndroid Build Coastguard Worker         }
66*c8dee2aaSAndroid Build Coastguard Worker     }
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker protected:
isSuitableFor(Backend backend)69*c8dee2aaSAndroid Build Coastguard Worker     bool isSuitableFor(Backend backend) override {
70*c8dee2aaSAndroid Build Coastguard Worker         return Backend::kNonRendering == backend;
71*c8dee2aaSAndroid Build Coastguard Worker     }
72*c8dee2aaSAndroid Build Coastguard Worker 
onGetName()73*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override {
74*c8dee2aaSAndroid Build Coastguard Worker         return fName.c_str();
75*c8dee2aaSAndroid Build Coastguard Worker     }
76*c8dee2aaSAndroid Build Coastguard Worker 
onDelayedSetup()77*c8dee2aaSAndroid Build Coastguard Worker     void onDelayedSetup() override {
78*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(nullptr == fRectanizer.get());
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker         if (kPow2_RectanizerType == fRectanizerType) {
81*c8dee2aaSAndroid Build Coastguard Worker             fRectanizer = std::make_unique<RectanizerPow2>(kWidth, kHeight);
82*c8dee2aaSAndroid Build Coastguard Worker         } else {
83*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(kSkyline_RectanizerType == fRectanizerType);
84*c8dee2aaSAndroid Build Coastguard Worker             fRectanizer = std::make_unique<RectanizerSkyline>(kWidth, kHeight);
85*c8dee2aaSAndroid Build Coastguard Worker         }
86*c8dee2aaSAndroid Build Coastguard Worker     }
87*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(int loops,SkCanvas * canvas)88*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(int loops, SkCanvas* canvas) override {
89*c8dee2aaSAndroid Build Coastguard Worker         SkRandom rand;
90*c8dee2aaSAndroid Build Coastguard Worker         SkIPoint16 loc;
91*c8dee2aaSAndroid Build Coastguard Worker         SkISize size;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < loops; ++i) {
94*c8dee2aaSAndroid Build Coastguard Worker             if (kRand_RectType == fRectType) {
95*c8dee2aaSAndroid Build Coastguard Worker                 size = SkISize::Make(rand.nextRangeU(1, kWidth / 2),
96*c8dee2aaSAndroid Build Coastguard Worker                                      rand.nextRangeU(1, kHeight / 2));
97*c8dee2aaSAndroid Build Coastguard Worker             } else if (kRandPow2_RectType == fRectType) {
98*c8dee2aaSAndroid Build Coastguard Worker                 size = SkISize::Make(SkNextPow2(rand.nextRangeU(1, kWidth / 2)),
99*c8dee2aaSAndroid Build Coastguard Worker                                      SkNextPow2(rand.nextRangeU(1, kHeight / 2)));
100*c8dee2aaSAndroid Build Coastguard Worker             } else {
101*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(kSmallPow2_RectType == fRectType);
102*c8dee2aaSAndroid Build Coastguard Worker                 size = SkISize::Make(128, 128);
103*c8dee2aaSAndroid Build Coastguard Worker             }
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker             if (!fRectanizer->addRect(size.fWidth, size.fHeight, &loc)) {
106*c8dee2aaSAndroid Build Coastguard Worker                 // insert failed so clear out the rectanizer and give the
107*c8dee2aaSAndroid Build Coastguard Worker                 // current rect another try
108*c8dee2aaSAndroid Build Coastguard Worker                 fRectanizer->reset();
109*c8dee2aaSAndroid Build Coastguard Worker                 i--;
110*c8dee2aaSAndroid Build Coastguard Worker             }
111*c8dee2aaSAndroid Build Coastguard Worker         }
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker         fRectanizer->reset();
114*c8dee2aaSAndroid Build Coastguard Worker     }
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker private:
117*c8dee2aaSAndroid Build Coastguard Worker     SkString                    fName;
118*c8dee2aaSAndroid Build Coastguard Worker     RectanizerType              fRectanizerType;
119*c8dee2aaSAndroid Build Coastguard Worker     RectType                    fRectType;
120*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<Rectanizer> fRectanizer;
121*c8dee2aaSAndroid Build Coastguard Worker 
122*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = Benchmark;
123*c8dee2aaSAndroid Build Coastguard Worker };
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectanizerBench(RectanizerBench::kPow2_RectanizerType,
128*c8dee2aaSAndroid Build Coastguard Worker                                      RectanizerBench::kRand_RectType);)
129*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectanizerBench(RectanizerBench::kPow2_RectanizerType,
130*c8dee2aaSAndroid Build Coastguard Worker                                      RectanizerBench::kRandPow2_RectType);)
131*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectanizerBench(RectanizerBench::kPow2_RectanizerType,
132*c8dee2aaSAndroid Build Coastguard Worker                                      RectanizerBench::kSmallPow2_RectType);)
133*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectanizerBench(RectanizerBench::kSkyline_RectanizerType,
134*c8dee2aaSAndroid Build Coastguard Worker                                      RectanizerBench::kRand_RectType);)
135*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectanizerBench(RectanizerBench::kSkyline_RectanizerType,
136*c8dee2aaSAndroid Build Coastguard Worker                                      RectanizerBench::kRandPow2_RectType);)
137*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectanizerBench(RectanizerBench::kSkyline_RectanizerType,
138*c8dee2aaSAndroid Build Coastguard Worker                                      RectanizerBench::kSmallPow2_RectType);)
139