| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index 052797af0691b402f6f20d6c0eba35ae2b2cc0f2..ab87b8cf59db45314019d3cf4d663fe4199a3dda 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -107,7 +107,6 @@ class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient {
|
| new DebugScopedSetImplThread(layer_tree_host_impl_->proxy()));
|
| }
|
|
|
| - // TODO(enne): This should probably happen post-animate.
|
| if (layer_tree_host_impl_->pending_tree()) {
|
| layer_tree_host_impl_->ActivatePendingTreeIfNeeded();
|
|
|
| @@ -170,6 +169,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(
|
| RenderingStatsInstrumentation* rendering_stats_instrumentation)
|
| : client_(client),
|
| proxy_(proxy),
|
| + output_surface_lost_(true),
|
| input_handler_client_(NULL),
|
| did_lock_scrolling_layer_(false),
|
| should_bubble_scrolls_(false),
|
| @@ -251,7 +251,8 @@ void LayerTreeHostImpl::CommitComplete() {
|
| pending_tree_->set_needs_update_draw_properties();
|
| pending_tree_->UpdateDrawProperties();
|
| // Start working on newly created tiles immediately if needed.
|
| - ManageTiles();
|
| + if (!ManageTiles())
|
| + client_->NotifyReadyToActivate();
|
| } else {
|
| active_tree_->set_needs_update_draw_properties();
|
| }
|
| @@ -315,11 +316,11 @@ void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time,
|
| AnimateTopControls(monotonic_time);
|
| }
|
|
|
| -void LayerTreeHostImpl::ManageTiles() {
|
| +bool LayerTreeHostImpl::ManageTiles() {
|
| if (!tile_manager_)
|
| - return;
|
| + return false;
|
| if (!manage_tiles_needed_)
|
| - return;
|
| + return false;
|
| manage_tiles_needed_ = false;
|
| tile_manager_->ManageTiles();
|
|
|
| @@ -332,6 +333,7 @@ void LayerTreeHostImpl::ManageTiles() {
|
| SendManagedMemoryStats(memory_required_bytes,
|
| memory_nice_to_have_bytes,
|
| memory_used_bytes);
|
| + return true;
|
| }
|
|
|
| void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset,
|
| @@ -1060,10 +1062,7 @@ void LayerTreeHostImpl::DidInitializeVisibleTile() {
|
| }
|
|
|
| void LayerTreeHostImpl::NotifyReadyToActivate() {
|
| - if (pending_tree_) {
|
| - need_to_update_visible_tiles_before_draw_ = true;
|
| - ActivatePendingTree();
|
| - }
|
| + client_->NotifyReadyToActivate();
|
| }
|
|
|
| bool LayerTreeHostImpl::ShouldClearRootRenderPass() const {
|
| @@ -1309,7 +1308,7 @@ const RendererCapabilities& LayerTreeHostImpl::GetRendererCapabilities() const {
|
| }
|
|
|
| bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) {
|
| - if (frame.has_no_damage)
|
| + if (frame.has_no_damage || output_surface_lost_)
|
| return false;
|
| renderer_->SwapBuffers();
|
| active_tree_->ClearLatencyInfo();
|
| @@ -1352,6 +1351,7 @@ void LayerTreeHostImpl::DidLoseOutputSurface() {
|
| // TODO(jamesr): The renderer_ check is needed to make some of the
|
| // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or
|
| // important) in production. We should adjust the test to not need this.
|
| + output_surface_lost_ = true;
|
| if (renderer_)
|
| client_->DidLoseOutputSurfaceOnImplThread();
|
| }
|
| @@ -1446,6 +1446,8 @@ void LayerTreeHostImpl::ActivatePendingTree() {
|
| CHECK(pending_tree_);
|
| TRACE_EVENT_ASYNC_END0("cc", "PendingTree", pending_tree_.get());
|
|
|
| + need_to_update_visible_tiles_before_draw_ = true;
|
| +
|
| active_tree_->SetRootLayerScrollOffsetDelegate(NULL);
|
| active_tree_->PushPersistedState(pending_tree_.get());
|
| if (pending_tree_->needs_full_tree_sync()) {
|
| @@ -1474,6 +1476,10 @@ void LayerTreeHostImpl::ActivatePendingTree() {
|
| root_layer_scroll_offset_delegate_);
|
| active_tree_->DidBecomeActive();
|
|
|
| + client_->DidActivatePendingTree();
|
| + if (!tree_activation_callback_.is_null())
|
| + tree_activation_callback_.Run();
|
| +
|
| // Reduce wasted memory now that unlinked resources are guaranteed not
|
| // to be used.
|
| client_->ReduceWastedContentsTextureMemoryOnImplThread();
|
| @@ -1490,10 +1496,6 @@ void LayerTreeHostImpl::ActivatePendingTree() {
|
| stats.total_paint_time + stats.total_record_time +
|
| stats.total_rasterize_time_for_now_bins_on_pending_tree);
|
| }
|
| -
|
| - client_->DidActivatePendingTree();
|
| - if (!tree_activation_callback_.is_null())
|
| - tree_activation_callback_.Run();
|
| }
|
|
|
| void LayerTreeHostImpl::SetVisible(bool visible) {
|
| @@ -1604,6 +1606,7 @@ bool LayerTreeHostImpl::InitializeRenderer(
|
| tile_manager_.reset();
|
| resource_provider_.reset();
|
| output_surface_.reset();
|
| + output_surface_lost_ = true;
|
|
|
| if (!output_surface->BindToClient(this))
|
| return false;
|
| @@ -1649,6 +1652,7 @@ bool LayerTreeHostImpl::InitializeRenderer(
|
|
|
| resource_provider_ = resource_provider.Pass();
|
| output_surface_ = output_surface.Pass();
|
| + output_surface_lost_ = false;
|
|
|
| client_->OnCanDrawStateChanged(CanDraw());
|
|
|
| @@ -2192,6 +2196,8 @@ scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() {
|
| CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer());
|
| scroll_info->page_scale_delta = active_tree_->page_scale_delta();
|
| active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta);
|
| + if (pending_tree_)
|
| + pending_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta);
|
|
|
| return scroll_info.Pass();
|
| }
|
| @@ -2201,8 +2207,10 @@ void LayerTreeHostImpl::SetFullRootLayerDamage() {
|
| }
|
|
|
| void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) {
|
| + TRACE_EVENT0("cc", "AnimatePageScale");
|
| if (!page_scale_animation_ || !RootScrollLayer())
|
| return;
|
| + TRACE_EVENT0("cc", "AnimatePageScaleExists");
|
|
|
| double monotonic_time = (time - base::TimeTicks()).InSecondsF();
|
| gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() +
|
| @@ -2211,6 +2219,12 @@ void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) {
|
| active_tree_->SetPageScaleDelta(
|
| page_scale_animation_->PageScaleFactorAtTime(monotonic_time) /
|
| active_tree_->page_scale_factor());
|
| + if (pending_tree_) {
|
| + pending_tree_->SetPageScaleDelta(
|
| + page_scale_animation_->PageScaleFactorAtTime(monotonic_time) /
|
| + pending_tree_->page_scale_factor());
|
| + }
|
| +
|
| gfx::Vector2dF next_scroll =
|
| page_scale_animation_->ScrollOffsetAtTime(monotonic_time);
|
|
|
|
|