Index: cc/resources/picture_layer_tiling.cc |
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc |
index d8885e7bc137bed51e225a6340a319083a13066d..04b18c311835d0b8b26c9bb1c1e035ef6c8c0200 100644 |
--- a/cc/resources/picture_layer_tiling.cc |
+++ b/cc/resources/picture_layer_tiling.cc |
@@ -167,18 +167,16 @@ void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() { |
VerifyLiveTilesRect(); |
} |
-void PictureLayerTiling::UpdateTilesToCurrentPile( |
+void PictureLayerTiling::UpdateTilesToCurrentRasterSource( |
const Region& layer_invalidation, |
const gfx::Size& new_layer_bounds) { |
DCHECK(!new_layer_bounds.IsEmpty()); |
- gfx::Size tile_size = tiling_data_.max_texture_size(); |
+ gfx::Size content_bounds = |
+ gfx::ToCeiledSize(gfx::ScaleSize(new_layer_bounds, contents_scale_)); |
+ gfx::Size tile_size = client_->CalculateTileSize(content_bounds); |
if (new_layer_bounds != layer_bounds_) { |
- gfx::Size content_bounds = |
- gfx::ToCeiledSize(gfx::ScaleSize(new_layer_bounds, contents_scale_)); |
- |
- tile_size = client_->CalculateTileSize(content_bounds); |
if (tile_size.IsEmpty()) { |
layer_bounds_ = gfx::Size(); |
content_bounds = gfx::Size(); |
@@ -699,15 +697,13 @@ bool PictureLayerTiling::IsTileOccluded(const Tile* tile) const { |
return current_occlusion_in_layer_space_.IsOccluded(tile_query_rect); |
} |
-bool PictureLayerTiling::IsTileRequiredForActivation(const Tile* tile) const { |
+bool PictureLayerTiling::IsTileRequiredForActivationIfVisible( |
+ const Tile* tile) const { |
DCHECK_EQ(PENDING_TREE, client_->GetTree()); |
- // Note that although this function will determine whether tile is required |
- // for activation assuming that it is in visible (ie in the viewport). That is |
- // to say, even if the tile is outside of the viewport, it will be treated as |
- // if it was inside (there are no explicit checks for this). Hence, this |
- // function is only called for visible tiles to ensure we don't block |
- // activation on tiles outside of the viewport. |
+ // This function assumes that the tile is visible (i.e. in the viewport). The |
+ // caller needs to make sure that this condition is met to ensure we don't |
+ // block activation on tiles outside of the viewport. |
// If we are not allowed to mark tiles as required for activation, then don't |
// do it. |
@@ -744,6 +740,21 @@ bool PictureLayerTiling::IsTileRequiredForActivation(const Tile* tile) const { |
return true; |
} |
+bool PictureLayerTiling::IsTileRequiredForDrawIfVisible( |
+ const Tile* tile) const { |
+ DCHECK_EQ(ACTIVE_TREE, client_->GetTree()); |
+ |
+ // This function assumes that the tile is visible (i.e. in the viewport). |
+ |
+ if (resolution_ != HIGH_RESOLUTION) |
+ return false; |
+ |
+ if (IsTileOccluded(tile)) |
+ return false; |
+ |
+ return true; |
+} |
+ |
void PictureLayerTiling::UpdateTileAndTwinPriority(Tile* tile) const { |
UpdateTilePriority(tile); |
@@ -756,6 +767,8 @@ void PictureLayerTiling::UpdateTileAndTwinPriority(Tile* tile) const { |
tile->set_is_occluded(twin_tree, false); |
if (twin_tree == PENDING_TREE) |
tile->set_required_for_activation(false); |
+ else |
+ tile->set_required_for_draw(false); |
return; |
} |
@@ -766,22 +779,31 @@ void PictureLayerTiling::UpdateTilePriority(Tile* tile) const { |
// TODO(vmpstr): This code should return the priority instead of setting it on |
// the tile. This should be a part of the change to move tile priority from |
// tiles into iterators. |
+ TilePriority::PriorityBin max_tile_priority_bin = |
+ client_->GetMaxTilePriorityBin(); |
WhichTree tree = client_->GetTree(); |
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)) { |
+ if (max_tile_priority_bin <= TilePriority::NOW && |
+ current_visible_rect_.Intersects(tile_bounds)) { |
tile->SetPriority(tree, TilePriority(resolution_, TilePriority::NOW, 0)); |
- if (tree == PENDING_TREE) |
- tile->set_required_for_activation(IsTileRequiredForActivation(tile)); |
+ if (tree == PENDING_TREE) { |
+ tile->set_required_for_activation( |
+ IsTileRequiredForActivationIfVisible(tile)); |
+ } else { |
+ tile->set_required_for_draw(IsTileRequiredForDrawIfVisible(tile)); |
+ } |
tile->set_is_occluded(tree, IsTileOccluded(tile)); |
return; |
} |
if (tree == PENDING_TREE) |
tile->set_required_for_activation(false); |
+ else |
+ tile->set_required_for_draw(false); |
tile->set_is_occluded(tree, false); |
DCHECK_GT(content_to_screen_scale_, 0.f); |
@@ -789,8 +811,9 @@ void PictureLayerTiling::UpdateTilePriority(Tile* tile) const { |
current_visible_rect_.ManhattanInternalDistance(tile_bounds) * |
content_to_screen_scale_; |
- if (current_soon_border_rect_.Intersects(tile_bounds) || |
- current_skewport_rect_.Intersects(tile_bounds)) { |
+ if (max_tile_priority_bin <= TilePriority::SOON && |
+ (current_soon_border_rect_.Intersects(tile_bounds) || |
+ current_skewport_rect_.Intersects(tile_bounds))) { |
tile->SetPriority( |
tree, |
TilePriority(resolution_, TilePriority::SOON, distance_to_visible)); |