Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Side by Side Diff: cc/resources/tiling_set_eviction_queue.h

Issue 1038793002: cc: Rework tiling set eviction iterator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_EVICTION_QUEUE_H_ 5 #ifndef CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_
6 #define CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_ 6 #define CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include "cc/base/cc_export.h" 10 #include "cc/base/cc_export.h"
11 #include "cc/resources/picture_layer_tiling_set.h" 11 #include "cc/resources/picture_layer_tiling_set.h"
12 12
13 namespace cc { 13 namespace cc {
14 14
15 // This eviction queue returned tiles from all tilings in a tiling set in 15 // This eviction queue returned tiles from all tilings in a tiling set in
16 // the following order: 16 // the order in which the tiles should be evicted. It can be thought of as the
17 // 1) Eventually rect tiles (EVENTUALLY tiles). 17 // following:
18 // 1) Eventually rect tiles not required for activation from each tiling in 18 // for all phases:
19 // the tiling set, in turn, in the following order: 19 // for all ordered tilings:
20 // 1) the first higher than high res tiling, the second one and so on 20 // yield the next tile for the given phase from the given tiling
21 // 2) the first lower than low res tiling, the second one and so on
22 // 3) the first between high and low res tiling, the second one and so on
23 // 4) low res tiling
24 // 5) high res tiling
25 // 2) Eventually rect tiles required for activation from the tiling with
26 // required for activation tiles. In the case of a pending tree tiling
27 // set that is the high res tiling. In the case of an active tree tiling
28 // set that is a tiling whose twin tiling is a pending tree high res
29 // tiling.
30 // 2) Soon border rect and skewport rect tiles (whose priority bin is SOON
31 // unless the max tile priority bin is lowered by PictureLayerTilingClient).
32 // 1) Soon border rect and skewport rect tiles not required for activation
33 // from each tiling in the tiling set.
34 // * Tilings are iterated in the same order as in the case of eventually
35 // rect tiles not required for activation.
36 // * For each tiling, first soon border rect tiles and then skewport
37 // rect tiles are returned.
38 // 2) Soon border rect and skewport rect tiles required for activation from
39 // the tiling with required for activation tiles.
40 // * First soon border rect tiles and then skewport rect tiles are
41 // returned.
42 // 3) Visible rect tiles (whose priority bin is NOW unless the max tile
43 // priority bin is lowered by PictureLayerTilingClient).
44 // 1) Visible rect tiles not required for activation from each tiling in
45 // the tiling set.
46 // * Tilings are iterated in the same order as in the case of eventually
47 // rect tiles not required for activation.
48 // * For each tiling, first occluded tiles and then unoccluded tiles
49 // are returned.
50 // 2) Visible rect tiles required for activation from the tiling with
51 // required for activation tiles.
52 // * First occluded tiles and then unoccluded tiles are returned.
53 // If the max tile priority bin is lowered by PictureLayerTilingClient,
54 // occlusion is not taken into account as occlusion is meaningful only for
55 // NOW tiles.
56 // 21 //
57 // Within each tiling and tile priority rect, tiles are returned in reverse 22 // Phases are the following (in order in which they are processed):
58 // spiral order i.e. in (mostly) decreasing distance-to-visible order. 23 // EVENTUALLY_RECT - Tiles in the eventually region of the tiling.
24 // SOON_BORDER_RECT - Tiles in the prepainting skirt of the tiling.
25 // SKEWPORT_RECT - Tiles in the skewport of the tiling.
26 // VISIBLE_RECT_OCCLUDED - Occluded, not required for activation, visible tiles.
27 // VISIBLE_RECT_UNOCCLUDED - Unoccluded, not required for activation, visible
28 // tiles.
29 // VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED - Occluded, but required for
30 // activation, visible tiles. This can happen when an active tree tile is
31 // occluded, but is not occluded on the pending tree (and is required for
32 // activation).
33 // VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED - Unoccluded, required for
34 // activation, tiles.
59 // 35 //
60 // If the skip_shared_out_of_order_tiles value passed to the constructor is 36 // The tilings are ordered as follows. Suppose we have tilings with the scales
61 // true (like it should be when there is a twin layer with a twin tiling set), 37 // below:
62 // eviction queue does not return shared which are out of order because their 38 // 2.0 1.5 1.0(HR) 0.8 0.5 0.25(LR) 0.2 0.1
63 // priority for tree priority is lowered or raised by a twin layer. 39 // With HR referring to high res tiling and LR referring to low res tiling,
64 // * If tree_priority is SAME_PRIORITY_FOR_BOTH_TREES, this happens for 40 // then tilings are processed in this order:
65 // a tile specific lower priority tree eviction queue (because priority for 41 // 2.0 1.5 0.1 0.2 0.5 0.8 0.25(LR) 1.0(HR).
66 // tree priority is a merged priority). 42 //
67 // * If tree priority is NEW_CONTENT_TAKES_PRIORITY, this happens for 43 // To put it differently:
68 // an active tree eviction queue (because priority for tree priority is 44 // 1. Process higher than high res tilings.
enne (OOO) 2015/03/27 19:12:11 I feel like this needs wording like "down to" or "
vmpstr 2015/03/27 20:19:27 Done.
69 // the pending priority). 45 // 2. Process lower than low res tilings.
70 // * If tree_priority is SMOOTHNESS_TAKES_PRIORITY, this happens for a pending 46 // 3. Process tilings between high and low res.
71 // tree eviction queue (because priority for tree priority is the active 47 // 4. Process the low res tiling.
72 // priority). 48 // 5. Process the high res tiling.
73 // Those skipped shared out of order tiles are when returned only by the twin 49 //
74 // eviction queue. 50 // Additional notes:
51 // Since eventually the tiles are considered to have the priority which is the
52 // higher of the two trees, we might visit a tile that should actually be
53 // returned by its twin. In those situations, the tiles are not returned. That
54 // is, since the twin has higher priority, it should return it when it gets to
55 // it. This ensures that we don't block raster because we've returned a tile
56 // with low priority on one tree, but high combined priority.
75 class CC_EXPORT TilingSetEvictionQueue { 57 class CC_EXPORT TilingSetEvictionQueue {
76 public: 58 public:
77 TilingSetEvictionQueue(PictureLayerTilingSet* tiling_set, 59 TilingSetEvictionQueue(PictureLayerTilingSet* tiling_set,
78 TreePriority tree_priority, 60 TreePriority tree_priority,
79 bool skip_shared_out_of_order_tiles); 61 bool skip_shared_out_of_order_tiles);
80 ~TilingSetEvictionQueue(); 62 ~TilingSetEvictionQueue();
81 63
82 Tile* Top(); 64 Tile* Top();
83 const Tile* Top() const; 65 const Tile* Top() const;
84 void Pop(); 66 void Pop();
85 bool IsEmpty() const; 67 bool IsEmpty() const;
86 68
87 private: 69 private:
88 bool AdvanceToNextEvictionTile(); 70 enum Phase {
89 bool AdvanceToNextPriorityBin(); 71 EVENTUALLY_RECT,
90 bool AdvanceToNextTilingRangeType(); 72 SOON_BORDER_RECT,
91 bool AdvanceToNextValidTiling(); 73 SKEWPORT_RECT,
74 VISIBLE_RECT_OCCLUDED,
75 VISIBLE_RECT_UNOCCLUDED,
76 VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED,
77 VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED
78 };
92 79
93 PictureLayerTilingSet::TilingRange CurrentTilingRange() const; 80 void GenerateTilingOrder(PictureLayerTilingSet* tiling_set);
94 size_t CurrentTilingIndex() const;
95 bool IsSharedOutOfOrderTile(const Tile* tile) const;
96 size_t TilingIndexWithRequiredForActivationTiles() const;
97 81
98 PictureLayerTilingSet* tiling_set_; 82 // Helper base class for individual region iterators.
83 class OnePriorityRectIterator {
enne (OOO) 2015/03/27 19:12:11 What does "one priority" mean?
vmpstr 2015/03/27 20:19:27 Well, it's just one priority rect as in eventually
enne (OOO) 2015/03/27 21:48:05 I guess it's the "OnePriority" part that confuses
vmpstr 2015/03/27 22:46:55 Done.
84 public:
85 OnePriorityRectIterator();
86 OnePriorityRectIterator(std::vector<PictureLayerTiling*>* tilings,
87 WhichTree tree,
88 TreePriority tree_priority,
89 bool skip_shared_out_of_order_tiles,
90 bool skip_all_shared_tiles);
91
92 bool done() const { return !tile_; }
93 Tile* operator*() const { return tile_; }
94
95 protected:
96 ~OnePriorityRectIterator() = default;
97
98 template <typename TilingIteratorType>
99 bool AdvanceToNextTile(TilingIteratorType* iterator);
100 template <typename TilingIteratorType>
101 bool GetFirstTileAndCheckIfValid(TilingIteratorType* iterator);
102
103 Tile* tile_;
104 std::vector<PictureLayerTiling*>* tilings_;
105 WhichTree tree_;
106 TreePriority tree_priority_;
107 bool skip_shared_out_of_order_tiles_;
108 bool skip_all_shared_tiles_;
109 size_t tiling_index_;
110 };
111
112 class VisibleTilingIterator : public OnePriorityRectIterator {
113 public:
114 VisibleTilingIterator() = default;
115 VisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings,
116 WhichTree tree,
117 TreePriority tree_priority,
118 bool skip_shared_out_of_order_tiles,
119 bool skip_all_shared_tiles,
120 bool return_occluded_tiles,
121 bool return_required_for_activation_tiles);
122
123 VisibleTilingIterator& operator++();
124
125 private:
126 bool TileMatchesRequiredFlags(const Tile* tile) const;
127
128 TilingData::Iterator iterator_;
129 bool return_occluded_tiles_;
130 bool return_required_for_activation_tiles_;
131 };
132
133 class SkewportTilingIterator : public OnePriorityRectIterator {
134 public:
135 SkewportTilingIterator() = default;
136 SkewportTilingIterator(std::vector<PictureLayerTiling*>* tilings,
137 WhichTree tree,
138 TreePriority tree_priority,
139 bool skip_shared_out_of_order_tiles,
140 bool skip_all_shared_tiles);
141
142 SkewportTilingIterator& operator++();
143
144 private:
145 TilingData::ReverseSpiralDifferenceIterator iterator_;
146 };
147
148 class SoonBorderTilingIterator : public OnePriorityRectIterator {
149 public:
150 SoonBorderTilingIterator() = default;
151 SoonBorderTilingIterator(std::vector<PictureLayerTiling*>* tilings,
152 WhichTree tree,
153 TreePriority tree_priority,
154 bool skip_shared_out_of_order_tiles,
155 bool skip_all_shared_tiles);
156
157 SoonBorderTilingIterator& operator++();
158
159 private:
160 TilingData::ReverseSpiralDifferenceIterator iterator_;
161 };
162
163 class EventuallyTilingIterator : public OnePriorityRectIterator {
164 public:
165 EventuallyTilingIterator() = default;
166 EventuallyTilingIterator(std::vector<PictureLayerTiling*>* tilings,
167 WhichTree tree,
168 TreePriority tree_priority,
169 bool skip_shared_out_of_order_tiles,
170 bool skip_all_shared_tiles);
171
172 EventuallyTilingIterator& operator++();
173
174 private:
175 TilingData::ReverseSpiralDifferenceIterator iterator_;
176 };
177
178 void AdvancePhase();
179
99 WhichTree tree_; 180 WhichTree tree_;
100 TreePriority tree_priority_; 181 TreePriority tree_priority_;
101 bool skip_all_shared_tiles_; 182 bool skip_all_shared_tiles_;
102 bool skip_shared_out_of_order_tiles_; 183 bool skip_shared_out_of_order_tiles_;
103 bool processing_soon_border_rect_; 184 Phase phase_;
104 bool processing_tiling_with_required_for_activation_tiles_; 185 Tile* current_tile_;
105 size_t tiling_index_with_required_for_activation_tiles_; 186 std::vector<PictureLayerTiling*> tilings_;
106 187
107 TilePriority::PriorityBin current_priority_bin_; 188 EventuallyTilingIterator eventually_iterator_;
108 PictureLayerTiling* current_tiling_; 189 SoonBorderTilingIterator soon_iterator_;
109 size_t current_tiling_index_; 190 SkewportTilingIterator skewport_iterator_;
110 PictureLayerTilingSet::TilingRangeType current_tiling_range_type_; 191 VisibleTilingIterator visible_iterator_;
111 Tile* current_eviction_tile_;
112
113 TilingData::ReverseSpiralDifferenceIterator spiral_iterator_;
114 TilingData::Iterator visible_iterator_;
115 std::vector<Tile*> unoccluded_now_tiles_;
116 }; 192 };
117 193
118 } // namespace cc 194 } // namespace cc
119 195
120 #endif // CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_ 196 #endif // CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698