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 "cc/base/cc_export.h" | 8 #include "cc/base/cc_export.h" |
9 #include "cc/resources/picture_layer_tiling_set.h" | 9 #include "cc/resources/picture_layer_tiling_set.h" |
10 #include "cc/resources/tile.h" | 10 #include "cc/resources/tile.h" |
11 #include "cc/resources/tile_priority.h" | 11 #include "cc/resources/tile_priority.h" |
12 | 12 |
13 namespace cc { | 13 namespace cc { |
14 | 14 |
15 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION | 15 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION |
16 // and LOW_RESOLUTION tilings. | 16 // and LOW_RESOLUTION tilings. |
17 class CC_EXPORT TilingSetRasterQueueAll { | 17 class CC_EXPORT TilingSetRasterQueueAll { |
18 public: | 18 public: |
19 TilingSetRasterQueueAll(PictureLayerTilingSet* tiling_set, | 19 TilingSetRasterQueueAll(PictureLayerTilingSet* tiling_set, |
20 bool prioritize_low_res); | 20 bool prioritize_low_res); |
21 ~TilingSetRasterQueueAll(); | 21 ~TilingSetRasterQueueAll(); |
22 | 22 |
23 Tile* Top(); | 23 Tile* Top(); |
24 const Tile* Top() const; | 24 const Tile* Top() const; |
25 void Pop(); | 25 void Pop(); |
26 bool IsEmpty() const; | 26 bool IsEmpty() const; |
27 | 27 |
28 private: | 28 private: |
| 29 // Helper base class for individual region iterators. |
| 30 class OnePriorityRectIterator { |
| 31 public: |
| 32 OnePriorityRectIterator(); |
| 33 OnePriorityRectIterator(PictureLayerTiling* tiling, |
| 34 TilingData* tiling_data); |
| 35 |
| 36 bool done() const { return !tile_; } |
| 37 Tile* operator*() const { return tile_; } |
| 38 |
| 39 protected: |
| 40 ~OnePriorityRectIterator() = default; |
| 41 bool TileNeedsRaster(Tile* tile) const { |
| 42 return tile->NeedsRaster() && !tiling_->IsTileOccluded(tile); |
| 43 } |
| 44 |
| 45 template <typename TilingIteratorType> |
| 46 void AdvanceToNextTile(TilingIteratorType* iterator); |
| 47 template <typename TilingIteratorType> |
| 48 bool GetFirstTileAndCheckIfValid(TilingIteratorType* iterator); |
| 49 |
| 50 Tile* tile_; |
| 51 PictureLayerTiling* tiling_; |
| 52 TilingData* tiling_data_; |
| 53 }; |
| 54 |
| 55 // Iterates over visible rect only, left to right top to bottom order. |
| 56 class VisibleTilingIterator : public OnePriorityRectIterator { |
| 57 public: |
| 58 VisibleTilingIterator() = default; |
| 59 VisibleTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data); |
| 60 |
| 61 VisibleTilingIterator& operator++(); |
| 62 |
| 63 private: |
| 64 TilingData::Iterator iterator_; |
| 65 }; |
| 66 |
| 67 // Iterates over skewport only, spiral around the visible rect. |
| 68 class SkewportTilingIterator : public OnePriorityRectIterator { |
| 69 public: |
| 70 SkewportTilingIterator() = default; |
| 71 SkewportTilingIterator(PictureLayerTiling* tiling, TilingData* tiling_data); |
| 72 |
| 73 SkewportTilingIterator& operator++(); |
| 74 |
| 75 private: |
| 76 TilingData::SpiralDifferenceIterator iterator_; |
| 77 }; |
| 78 |
| 79 // Iterates over soon border only, spiral around the visible rect. |
| 80 class SoonBorderTilingIterator : public OnePriorityRectIterator { |
| 81 public: |
| 82 SoonBorderTilingIterator() = default; |
| 83 SoonBorderTilingIterator(PictureLayerTiling* tiling, |
| 84 TilingData* tiling_data); |
| 85 |
| 86 SoonBorderTilingIterator& operator++(); |
| 87 |
| 88 private: |
| 89 TilingData::SpiralDifferenceIterator iterator_; |
| 90 }; |
| 91 |
| 92 // Iterates over eventually rect only, spiral around the soon rect. |
| 93 class EventuallyTilingIterator : public OnePriorityRectIterator { |
| 94 public: |
| 95 EventuallyTilingIterator() = default; |
| 96 EventuallyTilingIterator(PictureLayerTiling* tiling, |
| 97 TilingData* tiling_data); |
| 98 |
| 99 EventuallyTilingIterator& operator++(); |
| 100 |
| 101 private: |
| 102 TilingData::SpiralDifferenceIterator iterator_; |
| 103 }; |
| 104 |
| 105 // Iterates over all of the above phases in the following order: visible, |
| 106 // skewport, soon border, eventually. |
29 class TilingIterator { | 107 class TilingIterator { |
30 public: | 108 public: |
31 TilingIterator(); | 109 TilingIterator(); |
32 explicit TilingIterator(PictureLayerTiling* tiling, | 110 explicit TilingIterator(PictureLayerTiling* tiling, |
33 TilingData* tiling_data); | 111 TilingData* tiling_data); |
34 ~TilingIterator(); | 112 ~TilingIterator() = default; |
35 | 113 |
36 bool done() const { return current_tile_ == nullptr; } | 114 bool done() const { return current_tile_ == nullptr; } |
37 const Tile* operator*() const { return current_tile_; } | 115 const Tile* operator*() const { return current_tile_; } |
38 Tile* operator*() { return current_tile_; } | 116 Tile* operator*() { return current_tile_; } |
39 TilePriority::PriorityBin type() const { | 117 TilePriority::PriorityBin type() const { |
40 switch (phase_) { | 118 switch (phase_) { |
41 case VISIBLE_RECT: | 119 case VISIBLE_RECT: |
42 return TilePriority::NOW; | 120 return TilePriority::NOW; |
43 case SKEWPORT_RECT: | 121 case SKEWPORT_RECT: |
44 case SOON_BORDER_RECT: | 122 case SOON_BORDER_RECT: |
45 return TilePriority::SOON; | 123 return TilePriority::SOON; |
46 case EVENTUALLY_RECT: | 124 case EVENTUALLY_RECT: |
47 return TilePriority::EVENTUALLY; | 125 return TilePriority::EVENTUALLY; |
48 } | 126 } |
49 NOTREACHED(); | 127 NOTREACHED(); |
50 return TilePriority::EVENTUALLY; | 128 return TilePriority::EVENTUALLY; |
51 } | 129 } |
52 | 130 |
53 TilingIterator& operator++(); | 131 TilingIterator& operator++(); |
54 | 132 |
55 private: | 133 private: |
56 enum Phase { | 134 enum Phase { |
57 VISIBLE_RECT, | 135 VISIBLE_RECT, |
58 SKEWPORT_RECT, | 136 SKEWPORT_RECT, |
59 SOON_BORDER_RECT, | 137 SOON_BORDER_RECT, |
60 EVENTUALLY_RECT | 138 EVENTUALLY_RECT |
61 }; | 139 }; |
62 | 140 |
63 void AdvancePhase(); | 141 void AdvancePhase(); |
64 bool TileNeedsRaster(Tile* tile) const { | |
65 return tile->NeedsRaster() && !tiling_->IsTileOccluded(tile); | |
66 } | |
67 | 142 |
68 PictureLayerTiling* tiling_; | 143 PictureLayerTiling* tiling_; |
69 TilingData* tiling_data_; | 144 TilingData* tiling_data_; |
70 | 145 |
71 Phase phase_; | 146 Phase phase_; |
72 | 147 |
73 Tile* current_tile_; | 148 Tile* current_tile_; |
74 TilingData::Iterator visible_iterator_; | 149 VisibleTilingIterator visible_iterator_; |
75 TilingData::SpiralDifferenceIterator spiral_iterator_; | 150 SkewportTilingIterator skewport_iterator_; |
| 151 SoonBorderTilingIterator soon_border_iterator_; |
| 152 EventuallyTilingIterator eventually_iterator_; |
76 }; | 153 }; |
77 | 154 |
78 enum IteratorType { LOW_RES, HIGH_RES, NUM_ITERATORS }; | 155 enum IteratorType { LOW_RES, HIGH_RES, NUM_ITERATORS }; |
79 | 156 |
80 void AdvanceToNextStage(); | 157 void AdvanceToNextStage(); |
81 | 158 |
82 PictureLayerTilingSet* tiling_set_; | 159 PictureLayerTilingSet* tiling_set_; |
83 | 160 |
84 struct IterationStage { | 161 struct IterationStage { |
85 IteratorType iterator_type; | 162 IteratorType iterator_type; |
86 TilePriority::PriorityBin tile_type; | 163 TilePriority::PriorityBin tile_type; |
87 }; | 164 }; |
88 | 165 |
89 size_t current_stage_; | 166 size_t current_stage_; |
90 | 167 |
91 // One low res stage, and three high res stages. | 168 // One low res stage, and three high res stages. |
92 IterationStage stages_[4]; | 169 IterationStage stages_[4]; |
93 TilingIterator iterators_[NUM_ITERATORS]; | 170 TilingIterator iterators_[NUM_ITERATORS]; |
94 }; | 171 }; |
95 | 172 |
96 } // namespace cc | 173 } // namespace cc |
97 | 174 |
98 #endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ | 175 #endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_ |
OLD | NEW |