12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm>
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <limits>
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <set>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/debug/trace_event_argument.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/debug_colors.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/debug/micro_benchmark_impl.h"
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/layers/solid_color_layer_impl.h"
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/output/begin_frame_args.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/checkerboard_draw_quad.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/debug_border_draw_quad.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/quads/picture_draw_quad.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/tile_draw_quad.h"
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/resources/tile_manager.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/trees/occlusion_tracker.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/quad_f.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const float kMaxScaleRatioDuringPinch = 2.0f;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// When creating a new tiling during pinch, snap to an existing
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// tiling's scale if the desired scale is within this ratio.
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const float kSnapToExistingTilingRatio = 1.2f;
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Estimate skewport 60 frames ahead for pre-rasterization on the CPU.
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const float kCpuSkewportTargetTimeInFrames = 60.0f;
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Don't pre-rasterize on the GPU (except for kBackflingGuardDistancePixels in
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TileManager::BinFromTilePriority).
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const float kGpuSkewportTargetTimeInFrames = 0.0f;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PictureLayerImpl::Pair::Pair() : active(NULL), pending(NULL) {
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PictureLayerImpl::Pair::Pair(PictureLayerImpl* active_layer,
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             PictureLayerImpl* pending_layer)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : active(active_layer), pending(pending_layer) {
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PictureLayerImpl::Pair::~Pair() {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, int id)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LayerImpl(tree_impl, id),
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      twin_layer_(NULL),
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      pile_(PicturePileImpl::Create()),
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_page_scale_(0.f),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_device_scale_(0.f),
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_source_scale_(0.f),
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ideal_contents_scale_(0.f),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      raster_page_scale_(0.f),
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      raster_device_scale_(0.f),
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      raster_source_scale_(0.f),
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      raster_contents_scale_(0.f),
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      low_res_raster_contents_scale_(0.f),
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      raster_source_scale_is_fixed_(false),
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      was_screen_space_transform_animating_(false),
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      needs_post_commit_initialization_(true),
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      should_update_tile_priorities_(false) {
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  layer_tree_impl()->RegisterPictureLayerImpl(this);
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::~PictureLayerImpl() {
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  layer_tree_impl()->UnregisterPictureLayerImpl(this);
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* PictureLayerImpl::LayerTypeAsString() const {
87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return "cc::PictureLayerImpl";
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeImpl* tree_impl) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // It's possible this layer was never drawn or updated (e.g. because it was
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // a descendant of an opacity 0 layer).
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DoPostCommitInitializationIfNeeded();
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We have already synced the important bits from the the active layer, and
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // we will soon swap out its tilings and use them for recycling. However,
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // there are now tiles in this layer's tilings that were unref'd and replaced
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // with new tiles (due to invalidation). This resets all active priorities on
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // the to-be-recycled tiling to ensure replaced tiles don't linger and take
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // memory (due to a stale 'active' priority).
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (layer_impl->tilings_)
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_impl->tilings_->DidBecomeRecycled();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerImpl::PushPropertiesTo(base_layer);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // When the pending tree pushes to the active tree, the pending twin
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // becomes recycled.
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_impl->twin_layer_ = NULL;
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  twin_layer_ = NULL;
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1175b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  layer_impl->UpdatePile(pile_);
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!pile_->is_solid_color() || !tilings_->num_tilings());
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Tilings would be expensive to push, so we swap.
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layer_impl->tilings_.swap(tilings_);
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer_impl->tilings_->SetClient(layer_impl);
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (tilings_)
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tilings_->SetClient(this);
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Ensure that the recycle tree doesn't have any unshared tiles.
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (tilings_ && pile_->is_solid_color())
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tilings_->RemoveAllTilings();
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Remove invalidated tiles from what will become a recycle tree.
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (tilings_)
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    tilings_->RemoveTilesInRegion(invalidation_);
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_impl->raster_page_scale_ = raster_page_scale_;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_impl->raster_device_scale_ = raster_device_scale_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_impl->raster_source_scale_ = raster_source_scale_;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_impl->raster_contents_scale_ = raster_contents_scale_;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_;
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  layer_impl->needs_post_commit_initialization_ = false;
140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The invalidation on this soon-to-be-recycled layer must be cleared to
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // mirror clearing the invalidation in PictureLayer's version of this function
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // in case push properties is skipped.
144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  layer_impl->invalidation_.Swap(&invalidation_);
145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  invalidation_.Clear();
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  needs_post_commit_initialization_ = true;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We always need to push properties.
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See http://crbug.com/303943
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  needs_push_properties_ = true;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1535b892326406927b709cdaf6c384d4ababf456332Ben Murdochvoid PictureLayerImpl::UpdatePile(scoped_refptr<PicturePileImpl> pile) {
1545b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  bool could_have_tilings = CanHaveTilings();
1555b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  pile_.swap(pile);
1565b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
1575b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  // Need to call UpdateTiles again if CanHaveTilings changed.
1585b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  if (could_have_tilings != CanHaveTilings()) {
1595b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    layer_tree_impl()->set_needs_update_draw_properties();
1605b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
1615b892326406927b709cdaf6c384d4ababf456332Ben Murdoch}
1625b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PictureLayerImpl::AppendQuads(
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderPass* render_pass,
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const OcclusionTracker<LayerImpl>& occlusion_tracker,
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AppendQuadsData* append_quads_data) {
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(!needs_post_commit_initialization_);
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SharedQuadState* shared_quad_state =
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      render_pass->CreateAndAppendSharedQuadState();
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pile_->is_solid_color()) {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PopulateSharedQuadState(shared_quad_state);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AppendDebugBorderQuad(
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        render_pass, content_bounds(), shared_quad_state, append_quads_data);
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SolidColorLayerImpl::AppendSolidQuads(
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        render_pass,
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        occlusion_tracker,
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        shared_quad_state,
1825b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        visible_content_rect(),
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_properties().target_space_transform,
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        pile_->solid_color());
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float max_contents_scale = MaximumTilingContentsScale();
189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Transform scaled_draw_transform = draw_transform();
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale,
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              SK_MScalar1 / max_contents_scale);
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size scaled_content_bounds =
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), max_contents_scale));
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Rect scaled_visible_content_rect =
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      gfx::ScaleToEnclosingRect(visible_content_rect(), max_contents_scale);
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scaled_visible_content_rect.Intersect(gfx::Rect(scaled_content_bounds));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Occlusion occlusion =
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      occlusion_tracker.GetCurrentOcclusionForLayer(scaled_draw_transform);
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  shared_quad_state->SetAll(scaled_draw_transform,
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            scaled_content_bounds,
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            scaled_visible_content_rect,
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            draw_properties().clip_rect,
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            draw_properties().is_clipped,
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            draw_properties().opacity,
2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            blend_mode(),
2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            sorting_context_id_);
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (current_draw_mode_ == DRAW_MODE_RESOURCELESS_SOFTWARE) {
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AppendDebugBorderQuad(
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        render_pass,
2146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        scaled_content_bounds,
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        shared_quad_state,
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        append_quads_data,
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        DebugColors::DirectPictureBorderColor(),
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        DebugColors::DirectPictureBorderWidth(layer_tree_impl()));
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Rect geometry_rect = scaled_visible_content_rect;
221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect();
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Rect visible_geometry_rect =
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        occlusion.GetUnoccludedContentRect(geometry_rect);
2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (visible_geometry_rect.IsEmpty())
2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return;
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Size texture_size = scaled_visible_content_rect.size();
228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    gfx::RectF texture_rect = gfx::RectF(texture_size);
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Rect quad_content_rect = scaled_visible_content_rect;
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PictureDrawQuad* quad =
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    quad->SetNew(shared_quad_state,
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 geometry_rect,
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 opaque_rect,
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 visible_geometry_rect,
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 texture_rect,
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 texture_size,
239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 RGBA_8888,
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 quad_content_rect,
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 max_contents_scale,
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 pile_);
243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return;
244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AppendDebugBorderQuad(
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass, scaled_content_bounds, shared_quad_state, append_quads_data);
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShowDebugBorders()) {
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (PictureLayerTilingSet::CoverageIterator iter(
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             tilings_.get(),
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             max_contents_scale,
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             scaled_visible_content_rect,
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             ideal_contents_scale_);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         iter;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++iter) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SkColor color;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      float width;
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (*iter && iter->IsReadyToDraw()) {
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ManagedTileState::TileVersion::Mode mode =
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            iter->GetTileVersionForDrawing().mode();
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (mode == ManagedTileState::TileVersion::SOLID_COLOR_MODE) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          color = DebugColors::SolidColorTileBorderColor();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl());
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        } else if (mode == ManagedTileState::TileVersion::PICTURE_PILE_MODE) {
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          color = DebugColors::PictureTileBorderColor();
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          width = DebugColors::PictureTileBorderWidth(layer_tree_impl());
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        } else if (iter->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          color = DebugColors::HighResTileBorderColor();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width = DebugColors::HighResTileBorderWidth(layer_tree_impl());
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        } else if (iter->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) {
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          color = DebugColors::LowResTileBorderColor();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width = DebugColors::LowResTileBorderWidth(layer_tree_impl());
274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        } else if (iter->contents_scale() > max_contents_scale) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          color = DebugColors::ExtraHighResTileBorderColor();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          color = DebugColors::ExtraLowResTileBorderColor();
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width = DebugColors::ExtraLowResTileBorderWidth(layer_tree_impl());
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        color = DebugColors::MissingTileBorderColor();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        width = DebugColors::MissingTileBorderWidth(layer_tree_impl());
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DebugBorderDrawQuad* debug_border_quad =
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          render_pass->CreateAndAppendDrawQuad<DebugBorderDrawQuad>();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect geometry_rect = iter.geometry_rect();
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::Rect visible_geometry_rect = geometry_rect;
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      debug_border_quad->SetNew(shared_quad_state,
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                geometry_rect,
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                visible_geometry_rect,
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                color,
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                width);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Keep track of the tilings that were used so that tilings that are
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // unused can be considered for removal.
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<PictureLayerTiling*> seen_tilings;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Ignore missing tiles outside of viewport for tile priority. This is
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // normally the same as draw viewport but can be independently overridden by
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // embedders like Android WebView with SetExternalDrawConstraints.
30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Rect scaled_viewport_for_tile_priority = gfx::ScaleToEnclosingRect(
30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      GetViewportForTilePriorityInContentSpace(), max_contents_scale);
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t missing_tile_count = 0u;
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t on_demand_missing_tile_count = 0u;
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(),
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                    max_contents_scale,
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                    scaled_visible_content_rect,
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                    ideal_contents_scale_);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++iter) {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect geometry_rect = iter.geometry_rect();
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect();
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Rect visible_geometry_rect =
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        occlusion.GetUnoccludedContentRect(geometry_rect);
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (visible_geometry_rect.IsEmpty())
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      continue;
3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    append_quads_data->visible_content_area +=
3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        visible_geometry_rect.width() * visible_geometry_rect.height();
3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    bool has_draw_quad = false;
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (*iter && iter->IsReadyToDraw()) {
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const ManagedTileState::TileVersion& tile_version =
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          iter->GetTileVersionForDrawing();
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      switch (tile_version.mode()) {
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case ManagedTileState::TileVersion::RESOURCE_MODE: {
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          gfx::RectF texture_rect = iter.texture_rect();
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          // The raster_contents_scale_ is the best scale that the layer is
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          // trying to produce, even though it may not be ideal. Since that's
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          // the best the layer can promise in the future, consider those as
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          // complete. But if a tile is ideal scale, we don't want to consider
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          // it incomplete and trying to replace it with a tile at a worse
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          // scale.
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (iter->contents_scale() != raster_contents_scale_ &&
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              iter->contents_scale() != ideal_contents_scale_ &&
34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              geometry_rect.Intersects(scaled_viewport_for_tile_priority)) {
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            append_quads_data->num_incomplete_tiles++;
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          }
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          TileDrawQuad* quad =
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              render_pass->CreateAndAppendDrawQuad<TileDrawQuad>();
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          quad->SetNew(shared_quad_state,
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       geometry_rect,
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       opaque_rect,
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       visible_geometry_rect,
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       tile_version.get_resource_id(),
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       texture_rect,
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       iter.texture_size(),
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       tile_version.contents_swizzled());
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          has_draw_quad = true;
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          break;
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        }
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if (!layer_tree_impl()
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   ->GetRendererCapabilities()
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   .allow_rasterize_on_demand) {
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            ++on_demand_missing_tile_count;
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            break;
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          }
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          gfx::RectF texture_rect = iter.texture_rect();
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ResourceProvider* resource_provider =
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              layer_tree_impl()->resource_provider();
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ResourceFormat format =
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              resource_provider->memory_efficient_texture_format();
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          PictureDrawQuad* quad =
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          quad->SetNew(shared_quad_state,
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       geometry_rect,
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       opaque_rect,
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       visible_geometry_rect,
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       texture_rect,
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       iter.texture_size(),
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       format,
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       iter->content_rect(),
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       iter->contents_scale(),
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       pile_);
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          has_draw_quad = true;
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          break;
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        }
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          SolidColorDrawQuad* quad =
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          quad->SetNew(shared_quad_state,
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       geometry_rect,
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       visible_geometry_rect,
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       tile_version.get_solid_color(),
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       false);
39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          has_draw_quad = true;
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          break;
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        }
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
40203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!has_draw_quad) {
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (draw_checkerboard_for_missing_tiles()) {
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        CheckerboardDrawQuad* quad =
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SkColor color = DebugColors::DefaultCheckerboardColor();
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        quad->SetNew(
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            shared_quad_state, geometry_rect, visible_geometry_rect, color);
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkColor color = SafeOpaqueBackgroundColor();
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        SolidColorDrawQuad* quad =
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        quad->SetNew(shared_quad_state,
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     geometry_rect,
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     visible_geometry_rect,
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     color,
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     false);
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      if (geometry_rect.Intersects(scaled_viewport_for_tile_priority)) {
42103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        append_quads_data->num_missing_tiles++;
42203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ++missing_tile_count;
42303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }
4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      append_quads_data->approximated_visible_content_area +=
4255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          visible_geometry_rect.width() * visible_geometry_rect.height();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) {
4305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      append_quads_data->approximated_visible_content_area +=
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          visible_geometry_rect.width() * visible_geometry_rect.height();
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
434424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      seen_tilings.push_back(iter.CurrentTiling());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (missing_tile_count) {
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TRACE_EVENT_INSTANT2("cc",
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         "PictureLayerImpl::AppendQuads checkerboard",
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         TRACE_EVENT_SCOPE_THREAD,
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         "missing_tile_count",
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         missing_tile_count,
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         "on_demand_missing_tile_count",
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         on_demand_missing_tile_count);
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Aggressively remove any tilings that are not seen to save memory. Note
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that this is at the expense of doing cause more frequent re-painting. A
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // better scheme would be to maintain a tighter visible_content_rect for the
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // finer tilings.
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CleanUpTilingsOnActiveLayer(seen_tilings);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
45634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                   bool resourceless_software_draw) {
4576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTiles");
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(1.f, contents_scale_x());
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(1.f, contents_scale_y());
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoPostCommitInitializationIfNeeded();
46223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
46334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Any draw properties derived from |transform|, |viewport|, and |clip|
46434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // parameters in LayerTreeHostImpl::SetExternalDrawConstraints are not valid
46534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // for prioritizing tiles during resourceless software draws. This is because
46634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // resourceless software draws can have wildly different transforms/viewports
46734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // from regular draws.
46834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!resourceless_software_draw) {
46934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    visible_rect_for_tile_priority_ = visible_content_rect();
47034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  viewport_rect_for_tile_priority_ =
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      layer_tree_impl()->ViewportRectForTilePriority();
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  screen_space_transform_for_tile_priority_ = screen_space_transform();
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!CanHaveTilings()) {
4766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ideal_page_scale_ = 0.f;
4776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ideal_device_scale_ = 0.f;
4786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ideal_contents_scale_ = 0.f;
4796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ideal_source_scale_ = 0.f;
4806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    SanityCheckTilingState();
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
4826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
4836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  UpdateIdealScales();
4856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(tilings_->num_tilings() > 0 || raster_contents_scale_ == 0.f)
4876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      << "A layer with no tilings shouldn't have valid raster scales";
4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!raster_contents_scale_ || ShouldAdjustRasterScale()) {
4896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RecalculateRasterScales();
4906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    AddTilingsForRasterScale();
4916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
4926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(raster_page_scale_);
4946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(raster_device_scale_);
4956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(raster_source_scale_);
4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(raster_contents_scale_);
4976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(low_res_raster_contents_scale_);
4986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  was_screen_space_transform_animating_ =
5006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      draw_properties().screen_space_transform_is_animating;
5016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  should_update_tile_priorities_ = true;
5036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UpdateTilePriorities(occlusion_in_content_space);
5056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (layer_tree_impl()->IsPendingTree())
5076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    MarkVisibleResourcesAsRequired();
5086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
5096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PictureLayerImpl::UpdateTilePriorities(
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const Occlusion& occlusion_in_content_space) {
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!pile_->is_solid_color() || !tilings_->num_tilings());
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities");
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  double current_frame_time_in_seconds =
51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      (layer_tree_impl()->CurrentBeginFrameArgs().frame_time -
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       base::TimeTicks()).InSecondsF();
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
520ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  gfx::Rect viewport_rect_in_layer_space =
521ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch      GetViewportForTilePriorityInContentSpace();
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool tiling_needs_update = false;
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
524ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch    if (tilings_->tiling_at(i)->NeedsUpdateForFrameAtTimeAndViewport(
525ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch            current_frame_time_in_seconds, viewport_rect_in_layer_space)) {
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tiling_needs_update = true;
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!tiling_needs_update)
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  WhichTree tree =
53403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
53503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // they are the same space in picture lbayer, as contents scale is always 1.
53803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    tilings_->tiling_at(i)->UpdateTilePriorities(tree,
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 viewport_rect_in_layer_space,
54003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 ideal_contents_scale_,
54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 current_frame_time_in_seconds,
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 occlusion_in_content_space);
54303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
54403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
54503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Tile priorities were modified.
54603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  layer_tree_impl()->DidModifyTilePriorities();
54703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
54803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
54903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const {
5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If visible_rect_for_tile_priority_ is empty or
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // viewport_rect_for_tile_priority_ is set to be different from the device
5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // viewport, try to inverse project the viewport into layer space and use
5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // that. Otherwise just use visible_rect_for_tile_priority_
5540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Rect visible_rect_in_content_space = visible_rect_for_tile_priority_;
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (visible_rect_in_content_space.IsEmpty() ||
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      layer_tree_impl()->DeviceViewport() != viewport_rect_for_tile_priority_) {
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::Transform view_to_layer(gfx::Transform::kSkipInitialization);
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (screen_space_transform_for_tile_priority_.GetInverse(&view_to_layer)) {
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Transform from view space to content space.
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      visible_rect_in_content_space =
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              view_to_layer, viewport_rect_for_tile_priority_));
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return visible_rect_in_content_space;
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPictureLayerImpl* PictureLayerImpl::GetRecycledTwinLayer() {
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(vmpstr): Maintain recycled twin as a member. crbug.com/407418
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return static_cast<PictureLayerImpl*>(
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      layer_tree_impl()->FindRecycleTreeLayerById(id()));
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) {
5775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (layer_tree_impl()->IsActiveTree()) {
5785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    gfx::RectF layer_damage_rect =
5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale());
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    AddDamageRect(layer_damage_rect);
5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerImpl::DidBecomeActive() {
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerImpl::DidBecomeActive();
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tilings_->DidBecomeActive();
587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  layer_tree_impl()->DidModifyTilePriorities();
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void PictureLayerImpl::DidBeginTracing() {
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile_->DidBeginTracing();
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PictureLayerImpl::ReleaseResources() {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tilings_)
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    RemoveAllTilings();
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResetRasterScale();
599c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
600c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // To avoid an edge case after lost context where the tree is up to date but
601c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the tilings have not been managed, request an update draw properties
602c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // to force tilings to get managed.
603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layer_tree_impl()->set_needs_update_draw_properties();
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)skia::RefPtr<SkPicture> PictureLayerImpl::GetPicture() {
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return pile_->GetFlattenedPicture();
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<Tile> PictureLayerImpl::CreateTile(PictureLayerTiling* tiling,
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               const gfx::Rect& content_rect) {
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!pile_->is_solid_color());
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pile_->CanRaster(tiling->contents_scale(), content_rect))
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_refptr<Tile>();
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int flags = 0;
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(vmpstr): Revisit this. For now, enabling analysis means that we get as
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // much savings on memory as we can. However, for some cases like ganesh or
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // small layers, the amount of time we spend analyzing might not justify
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // memory savings that we can get. Note that we don't handle solid color
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // masks, so we shouldn't bother analyzing those.
6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Bugs: crbug.com/397198, crbug.com/396908
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!pile_->is_mask())
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags = Tile::USE_PICTURE_ANALYSIS;
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return layer_tree_impl()->tile_manager()->CreateTile(
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pile_.get(),
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_rect.size(),
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_rect,
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tiling->contents_scale(),
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      id(),
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      layer_tree_impl()->source_frame_number(),
634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      flags);
635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
637116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPicturePileImpl* PictureLayerImpl::GetPile() {
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return pile_.get();
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const Region* PictureLayerImpl::GetInvalidation() {
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return &invalidation_;
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PictureLayerTiling* PictureLayerImpl::GetTwinTiling(
646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const PictureLayerTiling* tiling) const {
647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!twin_layer_)
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return twin_layer_->tilings_->TilingAtScale(tiling->contents_scale());
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPictureLayerTiling* PictureLayerImpl::GetRecycledTwinTiling(
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const PictureLayerTiling* tiling) {
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PictureLayerImpl* recycled_twin = GetRecycledTwinLayer();
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!recycled_twin || !recycled_twin->tilings_)
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return recycled_twin->tilings_->TilingAtScale(tiling->contents_scale());
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t PictureLayerImpl::GetMaxTilesForInterestArea() const {
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return layer_tree_impl()->settings().max_tiles_for_interest_area;
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float PictureLayerImpl::GetSkewportTargetTimeInSeconds() const {
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  float skewport_target_time_in_frames =
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      layer_tree_impl()->use_gpu_rasterization()
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ? kGpuSkewportTargetTimeInFrames
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          : kCpuSkewportTargetTimeInFrames;
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return skewport_target_time_in_frames *
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         layer_tree_impl()->begin_impl_frame_interval().InSecondsF() *
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         layer_tree_impl()->settings().skewport_target_time_multiplier;
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const {
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return layer_tree_impl()
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ->settings()
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .skewport_extrapolation_limit_in_content_pixels;
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PictureLayerImpl::CalculateTileSize(
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size& content_bounds) const {
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int max_texture_size =
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer_tree_impl()->resource_provider()->max_texture_size();
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pile_->is_mask()) {
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Masks are not tiled, so if we can't cover the whole mask with one tile,
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // don't make any tiles at all. Returning an empty size signals this.
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (content_bounds.width() > max_texture_size ||
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content_bounds.height() > max_texture_size)
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return gfx::Size();
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return content_bounds;
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size default_tile_size = layer_tree_impl()->settings().default_tile_size;
695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (layer_tree_impl()->use_gpu_rasterization()) {
6965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // TODO(ernstm) crbug.com/365877: We need a unified way to override the
6975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // default-tile-size.
6985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default_tile_size =
6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        gfx::Size(layer_tree_impl()->device_viewport_size().width(),
7005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                  layer_tree_impl()->device_viewport_size().height() / 4);
7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  default_tile_size.SetToMin(gfx::Size(max_texture_size, max_texture_size));
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size max_untiled_content_size =
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_impl()->settings().max_untiled_layer_size;
706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  max_untiled_content_size.SetToMin(
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Size(max_texture_size, max_texture_size));
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool any_dimension_too_large =
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_bounds.width() > max_untiled_content_size.width() ||
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_bounds.height() > max_untiled_content_size.height();
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool any_dimension_one_tile =
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_bounds.width() <= default_tile_size.width() ||
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_bounds.height() <= default_tile_size.height();
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If long and skinny, tile at the max untiled content size, and clamp
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the smaller dimension to the content size, e.g. 1000x12 layer with
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 500x500 max untiled size would get 500x12 tiles.  Also do this
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the layer is small.
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (any_dimension_one_tile || !any_dimension_too_large) {
7225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int width = std::min(
7235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        std::max(max_untiled_content_size.width(), default_tile_size.width()),
7245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        content_bounds.width());
7255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int height = std::min(
7265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        std::max(max_untiled_content_size.height(), default_tile_size.height()),
7275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        content_bounds.height());
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Round up to the closest multiple of 64. This improves recycling and
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // avoids odd texture sizes.
730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    width = RoundUp(width, 64);
731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    height = RoundUp(height, 64);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size(width, height);
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return default_tile_size;
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
738bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TRACE_EVENT0("cc", "SyncFromActiveLayer");
7403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(!other->needs_post_commit_initialization_);
7413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(other->tilings_);
7423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!DrawsContent()) {
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    RemoveAllTilings();
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  raster_page_scale_ = other->raster_page_scale_;
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  raster_device_scale_ = other->raster_device_scale_;
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  raster_source_scale_ = other->raster_source_scale_;
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  raster_contents_scale_ = other->raster_contents_scale_;
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  low_res_raster_contents_scale_ = other->low_res_raster_contents_scale_;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool synced_high_res_tiling = false;
755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (CanHaveTilings()) {
756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    synced_high_res_tiling = tilings_->SyncTilings(
757c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        *other->tilings_, bounds(), invalidation_, MinimumContentsScale());
758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    RemoveAllTilings();
760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
761424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If our MinimumContentsScale has changed to prevent the twin's high res
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // tiling from being synced, we should reset the raster scale and let it be
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // recalculated (1) again. This can happen if our bounds shrink to the point
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // where min contents scale grows.
766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // (1) - TODO(vmpstr) Instead of hoping that this will be recalculated, we
767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // should refactor this code a little bit and actually recalculate this.
768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // However, this is a larger undertaking, so this will work for now.
769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!synced_high_res_tiling)
770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ResetRasterScale();
771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SanityCheckTilingState();
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerImpl::SyncTiling(
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const PictureLayerTiling* tiling) {
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!CanHaveTilingWithScale(tiling->contents_scale()))
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tilings_->AddTiling(tiling->contents_scale());
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If this tree needs update draw properties, then the tiling will
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // get updated prior to drawing or activation.  If this tree does not
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // need update draw properties, then its transforms are up to date and
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we can create tiles for this tiling immediately.
7851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!layer_tree_impl()->needs_update_draw_properties() &&
7865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      should_update_tile_priorities_) {
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // TODO(danakj): Add a DCHECK() that we are not using occlusion tracking
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // when we stop using the pending tree in the browser compositor. If we want
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // to support occlusion tracking here, we need to dirty the draw properties
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // or save occlusion as a draw property.
7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateTilePriorities(Occlusion());
7925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceProvider::ResourceId PictureLayerImpl::ContentsResourceId() const {
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect content_rect(content_bounds());
7973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PictureLayerTilingSet::CoverageIterator iter(
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tilings_.get(), 1.f, content_rect, ideal_contents_scale_);
799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Mask resource not ready yet.
8013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!iter || !*iter)
8023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return 0;
803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Masks only supported if they fit on exactly one tile.
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(iter.geometry_rect() == content_rect)
8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "iter rect " << iter.geometry_rect().ToString() << " content rect "
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << content_rect.ToString();
808868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const ManagedTileState::TileVersion& tile_version =
8103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      iter->GetTileVersionForDrawing();
8113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!tile_version.IsReadyToDraw() ||
8123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE)
8133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return 0;
8143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return tile_version.get_resource_id();
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(layer_tree_impl()->IsPendingTree());
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(ideal_contents_scale_);
82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_GT(tilings_->num_tilings(), 0u);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The goal of this function is to find the minimum set of tiles that need to
824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // be ready to draw in order to activate without flashing content from a
825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // higher res on the active tree to a lower res on the pending tree.
826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
827f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // First, early out for layers with no visible content.
82834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (visible_rect_for_tile_priority_.IsEmpty())
829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
83103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Only mark tiles inside the viewport for tile priority as required for
83203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // activation. This viewport is normally the same as the draw viewport but
83303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // can be independently overridden by embedders like Android WebView with
83403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // SetExternalDrawConstraints.
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect rect = GetViewportForTilePriorityInContentSpace();
83634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  rect.Intersect(visible_rect_for_tile_priority_);
83703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float min_acceptable_scale =
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::min(raster_contents_scale_, ideal_contents_scale_);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (PictureLayerImpl* twin = twin_layer_) {
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float twin_min_acceptable_scale =
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::min(twin->ideal_contents_scale_, twin->raster_contents_scale_);
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Ignore 0 scale in case CalculateContentsScale() has never been
845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // called for active twin.
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (twin_min_acceptable_scale != 0.0f) {
847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      min_acceptable_scale =
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::min(min_acceptable_scale, twin_min_acceptable_scale);
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PictureLayerTiling* high_res = NULL;
853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PictureLayerTiling* low_res = NULL;
854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // First pass: ready to draw tiles in acceptable but non-ideal tilings are
856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // marked as required for activation so that their textures are not thrown
857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // away; any non-ready tiles are not marked as required.
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Region missing_region = rect;
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PictureLayerTiling* tiling = tilings_->tiling_at(i);
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(tiling->has_ever_been_updated());
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (tiling->resolution() == LOW_RESOLUTION) {
864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DCHECK(!low_res) << "There can only be one low res tiling";
865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      low_res = tiling;
866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tiling->contents_scale() < min_acceptable_scale)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (tiling->resolution() == HIGH_RESOLUTION) {
87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DCHECK(!high_res) << "There can only be one high res tiling";
87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      high_res = tiling;
87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      continue;
87390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter;
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++iter) {
8767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (!*iter || !iter->IsReadyToDraw())
87790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        continue;
878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      missing_region.Subtract(iter.geometry_rect());
8803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      iter->MarkRequiredForActivation();
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(high_res) << "There must be one high res tiling";
884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // If these pointers are null (because no twin, no matching tiling, or the
886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // simpification just below), then high res tiles will be required to fill any
887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // holes left by the first pass above.  If the pointers are valid, then this
888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // layer is allowed to skip any tiles that are not ready on its twin.
889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const PictureLayerTiling* twin_high_res = NULL;
890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const PictureLayerTiling* twin_low_res = NULL;
891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (twin_layer_) {
893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // As a simplification, only allow activating to skip twin tiles that the
894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // active layer is also missing when both this layer and its twin have
895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // "simple" sets of tilings: only 2 tilings (high and low) or only 1 high
896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // res tiling. This avoids having to iterate/track coverage of non-ideal
897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // tilings during the last draw call on the active layer.
898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (tilings_->num_tilings() <= 2 &&
899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        twin_layer_->tilings_->num_tilings() <= tilings_->num_tilings()) {
900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      twin_low_res = low_res ? GetTwinTiling(low_res) : NULL;
901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      twin_high_res = high_res ? GetTwinTiling(high_res) : NULL;
902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // If this layer and its twin have different transforms, then don't compare
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // them and only allow activating to high res tiles, since tiles on each
906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // layer will be in different places on screen.
907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (twin_layer_->layer_tree_impl()->RequiresHighResToDraw() ||
908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        bounds() != twin_layer_->bounds() ||
909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        draw_properties().screen_space_transform !=
910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            twin_layer_->draw_properties().screen_space_transform) {
911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      twin_high_res = NULL;
912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      twin_low_res = NULL;
913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // As a second pass, mark as required any visible high res tiles not filled in
917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // by acceptable non-ideal tiles from the first pass.
918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (MarkVisibleTilesAsRequired(
9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          high_res, twin_high_res, rect, missing_region)) {
920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // As an optional third pass, if a high res tile was skipped because its
921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // twin was also missing, then fall back to mark low res tiles as required
922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // in case the active twin is substituting those for missing high res
923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // content. Only suitable, when low res is enabled.
924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (low_res) {
9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MarkVisibleTilesAsRequired(low_res, twin_low_res, rect, missing_region);
926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PictureLayerImpl::MarkVisibleTilesAsRequired(
931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    PictureLayerTiling* tiling,
932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const PictureLayerTiling* optional_twin_tiling,
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const Region& missing_region) const {
935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool twin_had_missing_tile = false;
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter;
93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       ++iter) {
938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Tile* tile = *iter;
93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // A null tile (i.e. missing recording) can just be skipped.
940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!tile)
941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      continue;
942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // If the tile is occluded, don't mark it as required for activation.
944116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (tile->is_occluded(PENDING_TREE))
945116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue;
946116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // If the missing region doesn't cover it, this tile is fully
94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // covered by acceptable tiles at other scales.
949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!missing_region.Intersects(iter.geometry_rect()))
95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      continue;
95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // If the twin tile doesn't exist (i.e. missing recording or so far away
953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // that it is outside the visible tile rect) or this tile is shared between
954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // with the twin, then this tile isn't required to prevent flashing.
955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (optional_twin_tiling) {
9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Tile* twin_tile = optional_twin_tiling->TileAt(iter.i(), iter.j());
957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (!twin_tile || twin_tile == tile) {
9581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        // However if the shared tile is being used on the active tree, then
9591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        // there's no missing content in this place, and low res is not needed.
9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!twin_tile || !twin_tile->IsReadyToDraw())
9611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          twin_had_missing_tile = true;
962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        continue;
963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    tile->MarkRequiredForActivation();
9673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return twin_had_missing_tile;
9693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
9703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void PictureLayerImpl::DoPostCommitInitialization() {
9723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(needs_post_commit_initialization_);
9733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(layer_tree_impl()->IsPendingTree());
9743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!tilings_)
9763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    tilings_.reset(new PictureLayerTilingSet(this, bounds()));
9773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(!twin_layer_);
9793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  twin_layer_ = static_cast<PictureLayerImpl*>(
9803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      layer_tree_impl()->FindActiveTreeLayerById(id()));
9813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (twin_layer_) {
9823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!twin_layer_->twin_layer_);
9833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    twin_layer_->twin_layer_ = this;
9843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // If the twin has never been pushed to, do not sync from it.
9853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // This can happen if this function is called during activation.
9863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!twin_layer_->needs_post_commit_initialization_)
9873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncFromActiveLayer(twin_layer_);
98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
9893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  needs_post_commit_initialization_ = false;
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) {
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(CanHaveTilingWithScale(contents_scale)) <<
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "contents_scale: " << contents_scale;
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PictureLayerTiling* tiling = tilings_->AddTiling(contents_scale);
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(pile_->HasRecordings());
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (twin_layer_)
100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    twin_layer_->SyncTiling(tiling);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tiling;
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerImpl::RemoveTiling(float contents_scale) {
10085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!tilings_ || tilings_->num_tilings() == 0)
10095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
10105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PictureLayerTiling* tiling = tilings_->tiling_at(i);
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tiling->contents_scale() == contents_scale) {
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tilings_->Remove(tiling);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (tilings_->num_tilings() == 0)
1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ResetRasterScale();
1020424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SanityCheckTilingState();
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PictureLayerImpl::RemoveAllTilings() {
1024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (tilings_)
1025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    tilings_->RemoveAllTilings();
1026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If there are no tilings, then raster scales are no longer meaningful.
1027f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ResetRasterScale();
1028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inline float PositiveRatio(float float1, float float2) {
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_GT(float1, 0);
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_GT(float2, 0);
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return float1 > float2 ? float1 / float2 : float2 / float1;
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void PictureLayerImpl::AddTilingsForRasterScale() {
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PictureLayerTiling* high_res = NULL;
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PictureLayerTiling* low_res = NULL;
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PictureLayerTiling* previous_low_res = NULL;
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PictureLayerTiling* tiling = tilings_->tiling_at(i);
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (tiling->contents_scale() == raster_contents_scale_)
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_res = tiling;
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (tiling->contents_scale() == low_res_raster_contents_scale_)
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      low_res = tiling;
1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (tiling->resolution() == LOW_RESOLUTION)
1052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      previous_low_res = tiling;
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Reset all tilings to non-ideal until the end of this function.
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tiling->set_resolution(NON_IDEAL_RESOLUTION);
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!high_res) {
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    high_res = AddTiling(raster_contents_scale_);
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (raster_contents_scale_ == low_res_raster_contents_scale_)
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      low_res = high_res;
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1063868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1064868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Only create new low res tilings when the transform is static.  This
1065868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // prevents wastefully creating a paired low res tiling for every new high res
1066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // tiling during a pinch or a CSS animation.
1067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_pinching = layer_tree_impl()->PinchGestureActive();
1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (layer_tree_impl()->create_low_res_tiling() && !is_pinching &&
10696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      !draw_properties().screen_space_transform_is_animating && !low_res &&
10706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      low_res != high_res)
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    low_res = AddTiling(low_res_raster_contents_scale_);
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set low-res if we have one.
1074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!low_res)
1075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    low_res = previous_low_res;
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (low_res && low_res != high_res)
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    low_res->set_resolution(LOW_RESOLUTION);
1078f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make sure we always have one high-res (even if high == low).
1080f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  high_res->set_resolution(HIGH_RESOLUTION);
1081424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1082424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SanityCheckTilingState();
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool PictureLayerImpl::ShouldAdjustRasterScale() const {
10866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (was_screen_space_transform_animating_ !=
10876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      draw_properties().screen_space_transform_is_animating)
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (draw_properties().screen_space_transform_is_animating &&
109103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      raster_contents_scale_ != ideal_contents_scale_ &&
109203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ShouldAdjustRasterScaleDuringScaleAnimations())
109303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return true;
109403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_pinching = layer_tree_impl()->PinchGestureActive();
1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (is_pinching && raster_page_scale_) {
1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // We change our raster scale when it is:
1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // - Higher than ideal (need a lower-res tiling available)
1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // - Too far from ideal (need a higher-res tiling available)
1100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    float ratio = ideal_page_scale_ / raster_page_scale_;
1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (raster_page_scale_ > ideal_page_scale_ ||
1102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ratio > kMaxScaleRatioDuringPinch)
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!is_pinching) {
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // When not pinching, match the ideal page scale factor.
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (raster_page_scale_ != ideal_page_scale_)
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Always match the ideal device scale factor.
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (raster_device_scale_ != ideal_device_scale_)
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // When the source scale changes we want to match it, but not when animating
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // or when we've fixed the scale in place.
11186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!draw_properties().screen_space_transform_is_animating &&
11196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      !raster_source_scale_is_fixed_ &&
1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      raster_source_scale_ != ideal_source_scale_)
1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return true;
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)float PictureLayerImpl::SnappedContentsScale(float scale) {
1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If a tiling exists within the max snapping ratio, snap to its scale.
1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float snapped_contents_scale = scale;
1129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float snapped_ratio = kSnapToExistingTilingRatio;
1130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
1131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    float tiling_contents_scale = tilings_->tiling_at(i)->contents_scale();
1132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    float ratio = PositiveRatio(tiling_contents_scale, scale);
1133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (ratio < snapped_ratio) {
1134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      snapped_contents_scale = tiling_contents_scale;
1135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      snapped_ratio = ratio;
1136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
1137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return snapped_contents_scale;
1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void PictureLayerImpl::RecalculateRasterScales() {
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  float old_raster_contents_scale = raster_contents_scale_;
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  float old_raster_page_scale = raster_page_scale_;
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  float old_raster_source_scale = raster_source_scale_;
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  raster_device_scale_ = ideal_device_scale_;
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  raster_page_scale_ = ideal_page_scale_;
1148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  raster_source_scale_ = ideal_source_scale_;
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  raster_contents_scale_ = ideal_contents_scale_;
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If we're not animating, or leaving an animation, and the
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ideal_source_scale_ changes, then things are unpredictable, and we fix
1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // the raster_source_scale_ in place.
11546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (old_raster_source_scale &&
11556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      !draw_properties().screen_space_transform_is_animating &&
11566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      !was_screen_space_transform_animating_ &&
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      old_raster_source_scale != ideal_source_scale_)
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    raster_source_scale_is_fixed_ = true;
1159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(danakj): Adjust raster source scale closer to ideal source scale at
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // a throttled rate. Possibly make use of invalidation_.IsEmpty() on pending
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // tree. This will allow CSS scale changes to get re-rastered at an
11631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // appropriate rate. (crbug.com/413636)
1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (raster_source_scale_is_fixed_) {
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    raster_contents_scale_ /= raster_source_scale_;
1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    raster_source_scale_ = 1.f;
1167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // During pinch we completely ignore the current ideal scale, and just use
1170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // a multiple of the previous scale.
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(danakj): This seems crazy, we should use the current ideal, no?
1172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool is_pinching = layer_tree_impl()->PinchGestureActive();
1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (is_pinching && old_raster_contents_scale) {
1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // See ShouldAdjustRasterScale:
1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // - When zooming out, preemptively create new tiling at lower resolution.
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // - When zooming in, approximate ideal using multiple of kMaxScaleRatio.
1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool zooming_out = old_raster_page_scale > ideal_page_scale_;
1178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    float desired_contents_scale =
1179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        zooming_out ? old_raster_contents_scale / kMaxScaleRatioDuringPinch
1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    : old_raster_contents_scale * kMaxScaleRatioDuringPinch;
1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    raster_contents_scale_ = SnappedContentsScale(desired_contents_scale);
1182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    raster_page_scale_ =
1183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        raster_contents_scale_ / raster_device_scale_ / raster_source_scale_;
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  raster_contents_scale_ =
11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::max(raster_contents_scale_, MinimumContentsScale());
11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
118903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // If we're not re-rasterizing during animation, rasterize at the maximum
1190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // scale that will occur during the animation, if the maximum scale is
11911675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // known. However we want to avoid excessive memory use. If the scale is
11921675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // smaller than what we would choose otherwise, then it's always better off
11931675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // for us memory-wise. But otherwise, we don't choose a scale at which this
11941675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // layer's rastered content would become larger than the viewport.
119503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (draw_properties().screen_space_transform_is_animating &&
119603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      !ShouldAdjustRasterScaleDuringScaleAnimations()) {
11975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool can_raster_at_maximum_scale = false;
11981675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // TODO(ajuma): If we need to deal with scale-down animations starting right
11991675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // as a layer gets promoted, then we'd want to have the
12001675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // |starting_animation_contents_scale| passed in here as a separate draw
12011675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // property so we could try use that when the max is too large.
12021675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // See crbug.com/422341.
12031675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    float maximum_scale = draw_properties().maximum_animation_contents_scale;
12041675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    if (maximum_scale) {
12051675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      gfx::Size bounds_at_maximum_scale =
12061675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch          gfx::ToCeiledSize(gfx::ScaleSize(bounds(), maximum_scale));
12075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (bounds_at_maximum_scale.GetArea() <=
12085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          layer_tree_impl()->device_viewport_size().GetArea())
12095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        can_raster_at_maximum_scale = true;
12105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
12111675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // Use the computed scales for the raster scale directly, do not try to use
12121675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // the ideal scale here. The current ideal scale may be way too large in the
12131675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    // case of an animation with scale, and will be constantly changing.
12141675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    if (can_raster_at_maximum_scale)
12151675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      raster_contents_scale_ = maximum_scale;
12161675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    else
12171675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      raster_contents_scale_ = 1.f * ideal_page_scale_ * ideal_device_scale_;
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If this layer would create zero or one tiles at this content scale,
12217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // don't create a low res tiling.
12227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Size content_bounds =
1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::ToCeiledSize(gfx::ScaleSize(bounds(), raster_contents_scale_));
12247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Size tile_size = CalculateTileSize(content_bounds);
12251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool tile_covers_bounds = tile_size.width() >= content_bounds.width() &&
12261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            tile_size.height() >= content_bounds.height();
12271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (tile_size.IsEmpty() || tile_covers_bounds) {
1228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    low_res_raster_contents_scale_ = raster_contents_scale_;
12297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
12307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
12317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float low_res_factor =
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_impl()->settings().low_res_contents_scale_factor;
1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  low_res_raster_contents_scale_ = std::max(
1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      raster_contents_scale_ * low_res_factor,
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MinimumContentsScale());
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerImpl::CleanUpTilingsOnActiveLayer(
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<PictureLayerTiling*> used_tilings) {
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(layer_tree_impl()->IsActiveTree());
1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (tilings_->num_tilings() == 0)
1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float min_acceptable_high_res_scale = std::min(
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      raster_contents_scale_, ideal_contents_scale_);
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float max_acceptable_high_res_scale = std::max(
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      raster_contents_scale_, ideal_contents_scale_);
1249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float twin_low_res_scale = 0.f;
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PictureLayerImpl* twin = twin_layer_;
12526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (twin && twin->CanHaveTilings()) {
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    min_acceptable_high_res_scale = std::min(
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        min_acceptable_high_res_scale,
1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::min(twin->raster_contents_scale_, twin->ideal_contents_scale_));
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    max_acceptable_high_res_scale = std::max(
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        max_acceptable_high_res_scale,
1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::max(twin->raster_contents_scale_, twin->ideal_contents_scale_));
1259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for (size_t i = 0; i < twin->tilings_->num_tilings(); ++i) {
1261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PictureLayerTiling* tiling = twin->tilings_->tiling_at(i);
1262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (tiling->resolution() == LOW_RESOLUTION)
1263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        twin_low_res_scale = tiling->contents_scale();
1264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<PictureLayerTiling*> to_remove;
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PictureLayerTiling* tiling = tilings_->tiling_at(i);
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Keep multiple high resolution tilings even if not used to help
12727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // activate earlier at non-ideal resolutions.
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tiling->contents_scale() >= min_acceptable_high_res_scale &&
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tiling->contents_scale() <= max_acceptable_high_res_scale)
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Keep low resolution tilings, if the layer should have them.
1278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (layer_tree_impl()->create_low_res_tiling()) {
1279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (tiling->resolution() == LOW_RESOLUTION ||
1280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          tiling->contents_scale() == twin_low_res_scale)
1281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        continue;
1282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Don't remove tilings that are being used (and thus would cause a flash.)
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (std::find(used_tilings.begin(), used_tilings.end(), tiling) !=
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        used_tilings.end())
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    to_remove.push_back(tiling);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (to_remove.empty())
12935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
12945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PictureLayerImpl* recycled_twin = GetRecycledTwinLayer();
12965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Remove tilings on this tree and the twin tree.
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < to_remove.size(); ++i) {
1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const PictureLayerTiling* twin_tiling = GetTwinTiling(to_remove[i]);
1299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Only remove tilings from the twin layer if they have
1300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // NON_IDEAL_RESOLUTION.
1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (twin_tiling && twin_tiling->resolution() == NON_IDEAL_RESOLUTION)
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      twin->RemoveTiling(to_remove[i]->contents_scale());
13035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Remove the tiling from the recycle tree. Note that we ignore resolution,
13045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // since we don't need to maintain high/low res on the recycle tree.
13055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (recycled_twin)
13065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      recycled_twin->RemoveTiling(to_remove[i]->contents_scale());
1307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // TODO(enne): temporary sanity CHECK for http://crbug.com/358350
1308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    CHECK_NE(HIGH_RESOLUTION, to_remove[i]->resolution());
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tilings_->Remove(to_remove[i]);
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
13125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK_GT(tilings_->num_tilings(), 0u);
1313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SanityCheckTilingState();
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float PictureLayerImpl::MinimumContentsScale() const {
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float setting_min = layer_tree_impl()->settings().minimum_contents_scale;
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the contents scale is less than 1 / width (also for height),
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then it will end up having less than one pixel of content in that
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // dimension.  Bump the minimum contents scale up in this case to prevent
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this from happening.
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_dimension = std::min(bounds().width(), bounds().height());
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!min_dimension)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return setting_min;
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::max(1.f / min_dimension, setting_min);
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PictureLayerImpl::ResetRasterScale() {
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  raster_page_scale_ = 0.f;
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  raster_device_scale_ = 0.f;
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  raster_source_scale_ = 0.f;
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  raster_contents_scale_ = 0.f;
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  low_res_raster_contents_scale_ = 0.f;
1336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  raster_source_scale_is_fixed_ = false;
1337d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1338d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // When raster scales aren't valid, don't update tile priorities until
1339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // this layer has been updated via UpdateDrawProperties.
1340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  should_update_tile_priorities_ = false;
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool PictureLayerImpl::CanHaveTilings() const {
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pile_->is_solid_color())
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
134690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!DrawsContent())
134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
134823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!pile_->HasRecordings())
134990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
135190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool PictureLayerImpl::CanHaveTilingWithScale(float contents_scale) const {
135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!CanHaveTilings())
135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
135690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (contents_scale < MinimumContentsScale())
135790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void PictureLayerImpl::SanityCheckTilingState() const {
1362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if DCHECK_IS_ON
13635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Recycle tree doesn't have any restrictions.
13645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (layer_tree_impl()->IsRecycleTree())
13655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
13665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1367424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!CanHaveTilings()) {
1368424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK_EQ(0u, tilings_->num_tilings());
1369424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
1370424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1371424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (tilings_->num_tilings() == 0)
1372424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
1373424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1374424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // MarkVisibleResourcesAsRequired depends on having exactly 1 high res
1375424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // tiling to mark its tiles as being required for activation.
1376424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK_EQ(1, tilings_->NumHighResTilings());
1377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
1378424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
138003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool PictureLayerImpl::ShouldAdjustRasterScaleDuringScaleAnimations() const {
138103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!layer_tree_impl()->use_gpu_rasterization())
138203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return false;
138303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
138403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Re-rastering text at different scales using GPU rasterization causes
138503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // texture uploads for glyphs at each scale (see crbug.com/366225). To
138603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // workaround this performance issue, we don't re-rasterize layers with
138703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // text during scale animations.
138803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(ajuma): Remove this workaround once text can be efficiently
138903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // re-rastered at different scales (e.g. by using distance-field fonts).
139003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (pile_->has_text())
139103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return false;
139203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
139303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return true;
139403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
139503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)float PictureLayerImpl::MaximumTilingContentsScale() const {
1397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float max_contents_scale = MinimumContentsScale();
1398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
1399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const PictureLayerTiling* tiling = tilings_->tiling_at(i);
1400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    max_contents_scale = std::max(max_contents_scale, tiling->contents_scale());
1401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return max_contents_scale;
1403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PictureLayerImpl::UpdateIdealScales() {
14066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(CanHaveTilings());
1407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float min_contents_scale = MinimumContentsScale();
1409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK_GT(min_contents_scale, 0.f);
1410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float min_page_scale = layer_tree_impl()->min_page_scale_factor();
1411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK_GT(min_page_scale, 0.f);
1412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float min_device_scale = 1.f;
1413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float min_source_scale =
1414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      min_contents_scale / min_page_scale / min_device_scale;
1415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float ideal_page_scale = draw_properties().page_scale_factor;
1417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float ideal_device_scale = draw_properties().device_scale_factor;
1418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  float ideal_source_scale = draw_properties().ideal_contents_scale /
1419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             ideal_page_scale / ideal_device_scale;
1420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ideal_contents_scale_ =
1421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      std::max(draw_properties().ideal_contents_scale, min_contents_scale);
1422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ideal_page_scale_ = draw_properties().page_scale_factor;
1423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ideal_device_scale_ = draw_properties().device_scale_factor;
1424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ideal_source_scale_ = std::max(ideal_source_scale, min_source_scale);
1425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerImpl::GetDebugBorderProperties(
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkColor* color,
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float* width) const {
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *color = DebugColors::TiledContentLayerBorderColor();
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *width = DebugColors::TiledContentLayerBorderWidth(layer_tree_impl());
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PictureLayerImpl::GetAllTilesForTracing(
14351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::set<const Tile*>* tiles) const {
14361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!tilings_)
14371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
14381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < tilings_->num_tilings(); ++i)
14401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tilings_->tiling_at(i)->GetAllTilesForTracing(tiles);
14411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void PictureLayerImpl::AsValueInto(base::debug::TracedValue* state) const {
14440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const_cast<PictureLayerImpl*>(this)->DoPostCommitInitializationIfNeeded();
1445b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  LayerImpl::AsValueInto(state);
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state->SetDouble("ideal_contents_scale", ideal_contents_scale_);
1447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  state->SetDouble("geometry_contents_scale", MaximumTilingContentsScale());
14485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->BeginArray("tilings");
14495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  tilings_->AsValueInto(state);
14505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->EndArray();
14515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->BeginArray("tile_priority_rect");
14531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MathUtil::AddToTracedValue(GetViewportForTilePriorityInContentSpace(), state);
14541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->EndArray();
14551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->BeginArray("visible_rect");
14571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MathUtil::AddToTracedValue(visible_content_rect(), state);
14581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  state->EndArray();
14591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->BeginArray("pictures");
14615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pile_->AsValueInto(state);
14625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->EndArray();
14635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->BeginArray("invalidation");
14655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  invalidation_.AsValueInto(state);
14665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->EndArray();
1467ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
14685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->BeginArray("coverage_tiles");
1469ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(),
14701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    1.f,
1471d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                    gfx::Rect(content_bounds()),
1472ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                    ideal_contents_scale_);
1473ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       iter;
1474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       ++iter) {
14755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    state->BeginDictionary();
14765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    state->BeginArray("geometry_rect");
14785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MathUtil::AddToTracedValue(iter.geometry_rect(), state);
14795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    state->EndArray();
14805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1481ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (*iter)
14825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      TracedValue::SetIDRef(*iter, state, "tile");
1483ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
14845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    state->EndDictionary();
1485ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
14865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  state->EndArray();
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
148990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)size_t PictureLayerImpl::GPUMemoryUsageInBytes() const {
14900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const_cast<PictureLayerImpl*>(this)->DoPostCommitInitializationIfNeeded();
149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return tilings_->GPUMemoryUsageInBytes();
149290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
149390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PictureLayerImpl::RunMicroBenchmark(MicroBenchmarkImpl* benchmark) {
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  benchmark->RunOnLayer(this);
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
149823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)WhichTree PictureLayerImpl::GetTree() const {
149923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
150023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
150123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
150223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
150323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return !layer_tree_impl()->IsRecycleTree();
150423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
150523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool PictureLayerImpl::HasValidTilePriorities() const {
1507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return IsOnActiveOrPendingTree() && IsDrawnRenderSurfaceLayerListMember();
1508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
1511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!layer_tree_impl()->IsPendingTree())
1512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
1513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!HasValidTilePriorities())
1515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
1516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!tilings_)
1518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
1519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
152034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (visible_rect_for_tile_priority_.IsEmpty())
1521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
1522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
152334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  gfx::Rect rect = GetViewportForTilePriorityInContentSpace();
152434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  rect.Intersect(visible_rect_for_tile_priority_);
152534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
1526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
1527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PictureLayerTiling* tiling = tilings_->tiling_at(i);
1528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (tiling->resolution() != HIGH_RESOLUTION &&
1529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        tiling->resolution() != LOW_RESOLUTION)
1530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      continue;
1531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, rect); iter;
1533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         ++iter) {
1534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const Tile* tile = *iter;
1535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // A null tile (i.e. missing recording) can just be skipped.
1536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!tile)
1537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        continue;
1538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (tile->required_for_activation() && !tile->IsReadyToDraw())
1540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return false;
1541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
1545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
154723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator()
15485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : layer_(NULL), current_stage_(arraysize(stages_)) {
15495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
155023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
155123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator(
155223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    PictureLayerImpl* layer,
155323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bool prioritize_low_res)
155423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    : layer_(layer), current_stage_(0) {
155523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(layer_);
1556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Early out if the layer has no tilings.
1558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) {
1559a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    current_stage_ = arraysize(stages_);
156023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
1561a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
156223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Tiles without valid priority are treated as having lowest priority and
1564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // never considered for raster.
1565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!layer_->HasValidTilePriorities()) {
1566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    current_stage_ = arraysize(stages_);
1567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
1568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WhichTree tree = layer_->GetTree();
157123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
157223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Find high and low res tilings and initialize the iterators.
157323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (size_t i = 0; i < layer_->tilings_->num_tilings(); ++i) {
157423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    PictureLayerTiling* tiling = layer_->tilings_->tiling_at(i);
157523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (tiling->resolution() == HIGH_RESOLUTION) {
157623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      iterators_[HIGH_RES] =
157723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          PictureLayerTiling::TilingRasterTileIterator(tiling, tree);
157823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
157923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
158023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (tiling->resolution() == LOW_RESOLUTION) {
158123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      iterators_[LOW_RES] =
158223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          PictureLayerTiling::TilingRasterTileIterator(tiling, tree);
158323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
158423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
158523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
158623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (prioritize_low_res) {
158723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    stages_[0].iterator_type = LOW_RES;
1588e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    stages_[0].tile_type = TilePriority::NOW;
158923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
159023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    stages_[1].iterator_type = HIGH_RES;
1591e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    stages_[1].tile_type = TilePriority::NOW;
159223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  } else {
159323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    stages_[0].iterator_type = HIGH_RES;
1594e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    stages_[0].tile_type = TilePriority::NOW;
159523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
159623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    stages_[1].iterator_type = LOW_RES;
1597e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    stages_[1].tile_type = TilePriority::NOW;
159823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
159923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
160023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  stages_[2].iterator_type = HIGH_RES;
1601e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  stages_[2].tile_type = TilePriority::SOON;
160223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
160323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  stages_[3].iterator_type = HIGH_RES;
1604e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  stages_[3].tile_type = TilePriority::EVENTUALLY;
160523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
160623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  IteratorType index = stages_[current_stage_].iterator_type;
1607e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
16085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!iterators_[index] || iterators_[index].get_type() != tile_type)
16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AdvanceToNextStage();
161023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
161123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
161223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::LayerRasterTileIterator::~LayerRasterTileIterator() {}
161323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
161423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::LayerRasterTileIterator::operator bool() const {
16155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return current_stage_ < arraysize(stages_);
161623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
161723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
161823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::LayerRasterTileIterator&
161923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PictureLayerImpl::LayerRasterTileIterator::
162023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)operator++() {
162123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  IteratorType index = stages_[current_stage_].iterator_type;
1622e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
162323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
162423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // First advance the iterator.
16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(iterators_[index]);
16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(iterators_[index].get_type() == tile_type);
16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ++iterators_[index];
162823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!iterators_[index] || iterators_[index].get_type() != tile_type)
16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AdvanceToNextStage();
163123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
163223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return *this;
163323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
163423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
163523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Tile* PictureLayerImpl::LayerRasterTileIterator::operator*() {
163623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(*this);
163723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
163823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  IteratorType index = stages_[current_stage_].iterator_type;
163923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(iterators_[index]);
164023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(iterators_[index].get_type() == stages_[current_stage_].tile_type);
164123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
164223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return *iterators_[index];
164323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
164423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const Tile* PictureLayerImpl::LayerRasterTileIterator::operator*() const {
16465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(*this);
16475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
16485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  IteratorType index = stages_[current_stage_].iterator_type;
16495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(iterators_[index]);
16505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(iterators_[index].get_type() == stages_[current_stage_].tile_type);
16515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
16525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return *iterators_[index];
16535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
16545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
16551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PictureLayerImpl::LayerRasterTileIterator::AdvanceToNextStage() {
16561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LT(current_stage_, arraysize(stages_));
16571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ++current_stage_;
16581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (current_stage_ < arraysize(stages_)) {
16591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IteratorType index = stages_[current_stage_].iterator_type;
16601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
16611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (iterators_[index] && iterators_[index].get_type() == tile_type)
16631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
16641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++current_stage_;
16651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator()
16696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : layer_(NULL),
16705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES),
16716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_(PictureLayerTiling::EVENTUALLY),
16726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
16736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_(0u) {
16745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1675c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1676c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator(
1677a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    PictureLayerImpl* layer,
1678a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    TreePriority tree_priority)
16796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : layer_(layer),
16805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tree_priority_(tree_priority),
16816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_(PictureLayerTiling::EVENTUALLY),
16826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
16836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_(CurrentTilingRange().start - 1u) {
1684f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(vmpstr): Once tile priorities are determined by the iterators, ensure
1685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // that layers that don't have valid tile priorities have lowest priorities so
1686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // they evict their tiles first (crbug.com/381704)
16876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(layer_->tilings_);
16886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  do {
16896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!AdvanceToNextTiling())
16906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
1691c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
16926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    current_iterator_ = PictureLayerTiling::TilingEvictionTileIterator(
16936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        layer_->tilings_->tiling_at(CurrentTilingIndex()),
16946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        tree_priority,
16956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        current_category_);
16966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } while (!current_iterator_);
1697c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1698c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
16995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PictureLayerImpl::LayerEvictionTileIterator::~LayerEvictionTileIterator() {
17005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1701c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTile* PictureLayerImpl::LayerEvictionTileIterator::operator*() {
1703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(*this);
17046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return *current_iterator_;
17055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
17065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
17075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() const {
17085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(*this);
17096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return *current_iterator_;
1710c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1711c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1712c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPictureLayerImpl::LayerEvictionTileIterator&
1713c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPictureLayerImpl::LayerEvictionTileIterator::
1714c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochoperator++() {
1715c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(*this);
17166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ++current_iterator_;
17176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  while (!current_iterator_) {
17186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!AdvanceToNextTiling())
17195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1720c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    current_iterator_ = PictureLayerTiling::TilingEvictionTileIterator(
17225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        layer_->tilings_->tiling_at(CurrentTilingIndex()),
17235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        tree_priority_,
17246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        current_category_);
17255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
17266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return *this;
17275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1728c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)PictureLayerImpl::LayerEvictionTileIterator::operator bool() const {
17306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return !!current_iterator_;
17316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
17326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
17336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextCategory() {
17346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (current_category_) {
17356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTiling::EVENTUALLY:
17366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_ =
17376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          PictureLayerTiling::EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION;
17386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTiling::EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION:
17406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_ = PictureLayerTiling::SOON;
17416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTiling::SOON:
17436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_ = PictureLayerTiling::SOON_AND_REQUIRED_FOR_ACTIVATION;
17446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTiling::SOON_AND_REQUIRED_FOR_ACTIVATION:
17466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_ = PictureLayerTiling::NOW;
17476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTiling::NOW:
17496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_category_ = PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION;
17506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION:
17526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return false;
17535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
17545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
17556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return false;
17565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
17575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
17586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool
17596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextTilingRangeType() {
17606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (current_tiling_range_type_) {
17616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
17626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_ = PictureLayerTilingSet::LOWER_THAN_LOW_RES;
17636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTilingSet::LOWER_THAN_LOW_RES:
17656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_ =
17666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES;
17676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
17696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_ = PictureLayerTilingSet::LOW_RES;
17706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTilingSet::LOW_RES:
17726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_ = PictureLayerTilingSet::HIGH_RES;
17736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
17746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTilingSet::HIGH_RES:
17756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if (!AdvanceToNextCategory())
17766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return false;
17776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
17786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_tiling_range_type_ = PictureLayerTilingSet::HIGHER_THAN_HIGH_RES;
17795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return true;
17805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
17815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
17825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
17835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
17845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
17856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextTiling() {
17866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_NE(current_tiling_, CurrentTilingRange().end);
17876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ++current_tiling_;
17886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  while (current_tiling_ == CurrentTilingRange().end) {
17896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!AdvanceToNextTilingRangeType())
17906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return false;
17916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
17926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    current_tiling_ = CurrentTilingRange().start;
17936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
17946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return true;
17956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
17966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
17975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PictureLayerTilingSet::TilingRange
17986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)PictureLayerImpl::LayerEvictionTileIterator::CurrentTilingRange() const {
17995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return layer_->tilings_->GetTilingRange(current_tiling_range_type_);
1800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1801c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
18026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)size_t PictureLayerImpl::LayerEvictionTileIterator::CurrentTilingIndex() const {
18036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_NE(current_tiling_, CurrentTilingRange().end);
18045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (current_tiling_range_type_) {
18055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
18065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case PictureLayerTilingSet::LOW_RES:
18075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case PictureLayerTilingSet::HIGH_RES:
18086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return current_tiling_;
18096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Tilings in the following ranges are accessed in reverse order.
18105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
18116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case PictureLayerTilingSet::LOWER_THAN_LOW_RES: {
18126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange();
18136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      size_t current_tiling_range_offset = current_tiling_ - tiling_range.start;
18146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return tiling_range.end - 1 - current_tiling_range_offset;
18156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
18165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
18175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
18185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return 0;
18195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
18205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1822