Index: cc/resources/picture_layer_tiling.cc |
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc |
index e21a3aa0076ab09086fe23f53950e7656ee4c387..30f5d79d1920c7016d18fff2377d33fcc89cf843 100644 |
--- a/cc/resources/picture_layer_tiling.cc |
+++ b/cc/resources/picture_layer_tiling.cc |
@@ -805,7 +805,9 @@ 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); |
DCHECK( |
raster_source()->CoversRect(tile->content_rect(), tile->contents_scale())) |
@@ -813,7 +815,8 @@ PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const { |
<< gfx::ScaleToEnclosingRect(tile->content_rect(), |
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)); |
} |
@@ -821,53 +824,83 @@ std::map<const Tile*, PrioritizedTile> |
PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() const { |
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; |
} |
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); |
+ 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::GetAllPrioritizedTilesForTracing( |
std::vector<PrioritizedTile>* prioritized_tiles) const { |
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))); |
} |
} |