| Index: cc/layers/picture_layer_impl.cc
|
| diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
|
| index eaccbbf46ba873ebf196ad8f02c92c0a4a47db51..8a78bb1a8e2c9cce50a8837696e64e43a9f748aa 100644
|
| --- a/cc/layers/picture_layer_impl.cc
|
| +++ b/cc/layers/picture_layer_impl.cc
|
| @@ -441,15 +441,22 @@ void PictureLayerImpl::AppendQuads(
|
| CleanUpTilingsOnActiveLayer(seen_tilings);
|
| }
|
|
|
| -void PictureLayerImpl::UpdateTiles(
|
| - const Occlusion& occlusion_in_content_space) {
|
| +void PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
|
| + bool resourceless_software_draw) {
|
| TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTiles");
|
| DCHECK_EQ(1.f, contents_scale_x());
|
| DCHECK_EQ(1.f, contents_scale_y());
|
|
|
| DoPostCommitInitializationIfNeeded();
|
|
|
| - visible_rect_for_tile_priority_ = visible_content_rect();
|
| + // Any draw properties derived from |transform|, |viewport|, and |clip|
|
| + // parameters in LayerTreeHostImpl::SetExternalDrawConstraints are not valid
|
| + // for prioritizing tiles during resourceless software draws. This is because
|
| + // resourceless software draws can have wildly different transforms/viewports
|
| + // from regular draws.
|
| + if (!resourceless_software_draw) {
|
| + visible_rect_for_tile_priority_ = visible_content_rect();
|
| + }
|
| viewport_rect_for_tile_priority_ =
|
| layer_tree_impl()->ViewportRectForTilePriority();
|
| screen_space_transform_for_tile_priority_ = screen_space_transform();
|
| @@ -806,7 +813,7 @@ void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
|
| // higher res on the active tree to a lower res on the pending tree.
|
|
|
| // First, early out for layers with no visible content.
|
| - if (visible_content_rect().IsEmpty())
|
| + if (visible_rect_for_tile_priority_.IsEmpty())
|
| return;
|
|
|
| // Only mark tiles inside the viewport for tile priority as required for
|
| @@ -814,7 +821,7 @@ void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
|
| // can be independently overridden by embedders like Android WebView with
|
| // SetExternalDrawConstraints.
|
| gfx::Rect rect = GetViewportForTilePriorityInContentSpace();
|
| - rect.Intersect(visible_content_rect());
|
| + rect.Intersect(visible_rect_for_tile_priority_);
|
|
|
| float min_acceptable_scale =
|
| std::min(raster_contents_scale_, ideal_contents_scale_);
|
| @@ -1492,16 +1499,18 @@ bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
|
| if (!tilings_)
|
| return true;
|
|
|
| - if (visible_content_rect().IsEmpty())
|
| + if (visible_rect_for_tile_priority_.IsEmpty())
|
| return true;
|
|
|
| + gfx::Rect rect = GetViewportForTilePriorityInContentSpace();
|
| + rect.Intersect(visible_rect_for_tile_priority_);
|
| +
|
| for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
|
| PictureLayerTiling* tiling = tilings_->tiling_at(i);
|
| if (tiling->resolution() != HIGH_RESOLUTION &&
|
| tiling->resolution() != LOW_RESOLUTION)
|
| continue;
|
|
|
| - gfx::Rect rect(visible_content_rect());
|
| for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter;
|
| ++iter) {
|
| const Tile* tile = *iter;
|
|
|