Chromium Code Reviews| Index: cc/resources/picture_layer_tiling.cc |
| diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc |
| index de2cb4a19f1cca0e9587f3943e83c2d837072fe7..abd3918457b3e7c413d6a606fc6e25db8b1d638f 100644 |
| --- a/cc/resources/picture_layer_tiling.cc |
| +++ b/cc/resources/picture_layer_tiling.cc |
| @@ -817,9 +817,11 @@ void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { |
| 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); |
| - return PrioritizedTile(tile, ComputePriorityForTile(tile), |
| + return PrioritizedTile(tile, ComputePriorityForTile(tile, priority_rect_type), |
| IsTileOccluded(tile)); |
| } |
| @@ -827,9 +829,10 @@ std::map<const Tile*, PrioritizedTile> |
| PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() { |
| std::map<const Tile*, PrioritizedTile> result; |
| for (const auto& key_tile_pair : tiles_) { |
| - UpdateRequiredStatesOnTile(key_tile_pair.second); |
| + Tile* tile = key_tile_pair.second; |
| + UpdateRequiredStatesOnTile(tile); |
| PrioritizedTile prioritized_tile = |
| - MakePrioritizedTile(key_tile_pair.second); |
| + MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile)); |
| result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); |
| } |
| return result; |
| @@ -843,45 +846,73 @@ void PictureLayerTiling::VerifyAllTilesHaveCurrentRasterSource() const { |
| } |
| 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. |
| TilePriority::PriorityBin max_tile_priority_bin = |
| client_->GetMaxTilePriorityBin(); |
| + DCHECK_EQ(ComputePriorityRectTypeForTile(tile), priority_rect_type); |
| 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 && |
| - current_visible_rect_.Intersects(tile_bounds)) { |
| - return TilePriority(resolution_, TilePriority::NOW, 0); |
| - } |
| + TilePriority::PriorityBin priority_bin = max_tile_priority_bin; |
| - if (max_tile_priority_bin <= TilePriority::SOON && |
| - pending_visible_rect().Intersects(tile_bounds)) { |
| - return TilePriority(resolution_, TilePriority::SOON, 0); |
| + switch (priority_rect_type) { |
| + case VISIBLE_RECT: |
| + return TilePriority(resolution_, priority_bin, 0); |
|
hendrikw
2015/05/12 22:23:49
Why don't we need to compare max_tile_priority_bin
USE eero AT chromium.org
2015/05/13 07:48:13
Because max_tile_priority cannot be higher than TP
|
| + 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); |
| float distance_to_visible = |
| current_visible_rect_.ManhattanInternalDistance(tile_bounds) * |
| current_content_to_screen_scale_; |
| - if (max_tile_priority_bin <= TilePriority::SOON && |
| - (current_soon_border_rect_.Intersects(tile_bounds) || |
| - current_skewport_rect_.Intersects(tile_bounds))) { |
| - return TilePriority(resolution_, TilePriority::SOON, distance_to_visible); |
| - } |
| + return TilePriority(resolution_, priority_bin, 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, |
| - distance_to_visible); |
| + DCHECK(current_eventually_rect_.Intersects(tile_bounds)); |
| + return EVENTUALLY_RECT; |
| } |
| void PictureLayerTiling::GetAllTilesAndPrioritiesForTracing( |
| std::map<const Tile*, TilePriority>* tile_map) const { |
| for (const auto& tile_pair : tiles_) { |
| const Tile* tile = tile_pair.second; |
| - const TilePriority& priority = ComputePriorityForTile(tile); |
| + const TilePriority& priority = |
| + ComputePriorityForTile(tile, ComputePriorityRectTypeForTile(tile)); |
| // Store combined priority. |
| (*tile_map)[tile] = priority; |
| } |