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