Supervised user import: Listen for profile creation/deletion
[chromium-blink-merge.git] / cc / resources / tiling_set_raster_queue_all.h
blobe210f2865e1ccff0cb2a9b159e125d4cd2eaa9f7
1 // Copyright 2014 The Chromium Authors. All rights reserved.
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_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_
6 #define CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_
8 #include "base/containers/stack_container.h"
9 #include "cc/base/cc_export.h"
10 #include "cc/resources/picture_layer_tiling_set.h"
11 #include "cc/resources/tile.h"
12 #include "cc/resources/tile_priority.h"
14 namespace cc {
16 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION
17 // and LOW_RESOLUTION tilings.
18 class CC_EXPORT TilingSetRasterQueueAll {
19 public:
20 TilingSetRasterQueueAll(PictureLayerTilingSet* tiling_set,
21 bool prioritize_low_res);
22 ~TilingSetRasterQueueAll();
24 Tile* Top();
25 const Tile* Top() const;
26 void Pop();
27 bool IsEmpty() const;
29 private:
30 // Helper base class for individual region iterators.
31 class OnePriorityRectIterator {
32 public:
33 OnePriorityRectIterator();
34 OnePriorityRectIterator(PictureLayerTiling* tiling,
35 TilingData* tiling_data);
37 bool done() const { return !tile_; }
38 Tile* operator*() const { return tile_; }
40 protected:
41 ~OnePriorityRectIterator() = default;
42 bool TileNeedsRaster(Tile* tile) const {
43 return tile->NeedsRaster() && !tiling_->IsTileOccluded(tile);
46 template <typename TilingIteratorType>
47 void AdvanceToNextTile(TilingIteratorType* iterator);
48 template <typename TilingIteratorType>
49 bool GetFirstTileAndCheckIfValid(TilingIteratorType* iterator);
51 Tile* tile_;
52 PictureLayerTiling* tiling_;
53 TilingData* tiling_data_;
56 // Iterates over visible rect only, left to right top to bottom order.
57 class VisibleTilingIterator : public OnePriorityRectIterator {
58 public:
59 VisibleTilingIterator() = default;
60 VisibleTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data);
62 VisibleTilingIterator& operator++();
64 private:
65 TilingData::Iterator iterator_;
68 class PendingVisibleTilingIterator : public OnePriorityRectIterator {
69 public:
70 PendingVisibleTilingIterator() = default;
71 PendingVisibleTilingIterator(PictureLayerTiling* tiling,
72 TilingData* tiling_data);
74 PendingVisibleTilingIterator& operator++();
76 private:
77 TilingData::DifferenceIterator iterator_;
80 // Iterates over skewport only, spiral around the visible rect.
81 class SkewportTilingIterator : public OnePriorityRectIterator {
82 public:
83 SkewportTilingIterator() = default;
84 SkewportTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data);
86 SkewportTilingIterator& operator++();
88 private:
89 TilingData::SpiralDifferenceIterator iterator_;
90 gfx::Rect pending_visible_rect_;
93 // Iterates over soon border only, spiral around the visible rect.
94 class SoonBorderTilingIterator : public OnePriorityRectIterator {
95 public:
96 SoonBorderTilingIterator() = default;
97 SoonBorderTilingIterator(PictureLayerTiling* tiling,
98 TilingData* tiling_data);
100 SoonBorderTilingIterator& operator++();
102 private:
103 TilingData::SpiralDifferenceIterator iterator_;
104 gfx::Rect pending_visible_rect_;
107 // Iterates over eventually rect only, spiral around the soon rect.
108 class EventuallyTilingIterator : public OnePriorityRectIterator {
109 public:
110 EventuallyTilingIterator() = default;
111 EventuallyTilingIterator(PictureLayerTiling* tiling,
112 TilingData* tiling_data);
114 EventuallyTilingIterator& operator++();
116 private:
117 TilingData::SpiralDifferenceIterator iterator_;
118 gfx::Rect pending_visible_rect_;
121 // Iterates over all of the above phases in the following order: visible,
122 // skewport, soon border, eventually.
123 class TilingIterator {
124 public:
125 TilingIterator();
126 explicit TilingIterator(PictureLayerTiling* tiling,
127 TilingData* tiling_data);
128 ~TilingIterator();
130 bool done() const { return current_tile_ == nullptr; }
131 const Tile* operator*() const { return current_tile_; }
132 Tile* operator*() { return current_tile_; }
133 TilePriority::PriorityBin type() const {
134 switch (phase_) {
135 case VISIBLE_RECT:
136 return TilePriority::NOW;
137 case PENDING_VISIBLE_RECT:
138 case SKEWPORT_RECT:
139 case SOON_BORDER_RECT:
140 return TilePriority::SOON;
141 case EVENTUALLY_RECT:
142 return TilePriority::EVENTUALLY;
144 NOTREACHED();
145 return TilePriority::EVENTUALLY;
148 TilingIterator& operator++();
150 private:
151 // PENDING VISIBLE RECT refers to the visible rect that will become current
152 // upon activation (ie, the pending tree's visible rect). Tiles in this
153 // region that are not part of the current visible rect are all handled
154 // here. Note that when processing a pending tree, this rect is the same as
155 // the visible rect so no tiles are processed in this case.
156 enum Phase {
157 VISIBLE_RECT,
158 PENDING_VISIBLE_RECT,
159 SKEWPORT_RECT,
160 SOON_BORDER_RECT,
161 EVENTUALLY_RECT
164 void AdvancePhase();
166 PictureLayerTiling* tiling_;
167 TilingData* tiling_data_;
169 Phase phase_;
171 Tile* current_tile_;
172 VisibleTilingIterator visible_iterator_;
173 PendingVisibleTilingIterator pending_visible_iterator_;
174 SkewportTilingIterator skewport_iterator_;
175 SoonBorderTilingIterator soon_border_iterator_;
176 EventuallyTilingIterator eventually_iterator_;
179 enum IteratorType {
180 LOW_RES,
181 HIGH_RES,
182 ACTIVE_NON_IDEAL_PENDING_HIGH_RES,
183 NUM_ITERATORS
186 void AdvanceToNextStage();
188 PictureLayerTilingSet* tiling_set_;
190 struct IterationStage {
191 IterationStage(IteratorType type, TilePriority::PriorityBin bin);
192 IteratorType iterator_type;
193 TilePriority::PriorityBin tile_type;
196 size_t current_stage_;
198 // The max number of stages is 6: 1 low res, 3 high res, and 2 active non
199 // ideal pending high res.
200 base::StackVector<IterationStage, 6> stages_;
201 TilingIterator iterators_[NUM_ITERATORS];
204 } // namespace cc
206 #endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_