Index: cc/tiles/picture_layer_tiling.cc |
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc |
index 75fd37debc3845e24f80cd7e28a323ce5a9c7b61..ecf8fe1c188b29fd920f5fcf5ca84747fd932c72 100644 |
--- a/cc/tiles/picture_layer_tiling.cc |
+++ b/cc/tiles/picture_layer_tiling.cc |
@@ -804,6 +804,39 @@ bool PictureLayerTiling::IsTileRequiredForDraw(const Tile* tile) const { |
return true; |
} |
+bool PictureLayerTiling::ShouldDecodeCheckeredImagesForTile( |
+ const Tile* tile) const { |
+ // If this is the pending tree and the tile is not occluded, any checkered |
+ // images on this tile should be decoded. |
+ if (tree_ == PENDING_TREE) |
+ return !IsTileOccludedOnCurrentTree(tile); |
+ |
+ DCHECK_EQ(tree_, ACTIVE_TREE); |
+ const PictureLayerTiling* pending_twin = |
+ client_->GetPendingOrActiveTwinTiling(this); |
+ |
+ // If we don't have a pending twin, then 2 cases are possible. Either we don't |
+ // have a pending tree, in which case we should be decoding images for tiles |
+ // which are unoccluded. |
+ // If we do have a pending tree, then not having a twin implies that this |
+ // tiling will be evicted upon activation. TODO(khushalsagar): Plumb this |
+ // information here and return false for this case. |
+ if (!pending_twin) |
+ return !IsTileOccludedOnCurrentTree(tile); |
+ |
+ // If the tile will be replaced upon activation, then we don't need to process |
+ // it for checkered images. Since once the pending tree is activated, it is |
+ // the new active tree's content that we will invalidate and replace once the |
+ // decode finishes. |
+ if (!TilingMatchesTileIndices(pending_twin) || |
+ pending_twin->TileAt(tile->tiling_i_index(), tile->tiling_j_index())) { |
+ return false; |
+ } |
+ |
+ // Ask the pending twin if this tile will become occluded upon activation. |
+ return !pending_twin->IsTileOccludedOnCurrentTree(tile); |
+} |
+ |
void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { |
tile->set_required_for_activation(IsTileRequiredForActivation(tile)); |
tile->set_required_for_draw(IsTileRequiredForDraw(tile)); |
@@ -832,7 +865,8 @@ PrioritizedTile PictureLayerTiling::MakePrioritizedTile( |
tile_priority.distance_to_visible > |
0.5f * max_skewport_extent_in_screen_space_); |
return PrioritizedTile(tile, this, tile_priority, IsTileOccluded(tile), |
- process_for_images_only); |
+ process_for_images_only, |
+ ShouldDecodeCheckeredImagesForTile(tile)); |
} |
std::map<const Tile*, PrioritizedTile> |