| Index: cc/layers/picture_layer_impl.cc
|
| diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
|
| index 6d8914033e1d43802052d9f9302bb656a1b9e657..111a0e718312d6db50ee2e318099a43ea32116e5 100644
|
| --- a/cc/layers/picture_layer_impl.cc
|
| +++ b/cc/layers/picture_layer_impl.cc
|
| @@ -31,6 +31,8 @@
|
| #include "ui/gfx/geometry/size_conversions.h"
|
|
|
| namespace {
|
| +// This must be > 1 as we multiply or divide by this to find a new raster
|
| +// scale during pinch.
|
| const float kMaxScaleRatioDuringPinch = 2.0f;
|
|
|
| // When creating a new tiling during pinch, snap to an existing
|
| @@ -85,7 +87,8 @@ PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, int id)
|
| was_screen_space_transform_animating_(false),
|
| needs_post_commit_initialization_(true),
|
| should_update_tile_priorities_(false),
|
| - only_used_low_res_last_append_quads_(false) {
|
| + only_used_low_res_last_append_quads_(false),
|
| + is_mask_(false) {
|
| layer_tree_impl()->RegisterPictureLayerImpl(this);
|
| }
|
|
|
| @@ -124,7 +127,7 @@ void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
|
|
|
| layer_impl->UpdateRasterSource(raster_source_);
|
|
|
| - DCHECK(!raster_source_->IsSolidColor() || !tilings_->num_tilings());
|
| + DCHECK_IMPLIES(raster_source_->IsSolidColor(), tilings_->num_tilings() == 0);
|
| // Tilings would be expensive to push, so we swap.
|
| layer_impl->tilings_.swap(tilings_);
|
| layer_impl->tilings_->SetClient(layer_impl);
|
| @@ -472,7 +475,7 @@ void PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
|
|
|
| UpdateIdealScales();
|
|
|
| - DCHECK(tilings_->num_tilings() > 0 || raster_contents_scale_ == 0.f)
|
| + DCHECK_IMPLIES(tilings_->num_tilings() == 0, raster_contents_scale_ == 0.f)
|
| << "A layer with no tilings shouldn't have valid raster scales";
|
| if (!raster_contents_scale_ || ShouldAdjustRasterScale()) {
|
| RecalculateRasterScales();
|
| @@ -498,47 +501,40 @@ void PictureLayerImpl::UpdateTiles(const Occlusion& occlusion_in_content_space,
|
|
|
| void PictureLayerImpl::UpdateTilePriorities(
|
| const Occlusion& occlusion_in_content_space) {
|
| - DCHECK(!raster_source_->IsSolidColor() || !tilings_->num_tilings());
|
| + DCHECK_IMPLIES(raster_source_->IsSolidColor(), tilings_->num_tilings() == 0);
|
| +
|
| double current_frame_time_in_seconds =
|
| (layer_tree_impl()->CurrentBeginFrameArgs().frame_time -
|
| base::TimeTicks()).InSecondsF();
|
| -
|
| gfx::Rect viewport_rect_in_layer_space =
|
| GetViewportForTilePriorityInContentSpace();
|
| - bool tiling_needs_update = false;
|
| - for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
|
| - if (tilings_->tiling_at(i)->NeedsUpdateForFrameAtTimeAndViewport(
|
| - current_frame_time_in_seconds, viewport_rect_in_layer_space)) {
|
| - tiling_needs_update = true;
|
| - break;
|
| - }
|
| - }
|
| - if (!tiling_needs_update)
|
| - return;
|
|
|
| - WhichTree tree =
|
| - layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
|
| + // The tiling set can require tiles for activation any of the following
|
| + // conditions are true:
|
| + // - This layer produced a high-res or non-ideal-res tile last frame.
|
| + // - We're in requires high res to draw mode.
|
| + // - We're not in smoothness takes priority mode.
|
| + // To put different, the tiling set can't require tiles for activation if
|
| + // we're in smoothness mode and only used low-res or checkerboard to draw last
|
| + // frame and we don't need high res to draw.
|
| + //
|
| + // The reason for this is that we should be able to activate sooner and get a
|
| + // more up to date recording, so we don't run out of recording on the active
|
| + // tree.
|
| bool can_require_tiles_for_activation =
|
| !only_used_low_res_last_append_quads_ || RequiresHighResToDraw() ||
|
| !layer_tree_impl()->SmoothnessTakesPriority();
|
| - for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
|
| - PictureLayerTiling* tiling = tilings_->tiling_at(i);
|
| -
|
| - tiling->set_can_require_tiles_for_activation(
|
| - can_require_tiles_for_activation);
|
|
|
| - // Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since
|
| - // they are the same space in picture layer, as contents scale is always 1.
|
| - tiling->ComputeTilePriorityRects(tree,
|
| - viewport_rect_in_layer_space,
|
| - ideal_contents_scale_,
|
| - current_frame_time_in_seconds,
|
| - occlusion_in_content_space);
|
| - }
|
| + // Pass |occlusion_in_content_space| for |occlusion_in_layer_space| since
|
| + // they are the same space in picture layer, as contents scale is always 1.
|
| + bool updated = tilings_->UpdateTilePriorities(
|
| + viewport_rect_in_layer_space, ideal_contents_scale_,
|
| + current_frame_time_in_seconds, occlusion_in_content_space,
|
| + can_require_tiles_for_activation);
|
|
|
| - // Tile priorities were modified.
|
| // TODO(vmpstr): See if this can be removed in favour of calling it from LTHI
|
| - layer_tree_impl()->DidModifyTilePriorities();
|
| + if (updated)
|
| + layer_tree_impl()->DidModifyTilePriorities();
|
| }
|
|
|
| gfx::Rect PictureLayerImpl::GetViewportForTilePriorityInContentSpace() const {
|
| @@ -623,7 +619,7 @@ scoped_refptr<Tile> PictureLayerImpl::CreateTile(PictureLayerTiling* tiling,
|
| // memory savings that we can get. Note that we don't handle solid color
|
| // masks, so we shouldn't bother analyzing those.
|
| // Bugs: crbug.com/397198, crbug.com/396908
|
| - if (!raster_source_->IsMask())
|
| + if (!is_mask_)
|
| flags = Tile::USE_PICTURE_ANALYSIS;
|
|
|
| return layer_tree_impl()->tile_manager()->CreateTile(
|
| @@ -632,10 +628,6 @@ scoped_refptr<Tile> PictureLayerImpl::CreateTile(PictureLayerTiling* tiling,
|
| flags);
|
| }
|
|
|
| -RasterSource* PictureLayerImpl::GetRasterSource() {
|
| - return raster_source_.get();
|
| -}
|
| -
|
| const Region* PictureLayerImpl::GetPendingInvalidation() {
|
| if (layer_tree_impl()->IsPendingTree())
|
| return &invalidation_;
|
| @@ -699,7 +691,7 @@ gfx::Size PictureLayerImpl::CalculateTileSize(
|
| int max_texture_size =
|
| layer_tree_impl()->resource_provider()->max_texture_size();
|
|
|
| - if (raster_source_->IsMask()) {
|
| + if (is_mask_) {
|
| // Masks are not tiled, so if we can't cover the whole mask with one tile,
|
| // don't make any tiles at all. Returning an empty size signals this.
|
| if (content_bounds.width() > max_texture_size ||
|
| @@ -788,9 +780,9 @@ void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
|
|
|
| bool synced_high_res_tiling = false;
|
| if (CanHaveTilings()) {
|
| - synced_high_res_tiling =
|
| - tilings_->SyncTilings(*other->tilings_, raster_source_->GetSize(),
|
| - invalidation_, MinimumContentsScale());
|
| + synced_high_res_tiling = tilings_->SyncTilings(
|
| + *other->tilings_, raster_source_->GetSize(), invalidation_,
|
| + MinimumContentsScale(), raster_source_.get());
|
| } else {
|
| RemoveAllTilings();
|
| }
|
| @@ -865,7 +857,7 @@ void PictureLayerImpl::DoPostCommitInitialization() {
|
| DCHECK(layer_tree_impl()->IsPendingTree());
|
|
|
| if (!tilings_)
|
| - tilings_ = make_scoped_ptr(new PictureLayerTilingSet(this));
|
| + tilings_ = PictureLayerTilingSet::Create(this);
|
|
|
| PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer();
|
| if (twin_layer) {
|
| @@ -1052,16 +1044,20 @@ void PictureLayerImpl::RecalculateRasterScales() {
|
|
|
| // During pinch we completely ignore the current ideal scale, and just use
|
| // a multiple of the previous scale.
|
| - // TODO(danakj): This seems crazy, we should use the current ideal, no?
|
| bool is_pinching = layer_tree_impl()->PinchGestureActive();
|
| if (is_pinching && old_raster_contents_scale) {
|
| // See ShouldAdjustRasterScale:
|
| // - When zooming out, preemptively create new tiling at lower resolution.
|
| // - When zooming in, approximate ideal using multiple of kMaxScaleRatio.
|
| bool zooming_out = old_raster_page_scale > ideal_page_scale_;
|
| - float desired_contents_scale =
|
| - zooming_out ? old_raster_contents_scale / kMaxScaleRatioDuringPinch
|
| - : old_raster_contents_scale * kMaxScaleRatioDuringPinch;
|
| + float desired_contents_scale = old_raster_contents_scale;
|
| + if (zooming_out) {
|
| + while (desired_contents_scale > ideal_contents_scale_)
|
| + desired_contents_scale /= kMaxScaleRatioDuringPinch;
|
| + } else {
|
| + while (desired_contents_scale < ideal_contents_scale_)
|
| + desired_contents_scale *= kMaxScaleRatioDuringPinch;
|
| + }
|
| raster_contents_scale_ = SnappedContentsScale(desired_contents_scale);
|
| raster_page_scale_ =
|
| raster_contents_scale_ / raster_device_scale_ / raster_source_scale_;
|
|
|