#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 {
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);
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_;
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_;
};
}
#endif