Commit e03dc01d authored by vmpstr@chromium.org's avatar vmpstr@chromium.org

cc: Remove vectors from tiling eviction tile iterator.

This patch removes vectors from the eviction tile
iterator at the layer level. It reworks the code
a bit to use the underlying layer's tilings
directly using indecies and ranges, instead of
constructing a separate vector to hold the
values.

As well, this ensures that the iterators
are only created when they are visited.


R=reveman

Review URL: https://codereview.chromium.org/428533008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@287688 0039d316-1c4b-4281-b951-d872f2087c98
parent 61949f62
...@@ -1550,135 +1550,200 @@ const Tile* PictureLayerImpl::LayerRasterTileIterator::operator*() const { ...@@ -1550,135 +1550,200 @@ const Tile* PictureLayerImpl::LayerRasterTileIterator::operator*() const {
} }
PictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator() PictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator()
: iterator_index_(0), : current_range_offset_(0),
iteration_stage_(TilePriority::EVENTUALLY), current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
required_for_activation_(false), current_stage_(EVENTUALLY),
layer_(NULL) {} tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES),
layer_(NULL) {
}
PictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator( PictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator(
PictureLayerImpl* layer, PictureLayerImpl* layer,
TreePriority tree_priority) TreePriority tree_priority)
: iterator_index_(0), : current_range_offset_(0),
iteration_stage_(TilePriority::EVENTUALLY), current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
required_for_activation_(false), current_stage_(EVENTUALLY),
tree_priority_(tree_priority),
layer_(layer) { layer_(layer) {
// Early out if the layer has no tilings. // Early out if the tilings_ object doesn't exist.
// TODO(vmpstr): Once tile priorities are determined by the iterators, ensure // TODO(vmpstr): Once tile priorities are determined by the iterators, ensure
// that layers that don't have valid tile priorities have lowest priorities so // that layers that don't have valid tile priorities have lowest priorities so
// they evict their tiles first (crbug.com/381704) // they evict their tiles first (crbug.com/381704)
if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) if (!layer_->tilings_)
return; return;
size_t high_res_tiling_index = layer_->tilings_->num_tilings(); if (!CurrentRange().IsIndexWithinRange(CurrentTilingIndex()))
size_t low_res_tiling_index = layer_->tilings_->num_tilings(); AdvanceRange();
for (size_t i = 0; i < layer_->tilings_->num_tilings(); ++i) {
PictureLayerTiling* tiling = layer_->tilings_->tiling_at(i);
if (tiling->resolution() == HIGH_RESOLUTION)
high_res_tiling_index = i;
else if (tiling->resolution() == LOW_RESOLUTION)
low_res_tiling_index = i;
}
iterators_.reserve(layer_->tilings_->num_tilings());
// Higher resolution non-ideal goes first. iterator_ = PictureLayerTiling::TilingEvictionTileIterator(
for (size_t i = 0; i < high_res_tiling_index; ++i) { layer_->tilings_->tiling_at(CurrentTilingIndex()),
iterators_.push_back(PictureLayerTiling::TilingEvictionTileIterator( tree_priority,
layer_->tilings_->tiling_at(i), tree_priority)); PriorityBinFromIterationStage(current_stage_),
} RequiredForActivationFromIterationStage(current_stage_));
// Lower resolution non-ideal goes next.
for (size_t i = layer_->tilings_->num_tilings() - 1;
i > high_res_tiling_index;
--i) {
PictureLayerTiling* tiling = layer_->tilings_->tiling_at(i);
if (tiling->resolution() == LOW_RESOLUTION)
continue;
iterators_.push_back( if (!iterator_)
PictureLayerTiling::TilingEvictionTileIterator(tiling, tree_priority));
}
// Now, put the low res tiling if we have one.
if (low_res_tiling_index < layer_->tilings_->num_tilings()) {
iterators_.push_back(PictureLayerTiling::TilingEvictionTileIterator(
layer_->tilings_->tiling_at(low_res_tiling_index), tree_priority));
}
// Finally, put the high res tiling if we have one.
if (high_res_tiling_index < layer_->tilings_->num_tilings()) {
iterators_.push_back(PictureLayerTiling::TilingEvictionTileIterator(
layer_->tilings_->tiling_at(high_res_tiling_index), tree_priority));
}
DCHECK_GT(iterators_.size(), 0u);
if (!iterators_[iterator_index_] ||
!IsCorrectType(&iterators_[iterator_index_])) {
AdvanceToNextIterator(); AdvanceToNextIterator();
}
} }
PictureLayerImpl::LayerEvictionTileIterator::~LayerEvictionTileIterator() {} PictureLayerImpl::LayerEvictionTileIterator::~LayerEvictionTileIterator() {
}
Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() { Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() {
DCHECK(*this); DCHECK(*this);
return *iterators_[iterator_index_]; return *iterator_;
} }
const Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() const { const Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() const {
DCHECK(*this); DCHECK(*this);
return *iterators_[iterator_index_]; return *iterator_;
} }
PictureLayerImpl::LayerEvictionTileIterator& PictureLayerImpl::LayerEvictionTileIterator&
PictureLayerImpl::LayerEvictionTileIterator:: PictureLayerImpl::LayerEvictionTileIterator::
operator++() { operator++() {
DCHECK(*this); DCHECK(*this);
++iterators_[iterator_index_]; ++iterator_;
if (!iterators_[iterator_index_] ||
!IsCorrectType(&iterators_[iterator_index_])) { if (!iterator_)
AdvanceToNextIterator(); AdvanceToNextIterator();
}
return *this; return *this;
} }
void PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextIterator() { void PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextIterator() {
++iterator_index_; DCHECK(!iterator_);
while (!iterator_) {
bool success = AdvanceTiling();
if (!success)
success = AdvanceRange();
if (!success)
success = AdvanceStage();
if (!success)
break;
while (true) { iterator_ = PictureLayerTiling::TilingEvictionTileIterator(
while (iterator_index_ < iterators_.size()) { layer_->tilings_->tiling_at(CurrentTilingIndex()),
if (iterators_[iterator_index_] && tree_priority_,
IsCorrectType(&iterators_[iterator_index_])) { PriorityBinFromIterationStage(current_stage_),
return; RequiredForActivationFromIterationStage(current_stage_));
} }
++iterator_index_; }
bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceTiling() {
DCHECK(CurrentRange().IsIndexWithinRange(CurrentTilingIndex()));
++current_range_offset_;
return CurrentRange().IsIndexWithinRange(CurrentTilingIndex());
}
bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceRange() {
DCHECK(!CurrentRange().IsIndexWithinRange(CurrentTilingIndex()));
bool wrapped_around = false;
while (!CurrentRange().IsIndexWithinRange(CurrentTilingIndex())) {
switch (current_tiling_range_type_) {
case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
current_tiling_range_type_ = PictureLayerTilingSet::LOWER_THAN_LOW_RES;
break;
case PictureLayerTilingSet::LOWER_THAN_LOW_RES:
current_tiling_range_type_ =
PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES;
break;
case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
current_tiling_range_type_ = PictureLayerTilingSet::LOW_RES;
break;
case PictureLayerTilingSet::LOW_RES:
current_tiling_range_type_ = PictureLayerTilingSet::HIGH_RES;
break;
case PictureLayerTilingSet::HIGH_RES:
current_tiling_range_type_ =
PictureLayerTilingSet::HIGHER_THAN_HIGH_RES;
wrapped_around = true;
break;
} }
current_range_offset_ = 0;
}
// If we wrapped around the ranges, we need to indicate that we should advance
// the stage.
return !wrapped_around;
}
TilePriority::PriorityBin
PictureLayerImpl::LayerEvictionTileIterator::PriorityBinFromIterationStage(
IterationStage stage) {
switch (stage) {
case EVENTUALLY:
case EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION:
return TilePriority::EVENTUALLY;
case SOON:
case SOON_AND_REQUIRED_FOR_ACTIVATION:
return TilePriority::SOON;
case NOW:
case NOW_AND_REQUIRED_FOR_ACTIVATION:
return TilePriority::NOW;
}
NOTREACHED();
return TilePriority::EVENTUALLY;
}
bool PictureLayerImpl::LayerEvictionTileIterator::
RequiredForActivationFromIterationStage(IterationStage stage) {
switch (stage) {
case EVENTUALLY:
case SOON:
case NOW:
return false;
case EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION:
case SOON_AND_REQUIRED_FOR_ACTIVATION:
case NOW_AND_REQUIRED_FOR_ACTIVATION:
return true;
}
NOTREACHED();
return false;
}
// If we're NOW and required_for_activation, then this was the last pass PictureLayerTilingSet::TilingRange
// through the iterators. PictureLayerImpl::LayerEvictionTileIterator::CurrentRange() {
if (iteration_stage_ == TilePriority::NOW && required_for_activation_) return layer_->tilings_->GetTilingRange(current_tiling_range_type_);
break; }
if (!required_for_activation_) { int PictureLayerImpl::LayerEvictionTileIterator::CurrentTilingIndex() {
required_for_activation_ = true; const PictureLayerTilingSet::TilingRange& range = CurrentRange();
} else { switch (current_tiling_range_type_) {
required_for_activation_ = false; case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
iteration_stage_ = case PictureLayerTilingSet::LOW_RES:
static_cast<TilePriority::PriorityBin>(iteration_stage_ - 1); case PictureLayerTilingSet::HIGH_RES:
} return range.start + current_range_offset_;
iterator_index_ = 0; case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
case PictureLayerTilingSet::LOWER_THAN_LOW_RES:
return static_cast<int>(range.end) - 1 - current_range_offset_;
} }
NOTREACHED();
return 0;
} }
PictureLayerImpl::LayerEvictionTileIterator::operator bool() const { bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceStage() {
return iterator_index_ < iterators_.size(); switch (current_stage_) {
case EVENTUALLY:
current_stage_ = EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION;
break;
case EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION:
current_stage_ = SOON;
break;
case SOON:
current_stage_ = SOON_AND_REQUIRED_FOR_ACTIVATION;
break;
case SOON_AND_REQUIRED_FOR_ACTIVATION:
current_stage_ = NOW;
break;
case NOW:
current_stage_ = NOW_AND_REQUIRED_FOR_ACTIVATION;
break;
case NOW_AND_REQUIRED_FOR_ACTIVATION:
return false;
}
return true;
} }
bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( PictureLayerImpl::LayerEvictionTileIterator::operator bool() const {
PictureLayerTiling::TilingEvictionTileIterator* it) const { return !!iterator_;
return it->get_type() == iteration_stage_ &&
(**it)->required_for_activation() == required_for_activation_;
} }
} // namespace cc } // namespace cc
...@@ -77,15 +77,33 @@ class CC_EXPORT PictureLayerImpl ...@@ -77,15 +77,33 @@ class CC_EXPORT PictureLayerImpl
operator bool() const; operator bool() const;
private: private:
enum IterationStage {
EVENTUALLY,
EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION,
SOON,
SOON_AND_REQUIRED_FOR_ACTIVATION,
NOW,
NOW_AND_REQUIRED_FOR_ACTIVATION
};
TilePriority::PriorityBin PriorityBinFromIterationStage(
IterationStage stage);
bool RequiredForActivationFromIterationStage(IterationStage stage);
PictureLayerTilingSet::TilingRange CurrentRange();
int CurrentTilingIndex();
void AdvanceToNextIterator(); void AdvanceToNextIterator();
bool IsCorrectType( bool AdvanceTiling();
PictureLayerTiling::TilingEvictionTileIterator* it) const; bool AdvanceRange();
bool AdvanceStage();
std::vector<PictureLayerTiling::TilingEvictionTileIterator> iterators_; PictureLayerTiling::TilingEvictionTileIterator iterator_;
size_t iterator_index_; int current_range_offset_;
TilePriority::PriorityBin iteration_stage_; PictureLayerTilingSet::TilingRangeType current_tiling_range_type_;
bool required_for_activation_; IterationStage current_stage_;
TreePriority tree_priority_;
PictureLayerImpl* layer_; PictureLayerImpl* layer_;
}; };
......
...@@ -845,17 +845,48 @@ void PictureLayerTiling::UpdateEvictionCacheIfNeeded( ...@@ -845,17 +845,48 @@ void PictureLayerTiling::UpdateEvictionCacheIfNeeded(
eviction_cache_tree_priority_ == tree_priority) eviction_cache_tree_priority_ == tree_priority)
return; return;
eviction_tiles_cache_.clear(); eventually_eviction_tiles_.clear();
eviction_tiles_cache_.reserve(tiles_.size()); soon_eviction_tiles_.clear();
now_required_for_activation_eviction_tiles_.clear();
now_not_required_for_activation_eviction_tiles_.clear();
for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
// TODO(vmpstr): This should update the priority if UpdateTilePriorities // TODO(vmpstr): This should update the priority if UpdateTilePriorities
// changes not to do this. // changes not to do this.
eviction_tiles_cache_.push_back(it->second); Tile* tile = it->second;
const TilePriority& priority =
tile->priority_for_tree_priority(tree_priority);
switch (priority.priority_bin) {
case TilePriority::EVENTUALLY:
eventually_eviction_tiles_.push_back(tile);
break;
case TilePriority::SOON:
soon_eviction_tiles_.push_back(tile);
break;
case TilePriority::NOW:
if (tile->required_for_activation())
now_required_for_activation_eviction_tiles_.push_back(tile);
else
now_not_required_for_activation_eviction_tiles_.push_back(tile);
break;
}
} }
std::sort(eviction_tiles_cache_.begin(), // TODO(vmpstr): Do this lazily. One option is to have a "sorted" flag that
eviction_tiles_cache_.end(), // can be updated for each of the queues.
TileEvictionOrder(tree_priority)); TileEvictionOrder sort_order(tree_priority);
std::sort(eventually_eviction_tiles_.begin(),
eventually_eviction_tiles_.end(),
sort_order);
std::sort(
soon_eviction_tiles_.begin(), soon_eviction_tiles_.end(), sort_order);
std::sort(now_required_for_activation_eviction_tiles_.begin(),
now_required_for_activation_eviction_tiles_.end(),
sort_order);
std::sort(now_not_required_for_activation_eviction_tiles_.begin(),
now_not_required_for_activation_eviction_tiles_.end(),
sort_order);
eviction_tiles_cache_valid_ = true; eviction_tiles_cache_valid_ = true;
eviction_cache_tree_priority_ = tree_priority; eviction_cache_tree_priority_ = tree_priority;
} }
...@@ -985,16 +1016,37 @@ operator++() { ...@@ -985,16 +1016,37 @@ operator++() {
} }
PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator()
: tiling_(NULL) { : tiling_(NULL), eviction_tiles_(NULL) {
} }
PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator(
PictureLayerTiling* tiling, PictureLayerTiling* tiling,
TreePriority tree_priority) TreePriority tree_priority,
: tiling_(tiling), tree_priority_(tree_priority) { TilePriority::PriorityBin type,
bool required_for_activation)
: tiling_(tiling), tree_priority_(tree_priority), eviction_tiles_(NULL) {
if (required_for_activation && type != TilePriority::NOW)
return;
tiling_->UpdateEvictionCacheIfNeeded(tree_priority_); tiling_->UpdateEvictionCacheIfNeeded(tree_priority_);
tile_iterator_ = tiling_->eviction_tiles_cache_.begin(); switch (type) {
if (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && case TilePriority::EVENTUALLY:
eviction_tiles_ = &tiling_->eventually_eviction_tiles_;
break;
case TilePriority::SOON:
eviction_tiles_ = &tiling_->soon_eviction_tiles_;
break;
case TilePriority::NOW:
if (required_for_activation)
eviction_tiles_ = &tiling_->now_required_for_activation_eviction_tiles_;
else
eviction_tiles_ =
&tiling_->now_not_required_for_activation_eviction_tiles_;
break;
}
DCHECK(eviction_tiles_);
tile_iterator_ = eviction_tiles_->begin();
if (tile_iterator_ != eviction_tiles_->end() &&
!(*tile_iterator_)->HasResources()) { !(*tile_iterator_)->HasResources()) {
++(*this); ++(*this);
} }
...@@ -1003,7 +1055,7 @@ PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( ...@@ -1003,7 +1055,7 @@ PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator(
PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {} PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {}
PictureLayerTiling::TilingEvictionTileIterator::operator bool() const { PictureLayerTiling::TilingEvictionTileIterator::operator bool() const {
return tiling_ && tile_iterator_ != tiling_->eviction_tiles_cache_.end(); return eviction_tiles_ && tile_iterator_ != eviction_tiles_->end();
} }
Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() { Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() {
...@@ -1022,7 +1074,7 @@ operator++() { ...@@ -1022,7 +1074,7 @@ operator++() {
DCHECK(*this); DCHECK(*this);
do { do {
++tile_iterator_; ++tile_iterator_;
} while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && } while (tile_iterator_ != eviction_tiles_->end() &&
(!(*tile_iterator_)->HasResources())); (!(*tile_iterator_)->HasResources()));
return *this; return *this;
......
...@@ -108,24 +108,21 @@ class CC_EXPORT PictureLayerTiling { ...@@ -108,24 +108,21 @@ class CC_EXPORT PictureLayerTiling {
public: public:
TilingEvictionTileIterator(); TilingEvictionTileIterator();
TilingEvictionTileIterator(PictureLayerTiling* tiling, TilingEvictionTileIterator(PictureLayerTiling* tiling,
TreePriority tree_priority); TreePriority tree_priority,
TilePriority::PriorityBin type,
bool required_for_activation);
~TilingEvictionTileIterator(); ~TilingEvictionTileIterator();
operator bool() const; operator bool() const;
const Tile* operator*() const; const Tile* operator*() const;
Tile* operator*(); Tile* operator*();
TilingEvictionTileIterator& operator++(); TilingEvictionTileIterator& operator++();
TilePriority::PriorityBin get_type() {
DCHECK(*this);
const TilePriority& priority =
(*tile_iterator_)->priority_for_tree_priority(tree_priority_);
return priority.priority_bin;
}
private: private:
PictureLayerTiling* tiling_; PictureLayerTiling* tiling_;
TreePriority tree_priority_; TreePriority tree_priority_;
std::vector<Tile*>::iterator tile_iterator_; std::vector<Tile*>::iterator tile_iterator_;
std::vector<Tile*>* eviction_tiles_;
}; };
~PictureLayerTiling(); ~PictureLayerTiling();
...@@ -326,7 +323,10 @@ class CC_EXPORT PictureLayerTiling { ...@@ -326,7 +323,10 @@ class CC_EXPORT PictureLayerTiling {
bool has_soon_border_rect_tiles_; bool has_soon_border_rect_tiles_;
bool has_eventually_rect_tiles_; bool has_eventually_rect_tiles_;
std::vector<Tile*> eviction_tiles_cache_; std::vector<Tile*> eventually_eviction_tiles_;
std::vector<Tile*> soon_eviction_tiles_;
std::vector<Tile*> now_required_for_activation_eviction_tiles_;
std::vector<Tile*> now_not_required_for_activation_eviction_tiles_;
bool eviction_tiles_cache_valid_; bool eviction_tiles_cache_valid_;
TreePriority eviction_cache_tree_priority_; TreePriority eviction_cache_tree_priority_;
......
...@@ -202,7 +202,10 @@ class PictureLayerTilingPerfTest : public testing::Test { ...@@ -202,7 +202,10 @@ class PictureLayerTilingPerfTest : public testing::Test {
int priority_count = 0; int priority_count = 0;
do { do {
PictureLayerTiling::TilingEvictionTileIterator it( PictureLayerTiling::TilingEvictionTileIterator it(
picture_layer_tiling_.get(), priorities[priority_count]); picture_layer_tiling_.get(),
priorities[priority_count],
TilePriority::NOW,
false);
priority_count = (priority_count + 1) % arraysize(priorities); priority_count = (priority_count + 1) % arraysize(priorities);
timer_.NextLap(); timer_.NextLap();
} while (!timer_.HasTimeLimitExpired()); } while (!timer_.HasTimeLimitExpired());
...@@ -246,7 +249,10 @@ class PictureLayerTilingPerfTest : public testing::Test { ...@@ -246,7 +249,10 @@ class PictureLayerTilingPerfTest : public testing::Test {
do { do {
int count = num_tiles; int count = num_tiles;
PictureLayerTiling::TilingEvictionTileIterator it( PictureLayerTiling::TilingEvictionTileIterator it(
picture_layer_tiling_.get(), priorities[priority_count]); picture_layer_tiling_.get(),
priorities[priority_count],
TilePriority::EVENTUALLY,
false);
while (count--) { while (count--) {
ASSERT_TRUE(it) << "count: " << count; ASSERT_TRUE(it) << "count: " << count;
ASSERT_TRUE(*it != NULL) << "count: " << count; ASSERT_TRUE(*it != NULL) << "count: " << count;
......
...@@ -30,6 +30,10 @@ class CC_EXPORT PictureLayerTilingSet { ...@@ -30,6 +30,10 @@ class CC_EXPORT PictureLayerTilingSet {
struct TilingRange { struct TilingRange {
TilingRange(size_t start, size_t end) : start(start), end(end) {} TilingRange(size_t start, size_t end) : start(start), end(end) {}
bool IsIndexWithinRange(size_t index) const {
return index >= start && index < end;
}
size_t start; size_t start;
size_t end; size_t end;
}; };
......
...@@ -1042,7 +1042,7 @@ TEST(PictureLayerTilingTest, TilingEvictionTileIteratorStaticViewport) { ...@@ -1042,7 +1042,7 @@ TEST(PictureLayerTilingTest, TilingEvictionTileIteratorStaticViewport) {
scoped_ptr<TestablePictureLayerTiling> tiling; scoped_ptr<TestablePictureLayerTiling> tiling;
gfx::Rect viewport(50, 50, 100, 100); gfx::Rect viewport(50, 50, 100, 100);
gfx::Size layer_bounds(200, 200); gfx::Size layer_bounds(2000, 2000);
client.SetTileSize(gfx::Size(30, 30)); client.SetTileSize(gfx::Size(30, 30));
client.set_tree(ACTIVE_TREE); client.set_tree(ACTIVE_TREE);
...@@ -1056,39 +1056,59 @@ TEST(PictureLayerTilingTest, TilingEvictionTileIteratorStaticViewport) { ...@@ -1056,39 +1056,59 @@ TEST(PictureLayerTilingTest, TilingEvictionTileIteratorStaticViewport) {
std::vector<Tile*> all_tiles = tiling->AllTilesForTesting(); std::vector<Tile*> all_tiles = tiling->AllTilesForTesting();
PictureLayerTiling::TilingEvictionTileIterator it(tiling.get(), PictureLayerTiling::TilingEvictionTileIterator it(
SMOOTHNESS_TAKES_PRIORITY); tiling.get(), SMOOTHNESS_TAKES_PRIORITY, TilePriority::NOW, false);
// Tiles don't have resources to evict. // Tiles don't have resources to evict.
EXPECT_FALSE(it); EXPECT_FALSE(it);
// Sanity check. // Sanity check.
EXPECT_EQ(64u, all_tiles.size()); EXPECT_EQ(5184u, all_tiles.size());
client.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); client.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
std::set<Tile*> all_tiles_set(all_tiles.begin(), all_tiles.end()); std::set<Tile*> all_tiles_set(all_tiles.begin(), all_tiles.end());
std::set<Tile*> eviction_tiles;
it = PictureLayerTiling::TilingEvictionTileIterator( it = PictureLayerTiling::TilingEvictionTileIterator(
tiling.get(), SMOOTHNESS_TAKES_PRIORITY); tiling.get(), SMOOTHNESS_TAKES_PRIORITY, TilePriority::EVENTUALLY, false);
EXPECT_TRUE(it); EXPECT_TRUE(it);
for (; it; ++it) {
Tile* tile = *it;
EXPECT_TRUE(tile);
EXPECT_EQ(TilePriority::EVENTUALLY,
tile->priority(ACTIVE_TREE).priority_bin);
EXPECT_FALSE(tile->required_for_activation());
eviction_tiles.insert(tile);
}
std::set<Tile*> eviction_tiles; it = PictureLayerTiling::TilingEvictionTileIterator(
Tile* last_tile = *it; tiling.get(), SMOOTHNESS_TAKES_PRIORITY, TilePriority::SOON, false);
EXPECT_TRUE(it);
for (; it; ++it) { for (; it; ++it) {
Tile* tile = *it; Tile* tile = *it;
EXPECT_TRUE(tile); EXPECT_TRUE(tile);
EXPECT_LE(tile->priority(ACTIVE_TREE).priority_bin, EXPECT_EQ(TilePriority::SOON, tile->priority(ACTIVE_TREE).priority_bin);
last_tile->priority(ACTIVE_TREE).priority_bin); EXPECT_FALSE(tile->required_for_activation());
if (tile->priority(ACTIVE_TREE).priority_bin ==
last_tile->priority(ACTIVE_TREE).priority_bin) {
EXPECT_LE(tile->priority(ACTIVE_TREE).distance_to_visible,
last_tile->priority(ACTIVE_TREE).distance_to_visible);
}
last_tile = tile;
eviction_tiles.insert(tile); eviction_tiles.insert(tile);
} }
it = PictureLayerTiling::TilingEvictionTileIterator(
tiling.get(), SMOOTHNESS_TAKES_PRIORITY, TilePriority::NOW, false);
EXPECT_TRUE(it);
for (; it; ++it) {
Tile* tile = *it;
EXPECT_TRUE(tile);
EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
EXPECT_FALSE(tile->required_for_activation());
eviction_tiles.insert(tile);
}
it = PictureLayerTiling::TilingEvictionTileIterator(
tiling.get(), SMOOTHNESS_TAKES_PRIORITY, TilePriority::NOW, true);
EXPECT_FALSE(it);
EXPECT_GT(all_tiles_set.size(), 0u); EXPECT_GT(all_tiles_set.size(), 0u);
EXPECT_EQ(all_tiles_set, eviction_tiles); EXPECT_EQ(all_tiles_set, eviction_tiles);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment