OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ | 5 #ifndef CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ |
6 #define CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ | 6 #define CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ |
7 | 7 |
8 #include "base/containers/stack_container.h" | |
9 #include "cc/base/cc_export.h" | 8 #include "cc/base/cc_export.h" |
10 #include "cc/resources/picture_layer_tiling_set.h" | 9 #include "cc/resources/picture_layer_tiling_set.h" |
11 #include "cc/resources/tile.h" | 10 #include "cc/resources/tile.h" |
12 #include "cc/resources/tile_priority.h" | 11 #include "cc/resources/tile_priority.h" |
13 | 12 |
14 namespace cc { | 13 namespace cc { |
15 | 14 |
16 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION | 15 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION |
17 // and LOW_RESOLUTION tilings. | 16 // and LOW_RESOLUTION tilings. |
18 class CC_EXPORT TilingSetRasterQueueAll { | 17 class CC_EXPORT TilingSetRasterQueueAll { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 public: | 57 public: |
59 VisibleTilingIterator() = default; | 58 VisibleTilingIterator() = default; |
60 VisibleTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data); | 59 VisibleTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data); |
61 | 60 |
62 VisibleTilingIterator& operator++(); | 61 VisibleTilingIterator& operator++(); |
63 | 62 |
64 private: | 63 private: |
65 TilingData::Iterator iterator_; | 64 TilingData::Iterator iterator_; |
66 }; | 65 }; |
67 | 66 |
68 class PendingVisibleTilingIterator : public OnePriorityRectIterator { | |
69 public: | |
70 PendingVisibleTilingIterator() = default; | |
71 PendingVisibleTilingIterator(PictureLayerTiling* tiling, | |
72 TilingData* tiling_data); | |
73 | |
74 PendingVisibleTilingIterator& operator++(); | |
75 | |
76 private: | |
77 TilingData::DifferenceIterator iterator_; | |
78 }; | |
79 | |
80 // Iterates over skewport only, spiral around the visible rect. | 67 // Iterates over skewport only, spiral around the visible rect. |
81 class SkewportTilingIterator : public OnePriorityRectIterator { | 68 class SkewportTilingIterator : public OnePriorityRectIterator { |
82 public: | 69 public: |
83 SkewportTilingIterator() = default; | 70 SkewportTilingIterator() = default; |
84 SkewportTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data); | 71 SkewportTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data); |
85 | 72 |
86 SkewportTilingIterator& operator++(); | 73 SkewportTilingIterator& operator++(); |
87 | 74 |
88 private: | 75 private: |
89 TilingData::SpiralDifferenceIterator iterator_; | 76 TilingData::SpiralDifferenceIterator iterator_; |
90 gfx::Rect pending_visible_rect_; | |
91 }; | 77 }; |
92 | 78 |
93 // Iterates over soon border only, spiral around the visible rect. | 79 // Iterates over soon border only, spiral around the visible rect. |
94 class SoonBorderTilingIterator : public OnePriorityRectIterator { | 80 class SoonBorderTilingIterator : public OnePriorityRectIterator { |
95 public: | 81 public: |
96 SoonBorderTilingIterator() = default; | 82 SoonBorderTilingIterator() = default; |
97 SoonBorderTilingIterator(PictureLayerTiling* tiling, | 83 SoonBorderTilingIterator(PictureLayerTiling* tiling, |
98 TilingData* tiling_data); | 84 TilingData* tiling_data); |
99 | 85 |
100 SoonBorderTilingIterator& operator++(); | 86 SoonBorderTilingIterator& operator++(); |
101 | 87 |
102 private: | 88 private: |
103 TilingData::SpiralDifferenceIterator iterator_; | 89 TilingData::SpiralDifferenceIterator iterator_; |
104 gfx::Rect pending_visible_rect_; | |
105 }; | 90 }; |
106 | 91 |
107 // Iterates over eventually rect only, spiral around the soon rect. | 92 // Iterates over eventually rect only, spiral around the soon rect. |
108 class EventuallyTilingIterator : public OnePriorityRectIterator { | 93 class EventuallyTilingIterator : public OnePriorityRectIterator { |
109 public: | 94 public: |
110 EventuallyTilingIterator() = default; | 95 EventuallyTilingIterator() = default; |
111 EventuallyTilingIterator(PictureLayerTiling* tiling, | 96 EventuallyTilingIterator(PictureLayerTiling* tiling, |
112 TilingData* tiling_data); | 97 TilingData* tiling_data); |
113 | 98 |
114 EventuallyTilingIterator& operator++(); | 99 EventuallyTilingIterator& operator++(); |
115 | 100 |
116 private: | 101 private: |
117 TilingData::SpiralDifferenceIterator iterator_; | 102 TilingData::SpiralDifferenceIterator iterator_; |
118 gfx::Rect pending_visible_rect_; | |
119 }; | 103 }; |
120 | 104 |
121 // Iterates over all of the above phases in the following order: visible, | 105 // Iterates over all of the above phases in the following order: visible, |
122 // skewport, soon border, eventually. | 106 // skewport, soon border, eventually. |
123 class TilingIterator { | 107 class TilingIterator { |
124 public: | 108 public: |
125 TilingIterator(); | 109 TilingIterator(); |
126 explicit TilingIterator(PictureLayerTiling* tiling, | 110 explicit TilingIterator(PictureLayerTiling* tiling, |
127 TilingData* tiling_data); | 111 TilingData* tiling_data); |
128 ~TilingIterator(); | 112 ~TilingIterator() = default; |
129 | 113 |
130 bool done() const { return current_tile_ == nullptr; } | 114 bool done() const { return current_tile_ == nullptr; } |
131 const Tile* operator*() const { return current_tile_; } | 115 const Tile* operator*() const { return current_tile_; } |
132 Tile* operator*() { return current_tile_; } | 116 Tile* operator*() { return current_tile_; } |
133 TilePriority::PriorityBin type() const { | 117 TilePriority::PriorityBin type() const { |
134 switch (phase_) { | 118 switch (phase_) { |
135 case VISIBLE_RECT: | 119 case VISIBLE_RECT: |
136 return TilePriority::NOW; | 120 return TilePriority::NOW; |
137 case PENDING_VISIBLE_RECT: | |
138 case SKEWPORT_RECT: | 121 case SKEWPORT_RECT: |
139 case SOON_BORDER_RECT: | 122 case SOON_BORDER_RECT: |
140 return TilePriority::SOON; | 123 return TilePriority::SOON; |
141 case EVENTUALLY_RECT: | 124 case EVENTUALLY_RECT: |
142 return TilePriority::EVENTUALLY; | 125 return TilePriority::EVENTUALLY; |
143 } | 126 } |
144 NOTREACHED(); | 127 NOTREACHED(); |
145 return TilePriority::EVENTUALLY; | 128 return TilePriority::EVENTUALLY; |
146 } | 129 } |
147 | 130 |
148 TilingIterator& operator++(); | 131 TilingIterator& operator++(); |
149 | 132 |
150 private: | 133 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 { | 134 enum Phase { |
157 VISIBLE_RECT, | 135 VISIBLE_RECT, |
158 PENDING_VISIBLE_RECT, | |
159 SKEWPORT_RECT, | 136 SKEWPORT_RECT, |
160 SOON_BORDER_RECT, | 137 SOON_BORDER_RECT, |
161 EVENTUALLY_RECT | 138 EVENTUALLY_RECT |
162 }; | 139 }; |
163 | 140 |
164 void AdvancePhase(); | 141 void AdvancePhase(); |
165 | 142 |
166 PictureLayerTiling* tiling_; | 143 PictureLayerTiling* tiling_; |
167 TilingData* tiling_data_; | 144 TilingData* tiling_data_; |
168 | 145 |
169 Phase phase_; | 146 Phase phase_; |
170 | 147 |
171 Tile* current_tile_; | 148 Tile* current_tile_; |
172 VisibleTilingIterator visible_iterator_; | 149 VisibleTilingIterator visible_iterator_; |
173 PendingVisibleTilingIterator pending_visible_iterator_; | |
174 SkewportTilingIterator skewport_iterator_; | 150 SkewportTilingIterator skewport_iterator_; |
175 SoonBorderTilingIterator soon_border_iterator_; | 151 SoonBorderTilingIterator soon_border_iterator_; |
176 EventuallyTilingIterator eventually_iterator_; | 152 EventuallyTilingIterator eventually_iterator_; |
177 }; | 153 }; |
178 | 154 |
179 enum IteratorType { | 155 enum IteratorType { LOW_RES, HIGH_RES, NUM_ITERATORS }; |
180 LOW_RES, | |
181 HIGH_RES, | |
182 ACTIVE_NON_IDEAL_PENDING_HIGH_RES, | |
183 NUM_ITERATORS | |
184 }; | |
185 | 156 |
186 void AdvanceToNextStage(); | 157 void AdvanceToNextStage(); |
187 | 158 |
188 PictureLayerTilingSet* tiling_set_; | 159 PictureLayerTilingSet* tiling_set_; |
189 | 160 |
190 struct IterationStage { | 161 struct IterationStage { |
191 IterationStage(IteratorType type, TilePriority::PriorityBin bin); | |
192 IteratorType iterator_type; | 162 IteratorType iterator_type; |
193 TilePriority::PriorityBin tile_type; | 163 TilePriority::PriorityBin tile_type; |
194 }; | 164 }; |
195 | 165 |
196 size_t current_stage_; | 166 size_t current_stage_; |
197 | 167 |
198 // The max number of stages is 6: 1 low res, 3 high res, and 2 active non | 168 // One low res stage, and three high res stages. |
199 // ideal pending high res. | 169 IterationStage stages_[4]; |
200 base::StackVector<IterationStage, 6> stages_; | |
201 TilingIterator iterators_[NUM_ITERATORS]; | 170 TilingIterator iterators_[NUM_ITERATORS]; |
202 }; | 171 }; |
203 | 172 |
204 } // namespace cc | 173 } // namespace cc |
205 | 174 |
206 #endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ | 175 #endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ |
OLD | NEW |