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
3 // found in the LICENSE file.
5 #ifndef CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_
6 #define CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_
8 #include "base/containers/stack_container.h"
9 #include "cc/base/cc_export.h"
10 #include "cc/resources/picture_layer_tiling_set.h"
11 #include "cc/resources/tile.h"
12 #include "cc/resources/tile_priority.h"
16 // This queue returns all tiles required to be rasterized from HIGH_RESOLUTION
17 // and LOW_RESOLUTION tilings.
18 class CC_EXPORT TilingSetRasterQueueAll
{
20 TilingSetRasterQueueAll(PictureLayerTilingSet
* tiling_set
,
21 bool prioritize_low_res
);
22 ~TilingSetRasterQueueAll();
25 const Tile
* Top() const;
30 // Helper base class for individual region iterators.
31 class OnePriorityRectIterator
{
33 OnePriorityRectIterator();
34 OnePriorityRectIterator(PictureLayerTiling
* tiling
,
35 TilingData
* tiling_data
);
37 bool done() const { return !tile_
; }
38 Tile
* operator*() const { return tile_
; }
41 ~OnePriorityRectIterator() = default;
42 bool TileNeedsRaster(Tile
* tile
) const {
43 return tile
->NeedsRaster() && !tiling_
->IsTileOccluded(tile
);
46 template <typename TilingIteratorType
>
47 void AdvanceToNextTile(TilingIteratorType
* iterator
);
48 template <typename TilingIteratorType
>
49 bool GetFirstTileAndCheckIfValid(TilingIteratorType
* iterator
);
52 PictureLayerTiling
* tiling_
;
53 TilingData
* tiling_data_
;
56 // Iterates over visible rect only, left to right top to bottom order.
57 class VisibleTilingIterator
: public OnePriorityRectIterator
{
59 VisibleTilingIterator() = default;
60 VisibleTilingIterator(PictureLayerTiling
* tiling
, TilingData
* tiling_data
);
62 VisibleTilingIterator
& operator++();
65 TilingData::Iterator iterator_
;
68 class PendingVisibleTilingIterator
: public OnePriorityRectIterator
{
70 PendingVisibleTilingIterator() = default;
71 PendingVisibleTilingIterator(PictureLayerTiling
* tiling
,
72 TilingData
* tiling_data
);
74 PendingVisibleTilingIterator
& operator++();
77 TilingData::DifferenceIterator iterator_
;
80 // Iterates over skewport only, spiral around the visible rect.
81 class SkewportTilingIterator
: public OnePriorityRectIterator
{
83 SkewportTilingIterator() = default;
84 SkewportTilingIterator(PictureLayerTiling
* tiling
, TilingData
* tiling_data
);
86 SkewportTilingIterator
& operator++();
89 TilingData::SpiralDifferenceIterator iterator_
;
90 gfx::Rect pending_visible_rect_
;
93 // Iterates over soon border only, spiral around the visible rect.
94 class SoonBorderTilingIterator
: public OnePriorityRectIterator
{
96 SoonBorderTilingIterator() = default;
97 SoonBorderTilingIterator(PictureLayerTiling
* tiling
,
98 TilingData
* tiling_data
);
100 SoonBorderTilingIterator
& operator++();
103 TilingData::SpiralDifferenceIterator iterator_
;
104 gfx::Rect pending_visible_rect_
;
107 // Iterates over eventually rect only, spiral around the soon rect.
108 class EventuallyTilingIterator
: public OnePriorityRectIterator
{
110 EventuallyTilingIterator() = default;
111 EventuallyTilingIterator(PictureLayerTiling
* tiling
,
112 TilingData
* tiling_data
);
114 EventuallyTilingIterator
& operator++();
117 TilingData::SpiralDifferenceIterator iterator_
;
118 gfx::Rect pending_visible_rect_
;
121 // Iterates over all of the above phases in the following order: visible,
122 // skewport, soon border, eventually.
123 class TilingIterator
{
126 explicit TilingIterator(PictureLayerTiling
* tiling
,
127 TilingData
* tiling_data
);
130 bool done() const { return current_tile_
== nullptr; }
131 const Tile
* operator*() const { return current_tile_
; }
132 Tile
* operator*() { return current_tile_
; }
133 TilePriority::PriorityBin
type() const {
136 return TilePriority::NOW
;
137 case PENDING_VISIBLE_RECT
:
139 case SOON_BORDER_RECT
:
140 return TilePriority::SOON
;
141 case EVENTUALLY_RECT
:
142 return TilePriority::EVENTUALLY
;
145 return TilePriority::EVENTUALLY
;
148 TilingIterator
& operator++();
151 // PENDING VISIBLE RECT refers to the visible rect that will become current
152 // upon activation (ie, the pending tree's visible rect). Tiles in this
153 // region that are not part of the current visible rect are all handled
154 // here. Note that when processing a pending tree, this rect is the same as
155 // the visible rect so no tiles are processed in this case.
158 PENDING_VISIBLE_RECT
,
166 PictureLayerTiling
* tiling_
;
167 TilingData
* tiling_data_
;
172 VisibleTilingIterator visible_iterator_
;
173 PendingVisibleTilingIterator pending_visible_iterator_
;
174 SkewportTilingIterator skewport_iterator_
;
175 SoonBorderTilingIterator soon_border_iterator_
;
176 EventuallyTilingIterator eventually_iterator_
;
182 ACTIVE_NON_IDEAL_PENDING_HIGH_RES
,
186 void AdvanceToNextStage();
188 PictureLayerTilingSet
* tiling_set_
;
190 struct IterationStage
{
191 IterationStage(IteratorType type
, TilePriority::PriorityBin bin
);
192 IteratorType iterator_type
;
193 TilePriority::PriorityBin tile_type
;
196 size_t current_stage_
;
198 // The max number of stages is 6: 1 low res, 3 high res, and 2 active non
199 // ideal pending high res.
200 base::StackVector
<IterationStage
, 6> stages_
;
201 TilingIterator iterators_
[NUM_ITERATORS
];
206 #endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_ALL_H_