Commit 1b9c87ec authored by e.hakkinen's avatar e.hakkinen Committed by Commit bot

cc: Pass priority rect information from iterators to tilings.

As each tiling iterator in raster and eviction queues iterates one
priority rect, those iterators know the priority rect for tiles. Thus
picture layer tilings compute priority rects only because iterators do
not pass that information to tilings. Therefore, unnecessary priority
rect computation can be avoided by passing priority rect information
from iterators to tilings.

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

Cr-Commit-Position: refs/heads/master@{#330061}
parent 5118a5b3
...@@ -806,7 +806,9 @@ void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { ...@@ -806,7 +806,9 @@ void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const {
tile->set_required_for_draw(IsTileRequiredForDraw(tile)); tile->set_required_for_draw(IsTileRequiredForDraw(tile));
} }
PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const { PrioritizedTile PictureLayerTiling::MakePrioritizedTile(
Tile* tile,
PriorityRectType priority_rect_type) const {
DCHECK(tile); DCHECK(tile);
DCHECK( DCHECK(
raster_source()->CoversRect(tile->content_rect(), tile->contents_scale())) raster_source()->CoversRect(tile->content_rect(), tile->contents_scale()))
...@@ -814,7 +816,8 @@ PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const { ...@@ -814,7 +816,8 @@ PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const {
<< gfx::ScaleToEnclosingRect(tile->content_rect(), << gfx::ScaleToEnclosingRect(tile->content_rect(),
1.f / tile->contents_scale()).ToString(); 1.f / tile->contents_scale()).ToString();
return PrioritizedTile(tile, raster_source(), ComputePriorityForTile(tile), return PrioritizedTile(tile, raster_source(),
ComputePriorityForTile(tile, priority_rect_type),
IsTileOccluded(tile)); IsTileOccluded(tile));
} }
...@@ -822,53 +825,83 @@ std::map<const Tile*, PrioritizedTile> ...@@ -822,53 +825,83 @@ std::map<const Tile*, PrioritizedTile>
PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() const { PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() const {
std::map<const Tile*, PrioritizedTile> result; std::map<const Tile*, PrioritizedTile> result;
for (const auto& key_tile_pair : tiles_) { for (const auto& key_tile_pair : tiles_) {
UpdateRequiredStatesOnTile(key_tile_pair.second); Tile* tile = key_tile_pair.second;
UpdateRequiredStatesOnTile(tile);
PrioritizedTile prioritized_tile = PrioritizedTile prioritized_tile =
MakePrioritizedTile(key_tile_pair.second); MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile));
result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile));
} }
return result; return result;
} }
TilePriority PictureLayerTiling::ComputePriorityForTile( TilePriority PictureLayerTiling::ComputePriorityForTile(
const Tile* tile) const { const Tile* tile,
PriorityRectType priority_rect_type) const {
// TODO(vmpstr): See if this can be moved to iterators. // TODO(vmpstr): See if this can be moved to iterators.
TilePriority::PriorityBin max_tile_priority_bin = TilePriority::PriorityBin max_tile_priority_bin =
client_->GetMaxTilePriorityBin(); client_->GetMaxTilePriorityBin();
DCHECK_EQ(ComputePriorityRectTypeForTile(tile), priority_rect_type);
DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile);
gfx::Rect tile_bounds =
tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index());
if (max_tile_priority_bin <= TilePriority::NOW && TilePriority::PriorityBin priority_bin = max_tile_priority_bin;
current_visible_rect_.Intersects(tile_bounds)) {
return TilePriority(resolution_, TilePriority::NOW, 0);
}
if (max_tile_priority_bin <= TilePriority::SOON && switch (priority_rect_type) {
pending_visible_rect().Intersects(tile_bounds)) { case VISIBLE_RECT:
return TilePriority(resolution_, TilePriority::SOON, 0); return TilePriority(resolution_, priority_bin, 0);
case PENDING_VISIBLE_RECT:
if (max_tile_priority_bin <= TilePriority::SOON)
return TilePriority(resolution_, TilePriority::SOON, 0);
priority_bin = TilePriority::EVENTUALLY;
break;
case SKEWPORT_RECT:
case SOON_BORDER_RECT:
if (max_tile_priority_bin <= TilePriority::SOON)
priority_bin = TilePriority::SOON;
break;
case EVENTUALLY_RECT:
priority_bin = TilePriority::EVENTUALLY;
break;
} }
gfx::Rect tile_bounds =
tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index());
DCHECK_GT(current_content_to_screen_scale_, 0.f); DCHECK_GT(current_content_to_screen_scale_, 0.f);
float distance_to_visible = float distance_to_visible =
current_visible_rect_.ManhattanInternalDistance(tile_bounds) * current_visible_rect_.ManhattanInternalDistance(tile_bounds) *
current_content_to_screen_scale_; current_content_to_screen_scale_;
if (max_tile_priority_bin <= TilePriority::SOON && return TilePriority(resolution_, priority_bin, distance_to_visible);
(current_soon_border_rect_.Intersects(tile_bounds) || }
current_skewport_rect_.Intersects(tile_bounds))) {
return TilePriority(resolution_, TilePriority::SOON, distance_to_visible); PictureLayerTiling::PriorityRectType
} PictureLayerTiling::ComputePriorityRectTypeForTile(const Tile* tile) const {
DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile);
gfx::Rect tile_bounds =
tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index());
if (current_visible_rect_.Intersects(tile_bounds))
return VISIBLE_RECT;
if (pending_visible_rect().Intersects(tile_bounds))
return PENDING_VISIBLE_RECT;
if (current_skewport_rect_.Intersects(tile_bounds))
return SKEWPORT_RECT;
if (current_soon_border_rect_.Intersects(tile_bounds))
return SOON_BORDER_RECT;
return TilePriority(resolution_, TilePriority::EVENTUALLY, DCHECK(current_eventually_rect_.Intersects(tile_bounds));
distance_to_visible); return EVENTUALLY_RECT;
} }
void PictureLayerTiling::GetAllPrioritizedTilesForTracing( void PictureLayerTiling::GetAllPrioritizedTilesForTracing(
std::vector<PrioritizedTile>* prioritized_tiles) const { std::vector<PrioritizedTile>* prioritized_tiles) const {
for (const auto& tile_pair : tiles_) { for (const auto& tile_pair : tiles_) {
prioritized_tiles->push_back(MakePrioritizedTile(tile_pair.second)); Tile* tile = tile_pair.second;
prioritized_tiles->push_back(
MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile)));
} }
} }
......
...@@ -212,6 +212,19 @@ class CC_EXPORT PictureLayerTiling { ...@@ -212,6 +212,19 @@ class CC_EXPORT PictureLayerTiling {
friend class TilingSetRasterQueueRequired; friend class TilingSetRasterQueueRequired;
friend class TilingSetEvictionQueue; friend class TilingSetEvictionQueue;
// PENDING VISIBLE RECT refers to the visible rect that will become current
// upon activation (ie, the pending tree's visible rect). Tiles in this
// region that are not part of the current visible rect are all handled
// here. Note that when processing a pending tree, this rect is the same as
// the visible rect so no tiles are processed in this case.
enum PriorityRectType {
VISIBLE_RECT,
PENDING_VISIBLE_RECT,
SKEWPORT_RECT,
SOON_BORDER_RECT,
EVENTUALLY_RECT
};
using TileMapKey = std::pair<int, int>; using TileMapKey = std::pair<int, int>;
using TileMap = base::ScopedPtrHashMap<TileMapKey, ScopedTilePtr>; using TileMap = base::ScopedPtrHashMap<TileMapKey, ScopedTilePtr>;
...@@ -272,8 +285,13 @@ class CC_EXPORT PictureLayerTiling { ...@@ -272,8 +285,13 @@ class CC_EXPORT PictureLayerTiling {
bool ShouldCreateTileAt(int i, int j) const; bool ShouldCreateTileAt(int i, int j) const;
bool IsTileOccluded(const Tile* tile) const; bool IsTileOccluded(const Tile* tile) const;
void UpdateRequiredStatesOnTile(Tile* tile) const; void UpdateRequiredStatesOnTile(Tile* tile) const;
PrioritizedTile MakePrioritizedTile(Tile* tile) const; PrioritizedTile MakePrioritizedTile(
TilePriority ComputePriorityForTile(const Tile* tile) const; Tile* tile,
PriorityRectType priority_rect_type) const;
TilePriority ComputePriorityForTile(
const Tile* tile,
PriorityRectType priority_rect_type) const;
PriorityRectType ComputePriorityRectTypeForTile(const Tile* tile) const;
bool has_visible_rect_tiles() const { return has_visible_rect_tiles_; } bool has_visible_rect_tiles() const { return has_visible_rect_tiles_; }
bool has_skewport_rect_tiles() const { return has_skewport_rect_tiles_; } bool has_skewport_rect_tiles() const { return has_skewport_rect_tiles_; }
bool has_soon_border_rect_tiles() const { bool has_soon_border_rect_tiles() const {
......
...@@ -188,10 +188,10 @@ TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() ...@@ -188,10 +188,10 @@ TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator()
TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator(
std::vector<PictureLayerTiling*>* tilings, std::vector<PictureLayerTiling*>* tilings,
WhichTree tree, WhichTree tree,
bool skip_pending_visible_rect) PictureLayerTiling::PriorityRectType priority_rect_type)
: tilings_(tilings), : tilings_(tilings),
tree_(tree), tree_(tree),
skip_pending_visible_rect_(skip_pending_visible_rect), priority_rect_type_(priority_rect_type),
tiling_index_(0) { tiling_index_(0) {
} }
...@@ -219,12 +219,16 @@ bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( ...@@ -219,12 +219,16 @@ bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid(
// If there's nothing to evict, return false. // If there's nothing to evict, return false.
if (!tile || !tile->draw_info().has_resource()) if (!tile || !tile->draw_info().has_resource())
return false; return false;
if (skip_pending_visible_rect_ && // After the pending visible rect has been processed, we must return false
// for pending visible rect tiles as tiling iterators do not ignore those
// tiles.
if (priority_rect_type_ > PictureLayerTiling::PENDING_VISIBLE_RECT &&
tiling->pending_visible_rect().Intersects(tile->content_rect())) { tiling->pending_visible_rect().Intersects(tile->content_rect())) {
return false; return false;
} }
(*tilings_)[tiling_index_]->UpdateRequiredStatesOnTile(tile); (*tilings_)[tiling_index_]->UpdateRequiredStatesOnTile(tile);
prioritized_tile_ = (*tilings_)[tiling_index_]->MakePrioritizedTile(tile); prioritized_tile_ = (*tilings_)[tiling_index_]->MakePrioritizedTile(
tile, priority_rect_type_);
// In other cases, the tile we got is a viable candidate, return true. // In other cases, the tile we got is a viable candidate, return true.
return true; return true;
} }
...@@ -233,9 +237,7 @@ bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( ...@@ -233,9 +237,7 @@ bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid(
TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator(
std::vector<PictureLayerTiling*>* tilings, std::vector<PictureLayerTiling*>* tilings,
WhichTree tree) WhichTree tree)
: EvictionRectIterator(tilings, : EvictionRectIterator(tilings, tree, PictureLayerTiling::EVENTUALLY_RECT) {
tree,
true /* skip_pending_visible_rect */) {
// Find the first tiling with a tile. // Find the first tiling with a tile.
while (tiling_index_ < tilings_->size()) { while (tiling_index_ < tilings_->size()) {
if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) {
...@@ -287,7 +289,7 @@ TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( ...@@ -287,7 +289,7 @@ TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator(
WhichTree tree) WhichTree tree)
: EvictionRectIterator(tilings, : EvictionRectIterator(tilings,
tree, tree,
true /* skip_pending_visible_rect */) { PictureLayerTiling::SOON_BORDER_RECT) {
// Find the first tiling with a tile. // Find the first tiling with a tile.
while (tiling_index_ < tilings_->size()) { while (tiling_index_ < tilings_->size()) {
if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) {
...@@ -337,9 +339,7 @@ TilingSetEvictionQueue::SoonBorderTilingIterator& ...@@ -337,9 +339,7 @@ TilingSetEvictionQueue::SoonBorderTilingIterator&
TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator(
std::vector<PictureLayerTiling*>* tilings, std::vector<PictureLayerTiling*>* tilings,
WhichTree tree) WhichTree tree)
: EvictionRectIterator(tilings, : EvictionRectIterator(tilings, tree, PictureLayerTiling::SKEWPORT_RECT) {
tree,
true /* skip_pending_visible_rect */) {
// Find the first tiling with a tile. // Find the first tiling with a tile.
while (tiling_index_ < tilings_->size()) { while (tiling_index_ < tilings_->size()) {
if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) {
...@@ -392,7 +392,7 @@ TilingSetEvictionQueue::PendingVisibleTilingIterator:: ...@@ -392,7 +392,7 @@ TilingSetEvictionQueue::PendingVisibleTilingIterator::
bool return_required_for_activation_tiles) bool return_required_for_activation_tiles)
: EvictionRectIterator(tilings, : EvictionRectIterator(tilings,
tree, tree,
false /* skip_pending_visible_rect */), PictureLayerTiling::PENDING_VISIBLE_RECT),
return_required_for_activation_tiles_( return_required_for_activation_tiles_(
return_required_for_activation_tiles) { return_required_for_activation_tiles) {
// Find the first tiling with a tile. // Find the first tiling with a tile.
...@@ -456,9 +456,7 @@ TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( ...@@ -456,9 +456,7 @@ TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator(
WhichTree tree, WhichTree tree,
bool return_occluded_tiles, bool return_occluded_tiles,
bool return_required_for_activation_tiles) bool return_required_for_activation_tiles)
: EvictionRectIterator(tilings, : EvictionRectIterator(tilings, tree, PictureLayerTiling::VISIBLE_RECT),
tree,
false /* skip_pending_visible_rect */),
return_occluded_tiles_(return_occluded_tiles), return_occluded_tiles_(return_occluded_tiles),
return_required_for_activation_tiles_( return_required_for_activation_tiles_(
return_required_for_activation_tiles) { return_required_for_activation_tiles) {
......
...@@ -91,9 +91,10 @@ class CC_EXPORT TilingSetEvictionQueue { ...@@ -91,9 +91,10 @@ class CC_EXPORT TilingSetEvictionQueue {
class EvictionRectIterator { class EvictionRectIterator {
public: public:
EvictionRectIterator(); EvictionRectIterator();
EvictionRectIterator(std::vector<PictureLayerTiling*>* tilings, EvictionRectIterator(
WhichTree tree, std::vector<PictureLayerTiling*>* tilings,
bool skip_pending_visible_rect); WhichTree tree,
PictureLayerTiling::PriorityRectType priority_rect_type);
bool done() const { return !prioritized_tile_.tile(); } bool done() const { return !prioritized_tile_.tile(); }
const PrioritizedTile& operator*() const { return prioritized_tile_; } const PrioritizedTile& operator*() const { return prioritized_tile_; }
...@@ -109,7 +110,7 @@ class CC_EXPORT TilingSetEvictionQueue { ...@@ -109,7 +110,7 @@ class CC_EXPORT TilingSetEvictionQueue {
PrioritizedTile prioritized_tile_; PrioritizedTile prioritized_tile_;
std::vector<PictureLayerTiling*>* tilings_; std::vector<PictureLayerTiling*>* tilings_;
WhichTree tree_; WhichTree tree_;
bool skip_pending_visible_rect_; PictureLayerTiling::PriorityRectType priority_rect_type_;
size_t tiling_index_; size_t tiling_index_;
}; };
......
This diff is collapsed.
...@@ -31,8 +31,10 @@ class CC_EXPORT TilingSetRasterQueueAll { ...@@ -31,8 +31,10 @@ class CC_EXPORT TilingSetRasterQueueAll {
class OnePriorityRectIterator { class OnePriorityRectIterator {
public: public:
OnePriorityRectIterator(); OnePriorityRectIterator();
OnePriorityRectIterator(PictureLayerTiling* tiling, OnePriorityRectIterator(
TilingData* tiling_data); PictureLayerTiling* tiling,
TilingData* tiling_data,
PictureLayerTiling::PriorityRectType priority_rect_type);
bool done() const { return !current_tile_.tile(); } bool done() const { return !current_tile_.tile(); }
const PrioritizedTile& operator*() const { return current_tile_; } const PrioritizedTile& operator*() const { return current_tile_; }
...@@ -51,6 +53,7 @@ class CC_EXPORT TilingSetRasterQueueAll { ...@@ -51,6 +53,7 @@ class CC_EXPORT TilingSetRasterQueueAll {
PrioritizedTile current_tile_; PrioritizedTile current_tile_;
PictureLayerTiling* tiling_; PictureLayerTiling* tiling_;
TilingData* tiling_data_; TilingData* tiling_data_;
PictureLayerTiling::PriorityRectType priority_rect_type_;
}; };
// Iterates over visible rect only, left to right top to bottom order. // Iterates over visible rect only, left to right top to bottom order.
...@@ -131,13 +134,13 @@ class CC_EXPORT TilingSetRasterQueueAll { ...@@ -131,13 +134,13 @@ class CC_EXPORT TilingSetRasterQueueAll {
const PrioritizedTile& operator*() const { return current_tile_; } const PrioritizedTile& operator*() const { return current_tile_; }
TilePriority::PriorityBin type() const { TilePriority::PriorityBin type() const {
switch (phase_) { switch (phase_) {
case VISIBLE_RECT: case Phase::VISIBLE_RECT:
return TilePriority::NOW; return TilePriority::NOW;
case PENDING_VISIBLE_RECT: case Phase::PENDING_VISIBLE_RECT:
case SKEWPORT_RECT: case Phase::SKEWPORT_RECT:
case SOON_BORDER_RECT: case Phase::SOON_BORDER_RECT:
return TilePriority::SOON; return TilePriority::SOON;
case EVENTUALLY_RECT: case Phase::EVENTUALLY_RECT:
return TilePriority::EVENTUALLY; return TilePriority::EVENTUALLY;
} }
NOTREACHED(); NOTREACHED();
...@@ -147,18 +150,7 @@ class CC_EXPORT TilingSetRasterQueueAll { ...@@ -147,18 +150,7 @@ class CC_EXPORT TilingSetRasterQueueAll {
TilingIterator& operator++(); TilingIterator& operator++();
private: private:
// PENDING VISIBLE RECT refers to the visible rect that will become current using Phase = PictureLayerTiling::PriorityRectType;
// upon activation (ie, the pending tree's visible rect). Tiles in this
// region that are not part of the current visible rect are all handled
// here. Note that when processing a pending tree, this rect is the same as
// the visible rect so no tiles are processed in this case.
enum Phase {
VISIBLE_RECT,
PENDING_VISIBLE_RECT,
SKEWPORT_RECT,
SOON_BORDER_RECT,
EVENTUALLY_RECT
};
void AdvancePhase(); void AdvancePhase();
......
...@@ -104,7 +104,8 @@ TilingSetRasterQueueRequired::TilingIterator::TilingIterator( ...@@ -104,7 +104,8 @@ TilingSetRasterQueueRequired::TilingIterator::TilingIterator(
if (tile && tile->draw_info().NeedsRaster() && if (tile && tile->draw_info().NeedsRaster() &&
!tiling_->IsTileOccluded(tile)) { !tiling_->IsTileOccluded(tile)) {
tiling_->UpdateRequiredStatesOnTile(tile); tiling_->UpdateRequiredStatesOnTile(tile);
current_tile_ = tiling_->MakePrioritizedTile(tile); current_tile_ = tiling_->MakePrioritizedTile(
tile, tiling_->ComputePriorityRectTypeForTile(tile));
return; return;
} }
++(*this); ++(*this);
...@@ -143,7 +144,8 @@ TilingSetRasterQueueRequired::TilingIterator& ...@@ -143,7 +144,8 @@ TilingSetRasterQueueRequired::TilingIterator&
} }
tiling_->UpdateRequiredStatesOnTile(tile); tiling_->UpdateRequiredStatesOnTile(tile);
current_tile_ = tiling_->MakePrioritizedTile(tile); current_tile_ = tiling_->MakePrioritizedTile(
tile, tiling_->ComputePriorityRectTypeForTile(tile));
return *this; return *this;
} }
......
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