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/tiles/eviction_tile_priority_queue.h" | 5 #include "cc/tiles/eviction_tile_priority_queue.h" |
6 | 6 |
7 namespace cc { | 7 namespace cc { |
8 | 8 |
9 namespace { | 9 namespace { |
10 | 10 |
11 class EvictionOrderComparator { | 11 class EvictionOrderComparator { |
12 public: | 12 public: |
13 explicit EvictionOrderComparator(TreePriority tree_priority) | 13 explicit EvictionOrderComparator(TreePriority tree_priority) |
14 : tree_priority_(tree_priority) {} | 14 : tree_priority_(tree_priority) {} |
15 | 15 |
16 bool operator()(const TilingSetEvictionQueue* a_queue, | 16 bool operator()(const scoped_ptr<TilingSetEvictionQueue>& a_queue, |
17 const TilingSetEvictionQueue* b_queue) const { | 17 const scoped_ptr<TilingSetEvictionQueue>& b_queue) const { |
18 // Note that in this function, we have to return true if and only if | 18 // Note that in this function, we have to return true if and only if |
19 // b is strictly lower priority than a. | 19 // b is strictly lower priority than a. |
20 const PrioritizedTile& a_tile = a_queue->Top(); | 20 const PrioritizedTile& a_tile = a_queue->Top(); |
21 const PrioritizedTile& b_tile = b_queue->Top(); | 21 const PrioritizedTile& b_tile = b_queue->Top(); |
22 | 22 |
23 const TilePriority& a_priority = a_tile.priority(); | 23 const TilePriority& a_priority = a_tile.priority(); |
24 const TilePriority& b_priority = b_tile.priority(); | 24 const TilePriority& b_priority = b_tile.priority(); |
25 bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY; | 25 bool prioritize_low_res = tree_priority_ == SMOOTHNESS_TAKES_PRIORITY; |
26 | 26 |
27 // If the priority bin differs, b is lower priority if it has the higher | 27 // If the priority bin differs, b is lower priority if it has the higher |
(...skipping 29 matching lines...) Expand all Loading... | |
57 return b_priority.distance_to_visible > a_priority.distance_to_visible; | 57 return b_priority.distance_to_visible > a_priority.distance_to_visible; |
58 } | 58 } |
59 | 59 |
60 private: | 60 private: |
61 TreePriority tree_priority_; | 61 TreePriority tree_priority_; |
62 }; | 62 }; |
63 | 63 |
64 void CreateTilingSetEvictionQueues( | 64 void CreateTilingSetEvictionQueues( |
65 const std::vector<PictureLayerImpl*>& layers, | 65 const std::vector<PictureLayerImpl*>& layers, |
66 TreePriority tree_priority, | 66 TreePriority tree_priority, |
67 ScopedPtrVector<TilingSetEvictionQueue>* queues) { | 67 std::vector<scoped_ptr<TilingSetEvictionQueue>>* queues) { |
68 DCHECK(queues->empty()); | 68 DCHECK(queues->empty()); |
69 | 69 |
70 for (auto* layer : layers) { | 70 for (auto* layer : layers) { |
71 scoped_ptr<TilingSetEvictionQueue> tiling_set_queue = make_scoped_ptr( | 71 scoped_ptr<TilingSetEvictionQueue> tiling_set_queue = make_scoped_ptr( |
72 new TilingSetEvictionQueue(layer->picture_layer_tiling_set())); | 72 new TilingSetEvictionQueue(layer->picture_layer_tiling_set())); |
73 // Queues will only contain non empty tiling sets. | 73 // Queues will only contain non empty tiling sets. |
74 if (!tiling_set_queue->IsEmpty()) | 74 if (!tiling_set_queue->IsEmpty()) |
75 queues->push_back(tiling_set_queue.Pass()); | 75 queues->push_back(tiling_set_queue.Pass()); |
76 } | 76 } |
77 queues->make_heap(EvictionOrderComparator(tree_priority)); | 77 std::make_heap(queues->begin(), queues->end(), |
78 EvictionOrderComparator(tree_priority)); | |
78 } | 79 } |
79 | 80 |
80 } // namespace | 81 } // namespace |
81 | 82 |
82 EvictionTilePriorityQueue::EvictionTilePriorityQueue() { | 83 EvictionTilePriorityQueue::EvictionTilePriorityQueue() { |
83 } | 84 } |
84 | 85 |
85 EvictionTilePriorityQueue::~EvictionTilePriorityQueue() { | 86 EvictionTilePriorityQueue::~EvictionTilePriorityQueue() { |
86 } | 87 } |
87 | 88 |
88 void EvictionTilePriorityQueue::Build( | 89 void EvictionTilePriorityQueue::Build( |
89 const std::vector<PictureLayerImpl*>& active_layers, | 90 const std::vector<PictureLayerImpl*>& active_layers, |
90 const std::vector<PictureLayerImpl*>& pending_layers, | 91 const std::vector<PictureLayerImpl*>& pending_layers, |
91 TreePriority tree_priority) { | 92 TreePriority tree_priority) { |
92 tree_priority_ = tree_priority; | 93 tree_priority_ = tree_priority; |
93 | 94 |
94 CreateTilingSetEvictionQueues(active_layers, tree_priority, &active_queues_); | 95 CreateTilingSetEvictionQueues(active_layers, tree_priority, &active_queues_); |
95 CreateTilingSetEvictionQueues(pending_layers, tree_priority, | 96 CreateTilingSetEvictionQueues(pending_layers, tree_priority, |
96 &pending_queues_); | 97 &pending_queues_); |
97 } | 98 } |
98 | 99 |
99 bool EvictionTilePriorityQueue::IsEmpty() const { | 100 bool EvictionTilePriorityQueue::IsEmpty() const { |
100 return active_queues_.empty() && pending_queues_.empty(); | 101 return active_queues_.empty() && pending_queues_.empty(); |
101 } | 102 } |
102 | 103 |
103 const PrioritizedTile& EvictionTilePriorityQueue::Top() const { | 104 const PrioritizedTile& EvictionTilePriorityQueue::Top() const { |
104 DCHECK(!IsEmpty()); | 105 DCHECK(!IsEmpty()); |
105 const ScopedPtrVector<TilingSetEvictionQueue>& next_queues = GetNextQueues(); | 106 const std::vector<scoped_ptr<TilingSetEvictionQueue>>& next_queues = |
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
107 GetNextQueues(); | |
106 return next_queues.front()->Top(); | 108 return next_queues.front()->Top(); |
107 } | 109 } |
108 | 110 |
109 void EvictionTilePriorityQueue::Pop() { | 111 void EvictionTilePriorityQueue::Pop() { |
110 DCHECK(!IsEmpty()); | 112 DCHECK(!IsEmpty()); |
111 | 113 |
112 ScopedPtrVector<TilingSetEvictionQueue>& next_queues = GetNextQueues(); | 114 std::vector<scoped_ptr<TilingSetEvictionQueue>>& next_queues = |
danakj
2015/11/17 01:12:18
auto?
vmpstr
2015/11/17 23:26:24
Done.
| |
113 next_queues.pop_heap(EvictionOrderComparator(tree_priority_)); | 115 GetNextQueues(); |
114 TilingSetEvictionQueue* queue = next_queues.back(); | 116 std::pop_heap(next_queues.begin(), next_queues.end(), |
117 EvictionOrderComparator(tree_priority_)); | |
118 TilingSetEvictionQueue* queue = next_queues.back().get(); | |
115 queue->Pop(); | 119 queue->Pop(); |
116 | 120 |
117 // Remove empty queues. | 121 // Remove empty queues. |
118 if (queue->IsEmpty()) | 122 if (queue->IsEmpty()) { |
119 next_queues.pop_back(); | 123 next_queues.pop_back(); |
120 else | 124 } else { |
121 next_queues.push_heap(EvictionOrderComparator(tree_priority_)); | 125 std::push_heap(next_queues.begin(), next_queues.end(), |
126 EvictionOrderComparator(tree_priority_)); | |
127 } | |
122 } | 128 } |
123 | 129 |
124 ScopedPtrVector<TilingSetEvictionQueue>& | 130 std::vector<scoped_ptr<TilingSetEvictionQueue>>& |
125 EvictionTilePriorityQueue::GetNextQueues() { | 131 EvictionTilePriorityQueue::GetNextQueues() { |
126 return const_cast<ScopedPtrVector<TilingSetEvictionQueue>&>( | 132 return const_cast<std::vector<scoped_ptr<TilingSetEvictionQueue>>&>( |
danakj
2015/11/17 01:12:18
The number of casts in this function is approachin
vmpstr
2015/11/17 23:26:24
Done.
| |
127 static_cast<const EvictionTilePriorityQueue*>(this)->GetNextQueues()); | 133 static_cast<const EvictionTilePriorityQueue*>(this)->GetNextQueues()); |
128 } | 134 } |
129 | 135 |
130 const ScopedPtrVector<TilingSetEvictionQueue>& | 136 const std::vector<scoped_ptr<TilingSetEvictionQueue>>& |
131 EvictionTilePriorityQueue::GetNextQueues() const { | 137 EvictionTilePriorityQueue::GetNextQueues() const { |
132 DCHECK(!IsEmpty()); | 138 DCHECK(!IsEmpty()); |
133 | 139 |
134 // If we only have one queue with tiles, return it. | 140 // If we only have one queue with tiles, return it. |
135 if (active_queues_.empty()) | 141 if (active_queues_.empty()) |
136 return pending_queues_; | 142 return pending_queues_; |
137 if (pending_queues_.empty()) | 143 if (pending_queues_.empty()) |
138 return active_queues_; | 144 return active_queues_; |
139 | 145 |
140 const PrioritizedTile& active_tile = active_queues_.front()->Top(); | 146 const PrioritizedTile& active_tile = active_queues_.front()->Top(); |
(...skipping 11 matching lines...) Expand all Loading... | |
152 : active_queues_; | 158 : active_queues_; |
153 } | 159 } |
154 | 160 |
155 // Return tile with a lower priority. | 161 // Return tile with a lower priority. |
156 if (pending_priority.IsHigherPriorityThan(active_priority)) | 162 if (pending_priority.IsHigherPriorityThan(active_priority)) |
157 return active_queues_; | 163 return active_queues_; |
158 return pending_queues_; | 164 return pending_queues_; |
159 } | 165 } |
160 | 166 |
161 } // namespace cc | 167 } // namespace cc |
OLD | NEW |