| 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;
 | 
| 
 |