| 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/raster_tile_priority_queue.h" | 5 #include "cc/resources/raster_tile_priority_queue.h" |
| 6 | 6 |
| 7 namespace cc { | 7 namespace cc { |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 return b_priority.resolution == LOW_RESOLUTION; | 56 return b_priority.resolution == LOW_RESOLUTION; |
| 57 return b_priority.resolution == HIGH_RESOLUTION; | 57 return b_priority.resolution == HIGH_RESOLUTION; |
| 58 } | 58 } |
| 59 return b_priority.IsHigherPriorityThan(a_priority); | 59 return b_priority.IsHigherPriorityThan(a_priority); |
| 60 } | 60 } |
| 61 | 61 |
| 62 private: | 62 private: |
| 63 TreePriority tree_priority_; | 63 TreePriority tree_priority_; |
| 64 }; | 64 }; |
| 65 | 65 |
| 66 WhichTree HigherPriorityTree( |
| 67 TreePriority tree_priority, |
| 68 const PictureLayerImpl::LayerRasterTileIterator* active_iterator, |
| 69 const PictureLayerImpl::LayerRasterTileIterator* pending_iterator, |
| 70 const Tile* shared_tile) { |
| 71 switch (tree_priority) { |
| 72 case SMOOTHNESS_TAKES_PRIORITY: |
| 73 return ACTIVE_TREE; |
| 74 case NEW_CONTENT_TAKES_PRIORITY: |
| 75 return PENDING_TREE; |
| 76 case SAME_PRIORITY_FOR_BOTH_TREES: { |
| 77 const Tile* active_tile = shared_tile ? shared_tile : **active_iterator; |
| 78 const Tile* pending_tile = shared_tile ? shared_tile : **pending_iterator; |
| 79 |
| 80 const TilePriority& active_priority = active_tile->priority(ACTIVE_TREE); |
| 81 const TilePriority& pending_priority = |
| 82 pending_tile->priority(PENDING_TREE); |
| 83 |
| 84 if (active_priority.IsHigherPriorityThan(pending_priority)) |
| 85 return ACTIVE_TREE; |
| 86 return PENDING_TREE; |
| 87 } |
| 88 default: |
| 89 NOTREACHED(); |
| 90 return ACTIVE_TREE; |
| 91 } |
| 92 } |
| 93 |
| 66 } // namespace | 94 } // namespace |
| 67 | 95 |
| 68 RasterTilePriorityQueue::RasterTilePriorityQueue() { | 96 RasterTilePriorityQueue::RasterTilePriorityQueue() { |
| 69 } | 97 } |
| 70 | 98 |
| 71 RasterTilePriorityQueue::~RasterTilePriorityQueue() { | 99 RasterTilePriorityQueue::~RasterTilePriorityQueue() { |
| 72 } | 100 } |
| 73 | 101 |
| 74 void RasterTilePriorityQueue::Build( | 102 void RasterTilePriorityQueue::Build( |
| 75 const std::vector<PictureLayerImpl::Pair>& paired_layers, | 103 const std::vector<PictureLayerImpl::Pair>& paired_layers, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 TreePriority tree_priority) | 143 TreePriority tree_priority) |
| 116 : active_iterator(layer_pair.active | 144 : active_iterator(layer_pair.active |
| 117 ? PictureLayerImpl::LayerRasterTileIterator( | 145 ? PictureLayerImpl::LayerRasterTileIterator( |
| 118 layer_pair.active, | 146 layer_pair.active, |
| 119 tree_priority == SMOOTHNESS_TAKES_PRIORITY) | 147 tree_priority == SMOOTHNESS_TAKES_PRIORITY) |
| 120 : PictureLayerImpl::LayerRasterTileIterator()), | 148 : PictureLayerImpl::LayerRasterTileIterator()), |
| 121 pending_iterator(layer_pair.pending | 149 pending_iterator(layer_pair.pending |
| 122 ? PictureLayerImpl::LayerRasterTileIterator( | 150 ? PictureLayerImpl::LayerRasterTileIterator( |
| 123 layer_pair.pending, | 151 layer_pair.pending, |
| 124 tree_priority == SMOOTHNESS_TAKES_PRIORITY) | 152 tree_priority == SMOOTHNESS_TAKES_PRIORITY) |
| 125 : PictureLayerImpl::LayerRasterTileIterator()) { | 153 : PictureLayerImpl::LayerRasterTileIterator()), |
| 154 has_both_layers(layer_pair.active && layer_pair.pending) { |
| 126 } | 155 } |
| 127 | 156 |
| 128 RasterTilePriorityQueue::PairedPictureLayerQueue::~PairedPictureLayerQueue() { | 157 RasterTilePriorityQueue::PairedPictureLayerQueue::~PairedPictureLayerQueue() { |
| 129 } | 158 } |
| 130 | 159 |
| 131 bool RasterTilePriorityQueue::PairedPictureLayerQueue::IsEmpty() const { | 160 bool RasterTilePriorityQueue::PairedPictureLayerQueue::IsEmpty() const { |
| 132 return !active_iterator && !pending_iterator; | 161 return !active_iterator && !pending_iterator; |
| 133 } | 162 } |
| 134 | 163 |
| 135 Tile* RasterTilePriorityQueue::PairedPictureLayerQueue::Top( | 164 Tile* RasterTilePriorityQueue::PairedPictureLayerQueue::Top( |
| 136 TreePriority tree_priority) { | 165 TreePriority tree_priority) { |
| 137 DCHECK(!IsEmpty()); | 166 DCHECK(!IsEmpty()); |
| 138 | 167 |
| 139 WhichTree next_tree = NextTileIteratorTree(tree_priority); | 168 WhichTree next_tree = NextTileIteratorTree(tree_priority); |
| 140 PictureLayerImpl::LayerRasterTileIterator* next_iterator = | 169 PictureLayerImpl::LayerRasterTileIterator* next_iterator = |
| 141 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 170 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; |
| 142 DCHECK(*next_iterator); | 171 DCHECK(*next_iterator); |
| 143 Tile* tile = **next_iterator; | 172 Tile* tile = **next_iterator; |
| 144 DCHECK(std::find(returned_shared_tiles.begin(), | 173 DCHECK(returned_tiles_for_debug.find(tile) == returned_tiles_for_debug.end()); |
| 145 returned_shared_tiles.end(), | |
| 146 tile) == returned_shared_tiles.end()); | |
| 147 return tile; | 174 return tile; |
| 148 } | 175 } |
| 149 | 176 |
| 150 void RasterTilePriorityQueue::PairedPictureLayerQueue::Pop( | 177 void RasterTilePriorityQueue::PairedPictureLayerQueue::Pop( |
| 151 TreePriority tree_priority) { | 178 TreePriority tree_priority) { |
| 152 DCHECK(!IsEmpty()); | 179 DCHECK(!IsEmpty()); |
| 153 | 180 |
| 154 WhichTree next_tree = NextTileIteratorTree(tree_priority); | 181 WhichTree next_tree = NextTileIteratorTree(tree_priority); |
| 155 PictureLayerImpl::LayerRasterTileIterator* next_iterator = | 182 PictureLayerImpl::LayerRasterTileIterator* next_iterator = |
| 156 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 183 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; |
| 157 DCHECK(*next_iterator); | 184 DCHECK(*next_iterator); |
| 158 returned_shared_tiles.push_back(**next_iterator); | 185 DCHECK(returned_tiles_for_debug.insert(**next_iterator).second); |
| 159 ++(*next_iterator); | 186 ++(*next_iterator); |
| 160 | 187 |
| 161 if (IsEmpty()) | 188 if (has_both_layers) { |
| 162 return; | 189 // We have both layers (active and pending) thus we can encounter shared |
| 190 // tiles twice (from the active iterator and from the pending iterator). |
| 191 for (; !IsEmpty(); ++(*next_iterator)) { |
| 192 next_tree = NextTileIteratorTree(tree_priority); |
| 193 next_iterator = |
| 194 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; |
| 163 | 195 |
| 164 next_tree = NextTileIteratorTree(tree_priority); | 196 // Accept all non-shared tiles. |
| 165 next_iterator = | 197 const Tile* tile = **next_iterator; |
| 166 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | 198 if (!tile->is_shared()) |
| 167 while (std::find(returned_shared_tiles.begin(), | 199 break; |
| 168 returned_shared_tiles.end(), | 200 |
| 169 **next_iterator) != returned_shared_tiles.end()) { | 201 // Accept a shared tile if the next tree is the higher priority one |
| 170 ++(*next_iterator); | 202 // corresponding the iterator (active or pending) which usually (but due |
| 171 if (IsEmpty()) | 203 // to spiral iterators not always) returns the shared tile first. |
| 172 break; | 204 if (next_tree == HigherPriorityTree(tree_priority, NULL, NULL, tile)) |
| 173 next_tree = NextTileIteratorTree(tree_priority); | 205 break; |
| 174 next_iterator = | 206 } |
| 175 next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator; | |
| 176 } | 207 } |
| 208 |
| 209 // If no empty, use Top to do DCHECK the next iterator. |
| 210 DCHECK(IsEmpty() || Top(tree_priority)); |
| 177 } | 211 } |
| 178 | 212 |
| 179 WhichTree | 213 WhichTree |
| 180 RasterTilePriorityQueue::PairedPictureLayerQueue::NextTileIteratorTree( | 214 RasterTilePriorityQueue::PairedPictureLayerQueue::NextTileIteratorTree( |
| 181 TreePriority tree_priority) const { | 215 TreePriority tree_priority) const { |
| 182 DCHECK(!IsEmpty()); | 216 DCHECK(!IsEmpty()); |
| 183 | 217 |
| 184 // If we only have one iterator with tiles, return it. | 218 // If we only have one iterator with tiles, return it. |
| 185 if (!active_iterator) | 219 if (!active_iterator) |
| 186 return PENDING_TREE; | 220 return PENDING_TREE; |
| 187 if (!pending_iterator) | 221 if (!pending_iterator) |
| 188 return ACTIVE_TREE; | 222 return ACTIVE_TREE; |
| 189 | 223 |
| 190 // Now both iterators have tiles, so we have to decide based on tree priority. | 224 // Now both iterators have tiles, so we have to decide based on tree priority. |
| 191 switch (tree_priority) { | 225 return HigherPriorityTree( |
| 192 case SMOOTHNESS_TAKES_PRIORITY: | 226 tree_priority, &active_iterator, &pending_iterator, NULL); |
| 193 return ACTIVE_TREE; | |
| 194 case NEW_CONTENT_TAKES_PRIORITY: | |
| 195 return PENDING_TREE; | |
| 196 case SAME_PRIORITY_FOR_BOTH_TREES: { | |
| 197 const Tile* active_tile = *active_iterator; | |
| 198 const Tile* pending_tile = *pending_iterator; | |
| 199 if (active_tile == pending_tile) | |
| 200 return ACTIVE_TREE; | |
| 201 | |
| 202 const TilePriority& active_priority = active_tile->priority(ACTIVE_TREE); | |
| 203 const TilePriority& pending_priority = | |
| 204 pending_tile->priority(PENDING_TREE); | |
| 205 | |
| 206 if (active_priority.IsHigherPriorityThan(pending_priority)) | |
| 207 return ACTIVE_TREE; | |
| 208 return PENDING_TREE; | |
| 209 } | |
| 210 default: | |
| 211 NOTREACHED(); | |
| 212 } | |
| 213 | |
| 214 NOTREACHED(); | |
| 215 // Keep the compiler happy. | |
| 216 return ACTIVE_TREE; | |
| 217 } | 227 } |
| 218 | 228 |
| 219 } // namespace cc | 229 } // namespace cc |
| OLD | NEW |