Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8195)

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 16871016: cc: Use BeginFrameArgs (Closed) Base URL: http://git.chromium.org/chromium/src.git@bfargs2
Patch Set: Allow back2back readbacks Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698