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 #include "cc/resources/tiling_set_raster_queue.h" | 5 #include "cc/resources/tiling_set_raster_queue.h" |
6 | 6 |
| 7 #include <utility> |
| 8 |
| 9 #include "cc/resources/picture_layer_tiling_set.h" |
| 10 #include "cc/resources/tile.h" |
| 11 #include "cc/resources/tile_priority.h" |
| 12 |
7 namespace cc { | 13 namespace cc { |
8 | 14 |
9 TilingSetRasterQueue::TilingSetRasterQueue() | 15 TilingSetRasterQueue::TilingSetRasterQueue() |
10 : tiling_set_(nullptr), current_stage_(arraysize(stages_)) { | 16 : tiling_set_(nullptr), current_stage_(arraysize(stages_)) { |
11 } | 17 } |
12 | 18 |
13 TilingSetRasterQueue::TilingSetRasterQueue(PictureLayerTilingSet* tiling_set, | 19 TilingSetRasterQueue::TilingSetRasterQueue(PictureLayerTilingSet* tiling_set, |
14 bool prioritize_low_res) | 20 bool prioritize_low_res) |
15 : tiling_set_(tiling_set), current_stage_(0) { | 21 : tiling_set_(tiling_set), current_stage_(0) { |
16 DCHECK(tiling_set_); | 22 DCHECK(tiling_set_); |
17 | 23 |
18 // Early out if the tiling set has no tilings. | 24 // Early out if the tiling set has no tilings. |
19 if (!tiling_set_->num_tilings()) { | 25 if (!tiling_set_->num_tilings()) { |
20 current_stage_ = arraysize(stages_); | 26 current_stage_ = arraysize(stages_); |
21 return; | 27 return; |
22 } | 28 } |
23 | 29 |
24 // Find high and low res tilings and initialize the iterators. | 30 // Find high and low res tilings and initialize the iterators. |
25 for (size_t i = 0; i < tiling_set_->num_tilings(); ++i) { | 31 for (size_t i = 0; i < tiling_set_->num_tilings(); ++i) { |
26 PictureLayerTiling* tiling = tiling_set_->tiling_at(i); | 32 PictureLayerTiling* tiling = tiling_set_->tiling_at(i); |
27 if (tiling->resolution() == HIGH_RESOLUTION) { | 33 if (tiling->resolution() == HIGH_RESOLUTION) |
28 iterators_[HIGH_RES] = | 34 iterators_[HIGH_RES] = TilingIterator(tiling, &tiling->tiling_data_); |
29 PictureLayerTiling::TilingRasterTileIterator(tiling); | 35 if (prioritize_low_res && tiling->resolution() == LOW_RESOLUTION) |
30 } | 36 iterators_[LOW_RES] = TilingIterator(tiling, &tiling->tiling_data_); |
31 | |
32 if (prioritize_low_res && tiling->resolution() == LOW_RESOLUTION) { | |
33 iterators_[LOW_RES] = | |
34 PictureLayerTiling::TilingRasterTileIterator(tiling); | |
35 } | |
36 } | 37 } |
37 | 38 |
38 if (prioritize_low_res) { | 39 if (prioritize_low_res) { |
39 stages_[0].iterator_type = LOW_RES; | 40 stages_[0].iterator_type = LOW_RES; |
40 stages_[0].tile_type = TilePriority::NOW; | 41 stages_[0].tile_type = TilePriority::NOW; |
41 | 42 |
42 stages_[1].iterator_type = HIGH_RES; | 43 stages_[1].iterator_type = HIGH_RES; |
43 stages_[1].tile_type = TilePriority::NOW; | 44 stages_[1].tile_type = TilePriority::NOW; |
44 } else { | 45 } else { |
45 stages_[0].iterator_type = HIGH_RES; | 46 stages_[0].iterator_type = HIGH_RES; |
46 stages_[0].tile_type = TilePriority::NOW; | 47 stages_[0].tile_type = TilePriority::NOW; |
47 | 48 |
48 stages_[1].iterator_type = LOW_RES; | 49 stages_[1].iterator_type = LOW_RES; |
49 stages_[1].tile_type = TilePriority::NOW; | 50 stages_[1].tile_type = TilePriority::NOW; |
50 } | 51 } |
51 | 52 |
52 stages_[2].iterator_type = HIGH_RES; | 53 stages_[2].iterator_type = HIGH_RES; |
53 stages_[2].tile_type = TilePriority::SOON; | 54 stages_[2].tile_type = TilePriority::SOON; |
54 | 55 |
55 stages_[3].iterator_type = HIGH_RES; | 56 stages_[3].iterator_type = HIGH_RES; |
56 stages_[3].tile_type = TilePriority::EVENTUALLY; | 57 stages_[3].tile_type = TilePriority::EVENTUALLY; |
57 | 58 |
58 IteratorType index = stages_[current_stage_].iterator_type; | 59 IteratorType index = stages_[current_stage_].iterator_type; |
59 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; | 60 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; |
60 if (!iterators_[index] || iterators_[index].get_type() != tile_type) | 61 if (!iterators_[index] || iterators_[index].type() != tile_type) |
61 AdvanceToNextStage(); | 62 AdvanceToNextStage(); |
62 } | 63 } |
63 | 64 |
64 TilingSetRasterQueue::~TilingSetRasterQueue() { | 65 TilingSetRasterQueue::~TilingSetRasterQueue() { |
65 } | 66 } |
66 | 67 |
67 bool TilingSetRasterQueue::IsEmpty() const { | 68 bool TilingSetRasterQueue::IsEmpty() const { |
68 return current_stage_ >= arraysize(stages_); | 69 return current_stage_ >= arraysize(stages_); |
69 } | 70 } |
70 | 71 |
71 void TilingSetRasterQueue::Pop() { | 72 void TilingSetRasterQueue::Pop() { |
72 IteratorType index = stages_[current_stage_].iterator_type; | 73 IteratorType index = stages_[current_stage_].iterator_type; |
73 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; | 74 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; |
74 | 75 |
75 // First advance the iterator. | 76 // First advance the iterator. |
76 DCHECK(iterators_[index]); | 77 DCHECK(iterators_[index]); |
77 DCHECK(iterators_[index].get_type() == tile_type); | 78 DCHECK(iterators_[index].type() == tile_type); |
78 ++iterators_[index]; | 79 ++iterators_[index]; |
79 | 80 |
80 if (!iterators_[index] || iterators_[index].get_type() != tile_type) | 81 if (!iterators_[index] || iterators_[index].type() != tile_type) |
81 AdvanceToNextStage(); | 82 AdvanceToNextStage(); |
82 } | 83 } |
83 | 84 |
84 Tile* TilingSetRasterQueue::Top() { | 85 Tile* TilingSetRasterQueue::Top() { |
85 DCHECK(!IsEmpty()); | 86 DCHECK(!IsEmpty()); |
86 | 87 |
87 IteratorType index = stages_[current_stage_].iterator_type; | 88 IteratorType index = stages_[current_stage_].iterator_type; |
88 DCHECK(iterators_[index]); | 89 DCHECK(iterators_[index]); |
89 DCHECK(iterators_[index].get_type() == stages_[current_stage_].tile_type); | 90 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type); |
90 | 91 |
91 return *iterators_[index]; | 92 return *iterators_[index]; |
92 } | 93 } |
93 | 94 |
94 const Tile* TilingSetRasterQueue::Top() const { | 95 const Tile* TilingSetRasterQueue::Top() const { |
95 DCHECK(!IsEmpty()); | 96 DCHECK(!IsEmpty()); |
96 | 97 |
97 IteratorType index = stages_[current_stage_].iterator_type; | 98 IteratorType index = stages_[current_stage_].iterator_type; |
98 DCHECK(iterators_[index]); | 99 DCHECK(iterators_[index]); |
99 DCHECK(iterators_[index].get_type() == stages_[current_stage_].tile_type); | 100 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type); |
100 | 101 |
101 return *iterators_[index]; | 102 return *iterators_[index]; |
102 } | 103 } |
103 | 104 |
104 void TilingSetRasterQueue::AdvanceToNextStage() { | 105 void TilingSetRasterQueue::AdvanceToNextStage() { |
105 DCHECK_LT(current_stage_, arraysize(stages_)); | 106 DCHECK_LT(current_stage_, arraysize(stages_)); |
106 ++current_stage_; | 107 ++current_stage_; |
107 while (current_stage_ < arraysize(stages_)) { | 108 while (current_stage_ < arraysize(stages_)) { |
108 IteratorType index = stages_[current_stage_].iterator_type; | 109 IteratorType index = stages_[current_stage_].iterator_type; |
109 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; | 110 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; |
110 | 111 |
111 if (iterators_[index] && iterators_[index].get_type() == tile_type) | 112 if (iterators_[index] && iterators_[index].type() == tile_type) |
112 break; | 113 break; |
113 ++current_stage_; | 114 ++current_stage_; |
114 } | 115 } |
115 } | 116 } |
116 | 117 |
| 118 TilingSetRasterQueue::TilingIterator::TilingIterator() |
| 119 : tiling_(NULL), current_tile_(NULL) { |
| 120 } |
| 121 |
| 122 TilingSetRasterQueue::TilingIterator::TilingIterator(PictureLayerTiling* tiling, |
| 123 TilingData* tiling_data) |
| 124 : tiling_(tiling), |
| 125 tiling_data_(tiling_data), |
| 126 phase_(VISIBLE_RECT), |
| 127 current_tile_(NULL) { |
| 128 if (!tiling_->has_visible_rect_tiles()) { |
| 129 AdvancePhase(); |
| 130 return; |
| 131 } |
| 132 |
| 133 visible_iterator_ = |
| 134 TilingData::Iterator(tiling_data_, tiling_->current_visible_rect(), |
| 135 false /* include_borders */); |
| 136 if (!visible_iterator_) { |
| 137 AdvancePhase(); |
| 138 return; |
| 139 } |
| 140 |
| 141 current_tile_ = |
| 142 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); |
| 143 if (!current_tile_ || !TileNeedsRaster(current_tile_)) { |
| 144 ++(*this); |
| 145 return; |
| 146 } |
| 147 tiling_->UpdateTileAndTwinPriority(current_tile_); |
| 148 } |
| 149 |
| 150 TilingSetRasterQueue::TilingIterator::~TilingIterator() { |
| 151 } |
| 152 |
| 153 void TilingSetRasterQueue::TilingIterator::AdvancePhase() { |
| 154 DCHECK_LT(phase_, EVENTUALLY_RECT); |
| 155 |
| 156 do { |
| 157 phase_ = static_cast<Phase>(phase_ + 1); |
| 158 switch (phase_) { |
| 159 case VISIBLE_RECT: |
| 160 NOTREACHED(); |
| 161 return; |
| 162 case SKEWPORT_RECT: |
| 163 if (!tiling_->has_skewport_rect_tiles()) |
| 164 continue; |
| 165 |
| 166 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
| 167 tiling_data_, tiling_->current_skewport_rect(), |
| 168 tiling_->current_visible_rect(), tiling_->current_visible_rect()); |
| 169 break; |
| 170 case SOON_BORDER_RECT: |
| 171 if (!tiling_->has_soon_border_rect_tiles()) |
| 172 continue; |
| 173 |
| 174 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
| 175 tiling_data_, tiling_->current_soon_border_rect(), |
| 176 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); |
| 177 break; |
| 178 case EVENTUALLY_RECT: |
| 179 if (!tiling_->has_eventually_rect_tiles()) { |
| 180 current_tile_ = NULL; |
| 181 return; |
| 182 } |
| 183 |
| 184 spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
| 185 tiling_data_, tiling_->current_eventually_rect(), |
| 186 tiling_->current_skewport_rect(), |
| 187 tiling_->current_soon_border_rect()); |
| 188 break; |
| 189 } |
| 190 |
| 191 while (spiral_iterator_) { |
| 192 current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(), |
| 193 spiral_iterator_.index_y()); |
| 194 if (current_tile_ && TileNeedsRaster(current_tile_)) |
| 195 break; |
| 196 ++spiral_iterator_; |
| 197 } |
| 198 |
| 199 if (!spiral_iterator_ && phase_ == EVENTUALLY_RECT) { |
| 200 current_tile_ = NULL; |
| 201 break; |
| 202 } |
| 203 } while (!spiral_iterator_); |
| 204 |
| 205 if (current_tile_) |
| 206 tiling_->UpdateTileAndTwinPriority(current_tile_); |
| 207 } |
| 208 |
| 209 TilingSetRasterQueue::TilingIterator& TilingSetRasterQueue::TilingIterator:: |
| 210 operator++() { |
| 211 current_tile_ = NULL; |
| 212 while (!current_tile_ || !TileNeedsRaster(current_tile_)) { |
| 213 std::pair<int, int> next_index; |
| 214 switch (phase_) { |
| 215 case VISIBLE_RECT: |
| 216 ++visible_iterator_; |
| 217 if (!visible_iterator_) { |
| 218 AdvancePhase(); |
| 219 return *this; |
| 220 } |
| 221 next_index = visible_iterator_.index(); |
| 222 break; |
| 223 case SKEWPORT_RECT: |
| 224 case SOON_BORDER_RECT: |
| 225 ++spiral_iterator_; |
| 226 if (!spiral_iterator_) { |
| 227 AdvancePhase(); |
| 228 return *this; |
| 229 } |
| 230 next_index = spiral_iterator_.index(); |
| 231 break; |
| 232 case EVENTUALLY_RECT: |
| 233 ++spiral_iterator_; |
| 234 if (!spiral_iterator_) { |
| 235 current_tile_ = NULL; |
| 236 return *this; |
| 237 } |
| 238 next_index = spiral_iterator_.index(); |
| 239 break; |
| 240 } |
| 241 current_tile_ = tiling_->TileAt(next_index.first, next_index.second); |
| 242 } |
| 243 |
| 244 if (current_tile_) |
| 245 tiling_->UpdateTileAndTwinPriority(current_tile_); |
| 246 return *this; |
| 247 } |
| 248 |
117 } // namespace cc | 249 } // namespace cc |
OLD | NEW |