[M108 Migration][VD] Avoid pending frame counter becoming negative
[platform/framework/web/chromium-efl.git] / cc / tiles / tiling_set_raster_queue_all.h
1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CC_TILES_TILING_SET_RASTER_QUEUE_ALL_H_
6 #define CC_TILES_TILING_SET_RASTER_QUEUE_ALL_H_
7
8 #include <stddef.h>
9
10 #include "base/containers/stack_container.h"
11 #include "base/memory/raw_ptr_exclusion.h"
12 #include "base/notreached.h"
13 #include "cc/cc_export.h"
14 #include "cc/tiles/picture_layer_tiling_set.h"
15 #include "cc/tiles/prioritized_tile.h"
16 #include "cc/tiles/tile.h"
17 #include "cc/tiles/tile_priority.h"
18
19 namespace cc {
20
21 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION
22 // and LOW_RESOLUTION tilings.
23 class CC_EXPORT TilingSetRasterQueueAll {
24  public:
25   TilingSetRasterQueueAll(PictureLayerTilingSet* tiling_set,
26                           bool prioritize_low_res,
27                           bool is_drawing_layer);
28   TilingSetRasterQueueAll(const TilingSetRasterQueueAll&) = delete;
29   ~TilingSetRasterQueueAll();
30
31   TilingSetRasterQueueAll& operator=(const TilingSetRasterQueueAll&) = delete;
32
33   const PrioritizedTile& Top() const;
34   void Pop();
35   bool IsEmpty() const;
36   bool is_drawing_layer() const { return is_drawing_layer_; }
37
38  private:
39   // Helper base class for individual region iterators.
40   class OnePriorityRectIterator {
41    public:
42     OnePriorityRectIterator();
43     OnePriorityRectIterator(
44         PictureLayerTiling* tiling,
45         TilingData* tiling_data,
46         PictureLayerTiling::PriorityRectType priority_rect_type);
47
48     bool done() const { return !current_tile_.tile(); }
49     const PrioritizedTile& operator*() const { return current_tile_; }
50
51    protected:
52     ~OnePriorityRectIterator() = default;
53
54     template <typename TilingIteratorType>
55     void AdvanceToNextTile(TilingIteratorType* iterator);
56     template <typename TilingIteratorType>
57     bool GetFirstTileAndCheckIfValid(TilingIteratorType* iterator);
58
59     enum IsTileValidResult {
60       kTileNotValid,
61       kTileNeedsRaster,
62       kTileNeedsCheckerImageReraster
63     };
64     IsTileValidResult IsTileValid(const Tile* tile) const;
65
66     PrioritizedTile current_tile_;
67
68     // `tiling_` and `tiling_data_` are not a raw_ptr<...> for performance
69     // reasons (based on analysis of sampling profiler data and
70     // tab_search:top100:2020).
71     RAW_PTR_EXCLUSION PictureLayerTiling* tiling_;
72     RAW_PTR_EXCLUSION TilingData* tiling_data_;
73
74     PictureLayerTiling::PriorityRectType priority_rect_type_;
75     gfx::Rect pending_visible_rect_;
76   };
77
78   // Iterates over visible rect only, left to right top to bottom order.
79   class VisibleTilingIterator : public OnePriorityRectIterator {
80    public:
81     VisibleTilingIterator() = default;
82     VisibleTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data);
83
84     VisibleTilingIterator& operator++();
85
86    private:
87     TilingData::Iterator iterator_;
88   };
89
90   class PendingVisibleTilingIterator : public OnePriorityRectIterator {
91    public:
92     PendingVisibleTilingIterator() = default;
93     PendingVisibleTilingIterator(PictureLayerTiling* tiling,
94                                  TilingData* tiling_data);
95
96     PendingVisibleTilingIterator& operator++();
97
98    private:
99     TilingData::DifferenceIterator iterator_;
100   };
101
102   // Iterates over skewport only, spiral around the visible rect.
103   class SkewportTilingIterator : public OnePriorityRectIterator {
104    public:
105     SkewportTilingIterator() = default;
106     SkewportTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data);
107
108     SkewportTilingIterator& operator++();
109
110    private:
111     TilingData::SpiralDifferenceIterator iterator_;
112   };
113
114   // Iterates over soon border only, spiral around the visible rect.
115   class SoonBorderTilingIterator : public OnePriorityRectIterator {
116    public:
117     SoonBorderTilingIterator() = default;
118     SoonBorderTilingIterator(PictureLayerTiling* tiling,
119                              TilingData* tiling_data);
120
121     SoonBorderTilingIterator& operator++();
122
123    private:
124     TilingData::SpiralDifferenceIterator iterator_;
125   };
126
127   // Iterates over eventually rect only, spiral around the soon rect.
128   class EventuallyTilingIterator : public OnePriorityRectIterator {
129    public:
130     EventuallyTilingIterator() = default;
131     EventuallyTilingIterator(PictureLayerTiling* tiling,
132                              TilingData* tiling_data);
133
134     EventuallyTilingIterator& operator++();
135
136    private:
137     TilingData::SpiralDifferenceIterator iterator_;
138   };
139
140   // Iterates over all of the above phases in the following order: visible,
141   // skewport, soon border, eventually.
142   class TilingIterator {
143    public:
144     TilingIterator();
145     explicit TilingIterator(PictureLayerTiling* tiling,
146                             TilingData* tiling_data);
147     ~TilingIterator();
148
149     bool done() const { return !current_tile_.tile(); }
150     const PrioritizedTile& operator*() const { return current_tile_; }
151     TilePriority::PriorityBin type() const {
152       switch (phase_) {
153         case Phase::VISIBLE_RECT:
154           return TilePriority::NOW;
155         case Phase::PENDING_VISIBLE_RECT:
156         case Phase::SKEWPORT_RECT:
157         case Phase::SOON_BORDER_RECT:
158           return TilePriority::SOON;
159         case Phase::EVENTUALLY_RECT:
160           return TilePriority::EVENTUALLY;
161       }
162       NOTREACHED();
163       return TilePriority::EVENTUALLY;
164     }
165
166     TilingIterator& operator++();
167
168    private:
169     using Phase = PictureLayerTiling::PriorityRectType;
170
171     void AdvancePhase();
172
173     // `tiling_` and `tiling_data_` are not a raw_ptr<...> for performance
174     // reasons (based on analysis of sampling profiler data and
175     // tab_search:top100:2020).
176     PictureLayerTiling* tiling_;
177     TilingData* tiling_data_;
178
179     Phase phase_;
180
181     PrioritizedTile current_tile_;
182     VisibleTilingIterator visible_iterator_;
183     PendingVisibleTilingIterator pending_visible_iterator_;
184     SkewportTilingIterator skewport_iterator_;
185     SoonBorderTilingIterator soon_border_iterator_;
186     EventuallyTilingIterator eventually_iterator_;
187   };
188
189   enum IteratorType {
190     LOW_RES,
191     HIGH_RES,
192     ACTIVE_NON_IDEAL_PENDING_HIGH_RES,
193     NUM_ITERATORS
194   };
195
196   void MakeTilingIterator(IteratorType type, PictureLayerTiling* tiling);
197   void AdvanceToNextStage();
198
199   // `tiling_set_` is not a raw_ptr<...> for performance reasons (based on
200   // analysis of sampling profiler data).
201   RAW_PTR_EXCLUSION PictureLayerTilingSet* tiling_set_;
202
203   struct IterationStage {
204     IterationStage(IteratorType type, TilePriority::PriorityBin bin);
205     IteratorType iterator_type;
206     TilePriority::PriorityBin tile_type;
207   };
208
209   size_t current_stage_;
210
211   // The max number of stages is 6: 1 low res, 3 high res, and 2 active non
212   // ideal pending high res.
213   base::StackVector<IterationStage, 6> stages_;
214   TilingIterator iterators_[NUM_ITERATORS];
215   bool is_drawing_layer_ = false;
216 };
217
218 }  // namespace cc
219
220 #endif  // CC_TILES_TILING_SET_RASTER_QUEUE_ALL_H_