[M108 Migration][VD] Avoid pending frame counter becoming negative
[platform/framework/web/chromium-efl.git] / cc / tiles / tiles_with_resource_iterator.cc
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.
4
5 #include "cc/tiles/tiles_with_resource_iterator.h"
6
7 #include "cc/layers/picture_layer_impl.h"
8 #include "cc/tiles/picture_layer_tiling_set.h"
9
10 namespace cc {
11
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();
19 }
20
21 TilesWithResourceIterator::~TilesWithResourceIterator() = default;
22
23 bool TilesWithResourceIterator::AtEnd() const {
24   return !tile_iterator_.has_value();
25 }
26
27 Tile* TilesWithResourceIterator::GetCurrent() {
28   return AtEnd() ? nullptr : tile_iterator_->GetCurrent();
29 }
30
31 PrioritizedTile* TilesWithResourceIterator::GetCurrentAsPrioritizedTile() {
32   if (prioritized_tile_)
33     return &*prioritized_tile_;
34   Tile* tile = GetCurrent();
35   if (!tile)
36     return nullptr;
37   PictureLayerTiling* tiling = CurrentPictureLayerTiling();
38   prioritized_tile_ = tiling->MakePrioritizedTile(
39       tile, tiling->ComputePriorityRectTypeForTile(tile),
40       tiling->IsTileOccluded(tile));
41   return &*prioritized_tile_;
42 }
43
44 bool TilesWithResourceIterator::IsCurrentTileOccluded() {
45   Tile* tile = GetCurrent();
46   return tile && tile->tiling()->IsTileOccluded(tile);
47 }
48
49 void TilesWithResourceIterator::Next() {
50   if (AtEnd())
51     return;
52   prioritized_tile_.reset();
53   DCHECK(tile_iterator_);
54   tile_iterator_->Next();
55   if (FindNextInTileIterator())
56     return;
57   ++current_picture_layer_tiling_index_;
58   if (FindNextInPictureLayerTilingSet())
59     return;
60   ++current_picture_layer_index_;
61   if (FindNextInPictureLayers())
62     return;
63   // At the end.
64   DCHECK(AtEnd());
65 }
66
67 bool TilesWithResourceIterator::FindNextInPictureLayers() {
68   if (FindNextInActiveLayers())
69     return true;
70   DCHECK(AtEnd());
71   if (is_active_layers_secondary_layers_)
72     return false;
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_;
77   if (!active_layers_)
78     return false;
79   current_picture_layer_index_ = 0;
80   return FindNextInActiveLayers();
81 }
82
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())
88       return true;
89   }
90   // No more tiles to look at. Reset `tile_iterator_` so that AtEnd() returns
91   // true.
92   tile_iterator_.reset();
93   return false;
94 }
95
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())
102       return true;
103     ++current_picture_layer_tiling_index_;
104   }
105   return false;
106 }
107
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())
112       return true;
113   }
114   return false;
115 }
116
117 PictureLayerTilingSet*
118 TilesWithResourceIterator::CurrentPictureLayerTilingSet() {
119   return (*active_layers_)[current_picture_layer_index_]
120       ->picture_layer_tiling_set();
121 }
122
123 PictureLayerTiling* TilesWithResourceIterator::CurrentPictureLayerTiling() {
124   return CurrentPictureLayerTilingSet()->tiling_at(
125       current_picture_layer_tiling_index_);
126 }
127
128 }  // namespace cc