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.
5 #ifndef CC_TILES_TILING_SET_RASTER_QUEUE_ALL_H_
6 #define CC_TILES_TILING_SET_RASTER_QUEUE_ALL_H_
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"
21 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION
22 // and LOW_RESOLUTION tilings.
23 class CC_EXPORT TilingSetRasterQueueAll {
25 TilingSetRasterQueueAll(PictureLayerTilingSet* tiling_set,
26 bool prioritize_low_res,
27 bool is_drawing_layer);
28 TilingSetRasterQueueAll(const TilingSetRasterQueueAll&) = delete;
29 ~TilingSetRasterQueueAll();
31 TilingSetRasterQueueAll& operator=(const TilingSetRasterQueueAll&) = delete;
33 const PrioritizedTile& Top() const;
36 bool is_drawing_layer() const { return is_drawing_layer_; }
39 // Helper base class for individual region iterators.
40 class OnePriorityRectIterator {
42 OnePriorityRectIterator();
43 OnePriorityRectIterator(
44 PictureLayerTiling* tiling,
45 TilingData* tiling_data,
46 PictureLayerTiling::PriorityRectType priority_rect_type);
48 bool done() const { return !current_tile_.tile(); }
49 const PrioritizedTile& operator*() const { return current_tile_; }
52 ~OnePriorityRectIterator() = default;
54 template <typename TilingIteratorType>
55 void AdvanceToNextTile(TilingIteratorType* iterator);
56 template <typename TilingIteratorType>
57 bool GetFirstTileAndCheckIfValid(TilingIteratorType* iterator);
59 enum IsTileValidResult {
62 kTileNeedsCheckerImageReraster
64 IsTileValidResult IsTileValid(const Tile* tile) const;
66 PrioritizedTile current_tile_;
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_;
74 PictureLayerTiling::PriorityRectType priority_rect_type_;
75 gfx::Rect pending_visible_rect_;
78 // Iterates over visible rect only, left to right top to bottom order.
79 class VisibleTilingIterator : public OnePriorityRectIterator {
81 VisibleTilingIterator() = default;
82 VisibleTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data);
84 VisibleTilingIterator& operator++();
87 TilingData::Iterator iterator_;
90 class PendingVisibleTilingIterator : public OnePriorityRectIterator {
92 PendingVisibleTilingIterator() = default;
93 PendingVisibleTilingIterator(PictureLayerTiling* tiling,
94 TilingData* tiling_data);
96 PendingVisibleTilingIterator& operator++();
99 TilingData::DifferenceIterator iterator_;
102 // Iterates over skewport only, spiral around the visible rect.
103 class SkewportTilingIterator : public OnePriorityRectIterator {
105 SkewportTilingIterator() = default;
106 SkewportTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data);
108 SkewportTilingIterator& operator++();
111 TilingData::SpiralDifferenceIterator iterator_;
114 // Iterates over soon border only, spiral around the visible rect.
115 class SoonBorderTilingIterator : public OnePriorityRectIterator {
117 SoonBorderTilingIterator() = default;
118 SoonBorderTilingIterator(PictureLayerTiling* tiling,
119 TilingData* tiling_data);
121 SoonBorderTilingIterator& operator++();
124 TilingData::SpiralDifferenceIterator iterator_;
127 // Iterates over eventually rect only, spiral around the soon rect.
128 class EventuallyTilingIterator : public OnePriorityRectIterator {
130 EventuallyTilingIterator() = default;
131 EventuallyTilingIterator(PictureLayerTiling* tiling,
132 TilingData* tiling_data);
134 EventuallyTilingIterator& operator++();
137 TilingData::SpiralDifferenceIterator iterator_;
140 // Iterates over all of the above phases in the following order: visible,
141 // skewport, soon border, eventually.
142 class TilingIterator {
145 explicit TilingIterator(PictureLayerTiling* tiling,
146 TilingData* tiling_data);
149 bool done() const { return !current_tile_.tile(); }
150 const PrioritizedTile& operator*() const { return current_tile_; }
151 TilePriority::PriorityBin type() const {
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;
163 return TilePriority::EVENTUALLY;
166 TilingIterator& operator++();
169 using Phase = PictureLayerTiling::PriorityRectType;
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_;
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_;
192 ACTIVE_NON_IDEAL_PENDING_HIGH_RES,
196 void MakeTilingIterator(IteratorType type, PictureLayerTiling* tiling);
197 void AdvanceToNextStage();
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_;
203 struct IterationStage {
204 IterationStage(IteratorType type, TilePriority::PriorityBin bin);
205 IteratorType iterator_type;
206 TilePriority::PriorityBin tile_type;
209 size_t current_stage_;
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;
220 #endif // CC_TILES_TILING_SET_RASTER_QUEUE_ALL_H_