1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_TILES_TILING_SET_EVICTION_QUEUE_H_
#define CC_TILES_TILING_SET_EVICTION_QUEUE_H_
#include <stddef.h>
#include <vector>
#include "base/memory/raw_ptr_exclusion.h"
#include "cc/cc_export.h"
#include "cc/tiles/picture_layer_tiling_set.h"
#include "cc/tiles/prioritized_tile.h"
namespace cc {
// This eviction queue returned tiles from all tilings in a tiling set in
// the order in which the tiles should be evicted. It can be thought of as the
// following:
// for all phases:
// for all ordered tilings:
// yield the next tile for the given phase from the given tiling
//
// Phases are the following (in order in which they are processed):
// EVENTUALLY_RECT - Tiles in the eventually region of the tiling.
// SOON_BORDER_RECT - Tiles in the prepainting skirt of the tiling.
// SKEWPORT_RECT - Tiles in the skewport of the tiling.
// PENDING_VISIBLE_RECT - Tiles that will be visible upon activation, not
// required for activation.
// PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION - Tiles that will be visible
// upon activation, required for activation.
// VISIBLE_RECT_OCCLUDED - Occluded, not required for activation, visible tiles.
// VISIBLE_RECT_UNOCCLUDED - Unoccluded, not required for activation, visible
// tiles.
// VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED - Occluded, but required for
// activation, visible tiles. This can happen when an active tree tile is
// occluded, but is not occluded on the pending tree (and is required for
// activation).
// VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED - Unoccluded, required for
// activation, tiles.
//
// The tilings are ordered as follows. Suppose we have tilings with the scales
// below:
// 2.0 1.5 1.0(HR) 0.8 0.5 0.25(LR) 0.2 0.1
// With HR referring to high res tiling and LR referring to low res tiling,
// then tilings are processed in this order:
// 2.0 1.5 0.1 0.2 0.5 0.8 0.25(LR) 1.0(HR).
//
// To put it differently:
// 1. Process the highest scale tiling down to, but not including, high res
// tiling.
// 2. Process the lowest scale tiling up to, but not including, the low res
// tiling. In cases without a low res tiling, this is an empty set.
// 3. Process low res tiling up to high res tiling, including neither high
// nor low res tilings. In cases without a low res tiling, this set
// includes all tilings with a lower scale than the high res tiling.
// 4. Process the low res tiling.
// 5. Process the high res tiling.
//
// Additional notes:
// Since eventually the tiles are considered to have the priority which is the
// higher of the two trees, we might visit a tile that should actually be
// returned by its twin. In those situations, the tiles are not returned. That
// is, since the twin has higher priority, it should return it when it gets to
// it. This ensures that we don't block raster because we've returned a tile
// with low priority on one tree, but high combined priority.
class CC_EXPORT TilingSetEvictionQueue {
public:
explicit TilingSetEvictionQueue(PictureLayerTilingSet* tiling_set,
bool is_drawing_layer);
~TilingSetEvictionQueue();
const PrioritizedTile& Top() const;
void Pop();
bool IsEmpty() const;
bool is_drawing_layer() const { return is_drawing_layer_; }
private:
enum Phase {
EVENTUALLY_RECT,
SOON_BORDER_RECT,
SKEWPORT_RECT,
PENDING_VISIBLE_RECT,
PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION,
VISIBLE_RECT_OCCLUDED,
VISIBLE_RECT_UNOCCLUDED,
VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED,
VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED
};
void GenerateTilingOrder(PictureLayerTilingSet* tiling_set);
// Helper base class for individual region iterators.
class EvictionRectIterator {
public:
EvictionRectIterator();
EvictionRectIterator(
std::vector<PictureLayerTiling*>* tilings,
WhichTree tree,
PictureLayerTiling::PriorityRectType priority_rect_type);
bool done() const { return !prioritized_tile_.tile(); }
const PrioritizedTile& operator*() const { return prioritized_tile_; }
protected:
~EvictionRectIterator() = default;
template <typename TilingIteratorType>
bool AdvanceToNextTile(TilingIteratorType* iterator);
template <typename TilingIteratorType>
bool GetFirstTileAndCheckIfValid(TilingIteratorType* iterator);
PrioritizedTile prioritized_tile_;
// `tilings_` is not a raw_ptr<...> for performance reasons (based on
// analysis of sampling profiler data and tab_search:top100:2020).
RAW_PTR_EXCLUSION std::vector<PictureLayerTiling*>* tilings_;
WhichTree tree_;
PictureLayerTiling::PriorityRectType priority_rect_type_;
size_t tiling_index_;
};
class PendingVisibleTilingIterator : public EvictionRectIterator {
public:
PendingVisibleTilingIterator() = default;
PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings,
WhichTree tree,
bool return_required_for_activation_tiles);
PendingVisibleTilingIterator& operator++();
private:
bool TileMatchesRequiredFlags(const PrioritizedTile& tile) const;
TilingData::DifferenceIterator iterator_;
bool return_required_for_activation_tiles_;
};
class VisibleTilingIterator : public EvictionRectIterator {
public:
VisibleTilingIterator() = default;
VisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings,
WhichTree tree,
bool return_occluded_tiles,
bool return_required_for_activation_tiles);
VisibleTilingIterator& operator++();
private:
bool TileMatchesRequiredFlags(const PrioritizedTile& tile) const;
TilingData::Iterator iterator_;
bool return_occluded_tiles_;
bool return_required_for_activation_tiles_;
};
class SkewportTilingIterator : public EvictionRectIterator {
public:
SkewportTilingIterator() = default;
SkewportTilingIterator(std::vector<PictureLayerTiling*>* tilings,
WhichTree tree);
SkewportTilingIterator& operator++();
private:
TilingData::ReverseSpiralDifferenceIterator iterator_;
};
class SoonBorderTilingIterator : public EvictionRectIterator {
public:
SoonBorderTilingIterator() = default;
SoonBorderTilingIterator(std::vector<PictureLayerTiling*>* tilings,
WhichTree tree);
SoonBorderTilingIterator& operator++();
private:
TilingData::ReverseSpiralDifferenceIterator iterator_;
};
class EventuallyTilingIterator : public EvictionRectIterator {
public:
EventuallyTilingIterator() = default;
EventuallyTilingIterator(std::vector<PictureLayerTiling*>* tilings,
WhichTree tree);
EventuallyTilingIterator& operator++();
private:
TilingData::ReverseSpiralDifferenceIterator iterator_;
};
void AdvancePhase();
WhichTree tree_;
Phase phase_;
PrioritizedTile current_tile_;
std::vector<PictureLayerTiling*> tilings_;
EventuallyTilingIterator eventually_iterator_;
SoonBorderTilingIterator soon_iterator_;
SkewportTilingIterator skewport_iterator_;
PendingVisibleTilingIterator pending_visible_iterator_;
VisibleTilingIterator visible_iterator_;
bool is_drawing_layer_;
};
} // namespace cc
#endif // CC_TILES_TILING_SET_EVICTION_QUEUE_H_
|