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 c61e6bec0d0c99f7f90801f421dd448b928bb9cb..9c662ac53e6346ddbb3fabd2d6f2fd763667f963 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -170,6 +170,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), |
@@ -252,7 +253,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(); |
} |
@@ -316,11 +318,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(); |
@@ -333,6 +335,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, |
@@ -1062,10 +1065,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 { |
@@ -1310,7 +1310,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(); |
@@ -1353,6 +1353,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(); |
} |
@@ -1447,6 +1448,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()) { |
@@ -1475,6 +1478,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(); |
@@ -1491,10 +1498,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) { |
@@ -1602,6 +1605,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
tile_manager_.reset(); |
resource_provider_.reset(); |
output_surface_.reset(); |
+ output_surface_lost_ = true; |
if (!output_surface->BindToClient(this)) |
return false; |
@@ -1647,6 +1651,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
resource_provider_ = resource_provider.Pass(); |
output_surface_ = output_surface.Pass(); |
+ output_surface_lost_ = false; |
client_->OnCanDrawStateChanged(CanDraw()); |
@@ -2216,6 +2221,7 @@ void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { |
active_tree_->SetPageScaleDelta( |
page_scale_animation_->PageScaleFactorAtTime(monotonic_time) / |
active_tree_->page_scale_factor()); |
+ |
gfx::Vector2dF next_scroll = |
page_scale_animation_->ScrollOffsetAtTime(monotonic_time); |