1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/tiles/tiles_with_resource_iterator.h"
7 #include "cc/layers/picture_layer_impl.h"
8 #include "cc/tiles/picture_layer_tiling_set.h"
12 TilesWithResourceIterator::TilesWithResourceIterator(
13 const std::vector<PictureLayerImpl*>* picture_layers,
14 const std::vector<PictureLayerImpl*>* secondary_picture_layers)
15 : picture_layers_(picture_layers),
16 secondary_picture_layers_(secondary_picture_layers),
17 active_layers_(picture_layers) {
18 FindNextInPictureLayers();
21 TilesWithResourceIterator::~TilesWithResourceIterator() = default;
23 bool TilesWithResourceIterator::AtEnd() const {
24 return !tile_iterator_.has_value();
27 Tile* TilesWithResourceIterator::GetCurrent() {
28 return AtEnd() ? nullptr : tile_iterator_->GetCurrent();
31 PrioritizedTile* TilesWithResourceIterator::GetCurrentAsPrioritizedTile() {
32 if (prioritized_tile_)
33 return &*prioritized_tile_;
34 Tile* tile = GetCurrent();
37 PictureLayerTiling* tiling = CurrentPictureLayerTiling();
38 prioritized_tile_ = tiling->MakePrioritizedTile(
39 tile, tiling->ComputePriorityRectTypeForTile(tile),
40 tiling->IsTileOccluded(tile));
41 return &*prioritized_tile_;
44 bool TilesWithResourceIterator::IsCurrentTileOccluded() {
45 Tile* tile = GetCurrent();
46 return tile && tile->tiling()->IsTileOccluded(tile);
49 void TilesWithResourceIterator::Next() {
52 prioritized_tile_.reset();
53 DCHECK(tile_iterator_);
54 tile_iterator_->Next();
55 if (FindNextInTileIterator())
57 ++current_picture_layer_tiling_index_;
58 if (FindNextInPictureLayerTilingSet())
60 ++current_picture_layer_index_;
61 if (FindNextInPictureLayers())
67 bool TilesWithResourceIterator::FindNextInPictureLayers() {
68 if (FindNextInActiveLayers())
71 if (is_active_layers_secondary_layers_)
73 // Finished iterating through primary picture layers. Start iterating
74 // through secondary layers.
75 is_active_layers_secondary_layers_ = true;
76 active_layers_ = secondary_picture_layers_;
79 current_picture_layer_index_ = 0;
80 return FindNextInActiveLayers();
83 bool TilesWithResourceIterator::FindNextInActiveLayers() {
84 for (; current_picture_layer_index_ < active_layers_->size();
85 ++current_picture_layer_index_) {
86 current_picture_layer_tiling_index_ = 0u;
87 if (FindNextInPictureLayerTilingSet())
90 // No more tiles to look at. Reset `tile_iterator_` so that AtEnd() returns
92 tile_iterator_.reset();
96 bool TilesWithResourceIterator::FindNextInPictureLayerTilingSet() {
97 PictureLayerTilingSet* tiling_set = CurrentPictureLayerTilingSet();
98 for (; current_picture_layer_tiling_index_ < tiling_set->num_tilings();
99 ++current_picture_layer_tiling_index_) {
100 tile_iterator_.emplace(CurrentPictureLayerTiling());
101 if (FindNextInTileIterator())
103 ++current_picture_layer_tiling_index_;
108 bool TilesWithResourceIterator::FindNextInTileIterator() {
109 for (; !tile_iterator_->AtEnd(); tile_iterator_->Next()) {
110 Tile* tile = tile_iterator_->GetCurrent();
111 if (visited_.insert(tile).second && tile->draw_info().has_resource())
117 PictureLayerTilingSet*
118 TilesWithResourceIterator::CurrentPictureLayerTilingSet() {
119 return (*active_layers_)[current_picture_layer_index_]
120 ->picture_layer_tiling_set();
123 PictureLayerTiling* TilesWithResourceIterator::CurrentPictureLayerTiling() {
124 return CurrentPictureLayerTilingSet()->tiling_at(
125 current_picture_layer_tiling_index_);