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

Unified Diff: cc/trees/layer_tree_host.cc

Issue 2253143002: Revert of cc: Move data to LayerTree from LayerTreeHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@layer_tree_change
Patch Set: Created 4 years, 4 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
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host.cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index a1376f81655e1c22d9a80535057f2f9bd9f0de28..8e0493a8c1af61f5f87ab840f4ae5be1a468df18 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -68,6 +68,23 @@
namespace cc {
namespace {
+Layer* UpdateAndGetLayer(Layer* current_layer,
+ int layer_id,
+ LayerTree* layer_tree) {
+ if (layer_id == Layer::INVALID_ID) {
+ if (current_layer)
+ current_layer->SetLayerTreeHost(nullptr);
+
+ return nullptr;
+ }
+ Layer* layer = layer_tree->LayerById(layer_id);
+ DCHECK(layer);
+ if (current_layer && current_layer != layer)
+ current_layer->SetLayerTreeHost(nullptr);
+
+ return layer;
+}
+
std::unique_ptr<base::trace_event::TracedValue>
ComputeLayerTreeHostProtoSizeSplitAsValue(proto::LayerTreeHost* proto) {
std::unique_ptr<base::trace_event::TracedValue> value(
@@ -101,11 +118,9 @@
}
value->SetInteger("TotalLayerTreeHostProtoSize", proto->ByteSize());
- value->SetInteger("LayerTreeHierarchySize",
- proto->layer_tree().root_layer().ByteSize());
+ value->SetInteger("LayerTreeHierarchySize", proto->root_layer().ByteSize());
value->SetInteger("LayerUpdatesSize", proto->layer_updates().ByteSize());
- value->SetInteger("PropertyTreesSize",
- proto->layer_tree().property_trees().ByteSize());
+ value->SetInteger("PropertyTreesSize", proto->property_trees().ByteSize());
// LayerUpdate size breakdown.
value->SetInteger("TotalBasePropertiesSize",
@@ -197,29 +212,33 @@
}
LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode)
- : LayerTreeHost(
- params,
- mode,
- base::MakeUnique<LayerTree>(std::move(params->animation_host),
- this)) {}
-
-LayerTreeHost::LayerTreeHost(InitParams* params,
- CompositorMode mode,
- std::unique_ptr<LayerTree> layer_tree)
: micro_benchmark_controller_(this),
- layer_tree_(std::move(layer_tree)),
next_ui_resource_id_(1),
compositor_mode_(mode),
+ needs_full_tree_sync_(true),
+ needs_meta_info_recomputation_(true),
client_(params->client),
source_frame_number_(0),
rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
output_surface_lost_(true),
settings_(*params->settings),
debug_state_(settings_.initial_debug_state),
+ top_controls_shrink_blink_size_(false),
+ top_controls_height_(0.f),
+ top_controls_shown_ratio_(0.f),
+ device_scale_factor_(1.f),
+ painted_device_scale_factor_(1.f),
visible_(false),
+ page_scale_factor_(1.f),
+ min_page_scale_factor_(1.f),
+ max_page_scale_factor_(1.f),
has_gpu_rasterization_trigger_(false),
content_is_suitable_for_gpu_rasterization_(true),
gpu_rasterization_histogram_recorded_(false),
+ background_color_(SK_ColorWHITE),
+ has_transparent_background_(false),
+ have_scroll_event_handlers_(false),
+ event_listener_properties_(),
did_complete_scale_animation_(false),
id_(s_layer_tree_host_sequence_number.GetNext() + 1),
next_commit_forces_redraw_(false),
@@ -228,11 +247,11 @@
task_graph_runner_(params->task_graph_runner),
image_serialization_processor_(params->image_serialization_processor),
surface_client_id_(0u),
- next_surface_sequence_(1u) {
+ next_surface_sequence_(1u),
+ layer_tree_(std::move(params->animation_host)) {
DCHECK(task_graph_runner_);
- DCHECK(layer_tree_);
-
- layer_tree_->animation_host()->SetMutatorHostClient(this);
+
+ layer_tree_.animation_host()->SetMutatorHostClient(this);
rendering_stats_instrumentation_->set_record_rendering_stats(
debug_state_.RecordRenderingStats());
@@ -343,15 +362,17 @@
proxy_ = std::move(proxy);
proxy_->Start(std::move(external_begin_frame_source));
- layer_tree_->animation_host()->SetSupportsScrollAnimations(
+ layer_tree_.animation_host()->SetSupportsScrollAnimations(
proxy_->SupportsImplScrolling());
}
LayerTreeHost::~LayerTreeHost() {
TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost");
- // Clear any references into the LayerTreeHost.
- layer_tree_.reset();
+ layer_tree_.animation_host()->SetMutatorHostClient(nullptr);
+
+ if (root_layer_.get())
+ root_layer_->SetLayerTreeHost(NULL);
DCHECK(swap_promise_monitor_.empty());
@@ -363,6 +384,16 @@
// Proxy must be destroyed before the Task Runner Provider.
proxy_ = nullptr;
+ }
+
+ // We must clear any pointers into the layer tree prior to destroying it.
+ RegisterViewportLayers(NULL, NULL, NULL, NULL);
+
+ if (root_layer_.get()) {
+ // The layer tree must be destroyed before the layer tree host. We've
+ // made a contract with our animation controllers that the animation_host
+ // will outlive them, and we must make good.
+ root_layer_ = NULL;
}
}
@@ -405,7 +436,7 @@
TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
if (is_new_trace &&
frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() &&
- layer_tree_->root_layer()) {
+ root_layer()) {
LayerTreeHostCommon::CallFunctionForEveryLayer(
this, [](Layer* layer) { layer->DidBeginTracing(); });
}
@@ -419,35 +450,104 @@
sync_tree->set_source_frame_number(source_frame_number());
- if (layer_tree_->needs_full_tree_sync())
- TreeSynchronizer::SynchronizeTrees(layer_tree_->root_layer(), sync_tree);
-
- layer_tree_->PushPropertiesTo(sync_tree);
+ if (needs_full_tree_sync_)
+ TreeSynchronizer::SynchronizeTrees(root_layer(), sync_tree);
+
+ sync_tree->set_needs_full_tree_sync(needs_full_tree_sync_);
+ needs_full_tree_sync_ = false;
+
+ if (hud_layer_.get()) {
+ LayerImpl* hud_impl = sync_tree->LayerById(hud_layer_->id());
+ sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl));
+ } else {
+ sync_tree->set_hud_layer(NULL);
+ }
+
+ sync_tree->set_background_color(background_color_);
+ sync_tree->set_has_transparent_background(has_transparent_background_);
+ sync_tree->set_have_scroll_event_handlers(have_scroll_event_handlers_);
+ sync_tree->set_event_listener_properties(
+ EventListenerClass::kTouchStartOrMove,
+ event_listener_properties(EventListenerClass::kTouchStartOrMove));
+ sync_tree->set_event_listener_properties(
+ EventListenerClass::kMouseWheel,
+ event_listener_properties(EventListenerClass::kMouseWheel));
+ sync_tree->set_event_listener_properties(
+ EventListenerClass::kTouchEndOrCancel,
+ event_listener_properties(EventListenerClass::kTouchEndOrCancel));
+
+ if (page_scale_layer_.get() && inner_viewport_scroll_layer_.get()) {
+ sync_tree->SetViewportLayersFromIds(
+ overscroll_elasticity_layer_.get() ? overscroll_elasticity_layer_->id()
+ : Layer::INVALID_ID,
+ page_scale_layer_->id(), inner_viewport_scroll_layer_->id(),
+ outer_viewport_scroll_layer_.get() ? outer_viewport_scroll_layer_->id()
+ : Layer::INVALID_ID);
+ DCHECK(inner_viewport_scroll_layer_->IsContainerForFixedPositionLayers());
+ } else {
+ sync_tree->ClearViewportLayers();
+ }
+
+ sync_tree->RegisterSelection(selection_);
+
+ bool property_trees_changed_on_active_tree =
+ sync_tree->IsActiveTree() && sync_tree->property_trees()->changed;
+ // Property trees may store damage status. We preserve the sync tree damage
+ // status by pushing the damage status from sync tree property trees to main
+ // thread property trees or by moving it onto the layers.
+ if (root_layer_ && property_trees_changed_on_active_tree) {
+ if (property_trees_.sequence_number ==
+ sync_tree->property_trees()->sequence_number)
+ sync_tree->property_trees()->PushChangeTrackingTo(&property_trees_);
+ else
+ sync_tree->MoveChangeTrackingToLayers();
+ }
+ // Setting property trees must happen before pushing the page scale.
+ sync_tree->SetPropertyTrees(&property_trees_);
+
+ sync_tree->PushPageScaleFromMainThread(
+ page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_);
+ sync_tree->elastic_overscroll()->PushFromMainThread(elastic_overscroll_);
+ if (sync_tree->IsActiveTree())
+ sync_tree->elastic_overscroll()->PushPendingToActive();
sync_tree->PassSwapPromises(std::move(swap_promise_list_));
+
+ sync_tree->set_top_controls_shrink_blink_size(
+ top_controls_shrink_blink_size_);
+ sync_tree->set_top_controls_height(top_controls_height_);
+ sync_tree->PushTopControlsFromMainThread(top_controls_shown_ratio_);
host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
host_impl->SetContentIsSuitableForGpuRasterization(
content_is_suitable_for_gpu_rasterization_);
RecordGpuRasterizationHistogram();
- host_impl->SetViewportSize(layer_tree_->device_viewport_size());
- // TODO(senorblanco): Move this to LayerTree::PushPropertiesTo so that it
- // happens before GPU rasterization properties are set, since those trigger an
- // update of GPU rasterization status, which depends on the device scale
- // factor. (crbug.com/535700)
- sync_tree->SetDeviceScaleFactor(layer_tree_->device_scale_factor());
+ host_impl->SetViewportSize(device_viewport_size_);
+ // TODO(senorblanco): Move this up so that it happens before GPU rasterization
+ // properties are set, since those trigger an update of GPU rasterization
+ // status, which depends on the device scale factor. (crbug.com/535700)
+ sync_tree->SetDeviceScaleFactor(device_scale_factor_);
+ sync_tree->set_painted_device_scale_factor(painted_device_scale_factor_);
host_impl->SetDebugState(debug_state_);
+ if (pending_page_scale_animation_) {
+ sync_tree->SetPendingPageScaleAnimation(
+ std::move(pending_page_scale_animation_));
+ }
if (!ui_resource_request_queue_.empty()) {
sync_tree->set_ui_resource_request_queue(ui_resource_request_queue_);
ui_resource_request_queue_.clear();
}
+ DCHECK(!sync_tree->ViewportSizeInvalid());
+
+ sync_tree->set_has_ever_been_drawn(false);
+
{
TRACE_EVENT0("cc", "LayerTreeHost::PushProperties");
- TreeSynchronizer::PushLayerProperties(layer_tree_.get(), sync_tree);
+ TreeSynchronizer::PushLayerProperties(&layer_tree_, sync_tree);
// This must happen after synchronizing property trees and after push
// properties, which updates property tree indices, but before animation
@@ -458,16 +558,15 @@
TRACE_EVENT0("cc", "LayerTreeHost::AnimationHost::PushProperties");
DCHECK(host_impl->animation_host());
- layer_tree_->animation_host()->PushPropertiesTo(
- host_impl->animation_host());
+ layer_tree_.animation_host()->PushPropertiesTo(host_impl->animation_host());
}
// This must happen after synchronizing property trees and after pushing
// properties, which updates the clobber_active_value flag.
- sync_tree->UpdatePropertyTreeScrollOffset(layer_tree_->property_trees());
+ sync_tree->UpdatePropertyTreeScrollOffset(&property_trees_);
micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl);
- layer_tree_->property_trees()->ResetAllChangeTracking();
+ property_trees_.ResetAllChangeTracking();
}
void LayerTreeHost::WillCommit() {
@@ -476,6 +575,17 @@
}
void LayerTreeHost::UpdateHudLayer() {
+ if (debug_state_.ShowHudInfo()) {
+ if (!hud_layer_.get()) {
+ hud_layer_ = HeadsUpDisplayLayer::Create();
+ }
+
+ if (root_layer_.get() && !hud_layer_->parent())
+ root_layer_->AddChild(hud_layer_);
+ } else if (hud_layer_.get()) {
+ hud_layer_->RemoveFromParent();
+ hud_layer_ = NULL;
+ }
}
void LayerTreeHost::CommitComplete() {
@@ -535,8 +645,7 @@
const bool supports_impl_scrolling = task_runner_provider_->HasImplThread();
std::unique_ptr<AnimationHost> animation_host_impl =
- layer_tree_->animation_host()->CreateImplInstance(
- supports_impl_scrolling);
+ layer_tree_.animation_host()->CreateImplInstance(supports_impl_scrolling);
std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
settings_, client, task_runner_provider_.get(),
@@ -587,13 +696,30 @@
NotifySwapPromiseMonitorsOfSetNeedsCommit();
}
+void LayerTreeHost::SetPropertyTreesNeedRebuild() {
+ property_trees_.needs_rebuild = true;
+ SetNeedsUpdateLayers();
+}
+
void LayerTreeHost::SetNeedsCommit() {
proxy_->SetNeedsCommit();
NotifySwapPromiseMonitorsOfSetNeedsCommit();
}
+void LayerTreeHost::SetNeedsFullTreeSync() {
+ needs_full_tree_sync_ = true;
+ needs_meta_info_recomputation_ = true;
+
+ property_trees_.needs_rebuild = true;
+ SetNeedsCommit();
+}
+
+void LayerTreeHost::SetNeedsMetaInfoRecomputation(bool needs_recomputation) {
+ needs_meta_info_recomputation_ = needs_recomputation;
+}
+
void LayerTreeHost::SetNeedsRedraw() {
- SetNeedsRedrawRect(gfx::Rect(layer_tree_->device_viewport_size()));
+ SetNeedsRedrawRect(gfx::Rect(device_viewport_size_));
}
void LayerTreeHost::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
@@ -620,7 +746,30 @@
void LayerTreeHost::SetAnimationEvents(
std::unique_ptr<AnimationEvents> events) {
DCHECK(task_runner_provider_->IsMainThread());
- layer_tree_->animation_host()->SetAnimationEvents(std::move(events));
+ layer_tree_.animation_host()->SetAnimationEvents(std::move(events));
+}
+
+void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) {
+ if (root_layer_.get() == root_layer.get())
+ return;
+
+ if (root_layer_.get())
+ root_layer_->SetLayerTreeHost(NULL);
+ root_layer_ = root_layer;
+ if (root_layer_.get()) {
+ DCHECK(!root_layer_->parent());
+ root_layer_->SetLayerTreeHost(this);
+ }
+
+ if (hud_layer_.get())
+ hud_layer_->RemoveFromParent();
+
+ // Reset gpu rasterization flag.
+ // This flag is sticky until a new tree comes along.
+ content_is_suitable_for_gpu_rasterization_ = true;
+ gpu_rasterization_histogram_recorded_ = false;
+
+ SetNeedsFullTreeSync();
}
void LayerTreeHost::SetDebugState(const LayerTreeDebugState& debug_state) {
@@ -636,11 +785,6 @@
debug_state_.RecordRenderingStats());
SetNeedsCommit();
-}
-
-void LayerTreeHost::ResetGpuRasterizationTracking() {
- content_is_suitable_for_gpu_rasterization_ = true;
- gpu_rasterization_histogram_recorded_ = false;
}
void LayerTreeHost::SetHasGpuRasterizationTrigger(bool has_trigger) {
@@ -655,12 +799,55 @@
has_gpu_rasterization_trigger_);
}
+void LayerTreeHost::SetViewportSize(const gfx::Size& device_viewport_size) {
+ if (device_viewport_size == device_viewport_size_)
+ return;
+
+ device_viewport_size_ = device_viewport_size;
+
+ SetPropertyTreesNeedRebuild();
+ SetNeedsCommit();
+}
+
+void LayerTreeHost::SetTopControlsHeight(float height, bool shrink) {
+ if (top_controls_height_ == height &&
+ top_controls_shrink_blink_size_ == shrink)
+ return;
+
+ top_controls_height_ = height;
+ top_controls_shrink_blink_size_ = shrink;
+ SetNeedsCommit();
+}
+
+void LayerTreeHost::SetTopControlsShownRatio(float ratio) {
+ if (top_controls_shown_ratio_ == ratio)
+ return;
+
+ top_controls_shown_ratio_ = ratio;
+ SetNeedsCommit();
+}
+
void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(float page_scale_delta) {
DCHECK(CommitRequested());
if (page_scale_delta == 1.f)
return;
- float page_scale = layer_tree_->page_scale_factor() * page_scale_delta;
- layer_tree_->SetPageScaleFromImplSide(page_scale);
+ page_scale_factor_ *= page_scale_delta;
+ SetPropertyTreesNeedRebuild();
+}
+
+void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor,
+ float min_page_scale_factor,
+ float max_page_scale_factor) {
+ if (page_scale_factor == page_scale_factor_ &&
+ min_page_scale_factor == min_page_scale_factor_ &&
+ max_page_scale_factor == max_page_scale_factor_)
+ return;
+
+ page_scale_factor_ = page_scale_factor;
+ min_page_scale_factor_ = min_page_scale_factor;
+ max_page_scale_factor_ = max_page_scale_factor;
+ SetPropertyTreesNeedRebuild();
+ SetNeedsCommit();
}
void LayerTreeHost::SetVisible(bool visible) {
@@ -668,6 +855,24 @@
return;
visible_ = visible;
proxy_->SetVisible(visible);
+}
+
+void LayerTreeHost::StartPageScaleAnimation(const gfx::Vector2d& target_offset,
+ bool use_anchor,
+ float scale,
+ base::TimeDelta duration) {
+ pending_page_scale_animation_.reset(
+ new PendingPageScaleAnimation(
+ target_offset,
+ use_anchor,
+ scale,
+ duration));
+
+ SetNeedsCommit();
+}
+
+bool LayerTreeHost::HasPendingPageScaleAnimation() const {
+ return !!pending_page_scale_animation_.get();
}
void LayerTreeHost::NotifyInputThrottledUntilCommit() {
@@ -703,16 +908,16 @@
bool LayerTreeHost::UpdateLayers() {
DCHECK(!output_surface_lost_);
- if (!layer_tree_->root_layer())
+ if (!root_layer())
return false;
- DCHECK(!layer_tree_->root_layer()->parent());
- bool result = DoUpdateLayers(layer_tree_->root_layer());
+ DCHECK(!root_layer()->parent());
+ bool result = DoUpdateLayers(root_layer());
micro_benchmark_controller_.DidUpdateLayers();
return result || next_commit_forces_redraw_;
}
LayerListIterator<Layer> LayerTreeHost::begin() const {
- return LayerListIterator<Layer>(layer_tree_->root_layer());
+ return LayerListIterator<Layer>(root_layer_.get());
}
LayerListIterator<Layer> LayerTreeHost::end() const {
@@ -720,7 +925,7 @@
}
LayerListReverseIterator<Layer> LayerTreeHost::rbegin() {
- return LayerListReverseIterator<Layer>(layer_tree_->root_layer());
+ return LayerListReverseIterator<Layer>(root_layer_.get());
}
LayerListReverseIterator<Layer> LayerTreeHost::rend() {
@@ -758,16 +963,14 @@
}
void LayerTreeHost::BuildPropertyTreesForTesting() {
- PropertyTreeBuilder::PreCalculateMetaInformation(layer_tree_->root_layer());
+ PropertyTreeBuilder::PreCalculateMetaInformation(root_layer_.get());
gfx::Transform identity_transform;
PropertyTreeBuilder::BuildPropertyTrees(
- layer_tree_->root_layer(), layer_tree_->page_scale_layer(),
- layer_tree_->inner_viewport_scroll_layer(),
- layer_tree_->outer_viewport_scroll_layer(),
- layer_tree_->overscroll_elasticity_layer(), elastic_overscroll_,
- layer_tree_->page_scale_factor(), layer_tree_->device_scale_factor(),
- gfx::Rect(layer_tree_->device_viewport_size()), identity_transform,
- layer_tree_->property_trees());
+ root_layer_.get(), page_scale_layer_.get(),
+ inner_viewport_scroll_layer_.get(), outer_viewport_scroll_layer_.get(),
+ overscroll_elasticity_layer_.get(), elastic_overscroll_,
+ page_scale_factor_, device_scale_factor_,
+ gfx::Rect(device_viewport_size_), identity_transform, &property_trees_);
}
static void SetElementIdForTesting(Layer* layer) {
@@ -786,19 +989,17 @@
TRACE_EVENT1("cc", "LayerTreeHost::DoUpdateLayers", "source_frame_number",
source_frame_number());
- layer_tree_->UpdateHudLayer(debug_state_.ShowHudInfo());
UpdateHudLayer();
Layer* root_scroll =
PropertyTreeBuilder::FindFirstScrollableLayer(root_layer);
- Layer* page_scale_layer = layer_tree_->page_scale_layer();
+ Layer* page_scale_layer = page_scale_layer_.get();
if (!page_scale_layer && root_scroll)
page_scale_layer = root_scroll->parent();
- if (layer_tree_->hud_layer()) {
- layer_tree_->hud_layer()->PrepareForCalculateDrawProperties(
- layer_tree_->device_viewport_size(),
- layer_tree_->device_scale_factor());
+ if (hud_layer_.get()) {
+ hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size(),
+ device_scale_factor_);
}
gfx::Transform identity_transform;
@@ -810,32 +1011,30 @@
"LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees");
PropertyTreeBuilder::PreCalculateMetaInformation(root_layer);
bool can_render_to_separate_surface = true;
- PropertyTrees* property_trees = layer_tree_->property_trees();
if (!settings_.use_layer_lists) {
// If use_layer_lists is set, then the property trees should have been
// built by the client already.
PropertyTreeBuilder::BuildPropertyTrees(
- root_layer, page_scale_layer,
- layer_tree_->inner_viewport_scroll_layer(),
- layer_tree_->outer_viewport_scroll_layer(),
- layer_tree_->overscroll_elasticity_layer(), elastic_overscroll_,
- layer_tree_->page_scale_factor(), layer_tree_->device_scale_factor(),
- gfx::Rect(layer_tree_->device_viewport_size()), identity_transform,
- property_trees);
+ root_layer, page_scale_layer, inner_viewport_scroll_layer_.get(),
+ outer_viewport_scroll_layer_.get(),
+ overscroll_elasticity_layer_.get(), elastic_overscroll_,
+ page_scale_factor_, device_scale_factor_,
+ gfx::Rect(device_viewport_size_), identity_transform,
+ &property_trees_);
TRACE_EVENT_INSTANT1("cc",
"LayerTreeHost::UpdateLayers_BuiltPropertyTrees",
TRACE_EVENT_SCOPE_THREAD, "property_trees",
- property_trees->AsTracedValue());
+ property_trees_.AsTracedValue());
} else {
TRACE_EVENT_INSTANT1("cc",
"LayerTreeHost::UpdateLayers_ReceivedPropertyTrees",
TRACE_EVENT_SCOPE_THREAD, "property_trees",
- property_trees->AsTracedValue());
+ property_trees_.AsTracedValue());
}
- draw_property_utils::UpdatePropertyTrees(property_trees,
+ draw_property_utils::UpdatePropertyTrees(&property_trees_,
can_render_to_separate_surface);
draw_property_utils::FindLayersThatNeedUpdates(
- this, property_trees->transform_tree, property_trees->effect_tree,
+ this, property_trees_.transform_tree, property_trees_.effect_tree,
&update_layer_list);
}
@@ -843,8 +1042,8 @@
layer->SavePaintProperties();
bool content_is_suitable_for_gpu = true;
- bool did_paint_content = layer_tree_->UpdateLayers(
- update_layer_list, &content_is_suitable_for_gpu);
+ bool did_paint_content =
+ layer_tree_.UpdateLayers(update_layer_list, &content_is_suitable_for_gpu);
if (content_is_suitable_for_gpu) {
++num_consecutive_frames_suitable_for_gpu_;
@@ -871,10 +1070,10 @@
// Preemptively apply the scroll offset and scale delta here before sending
// it to the client. If the client comes back and sets it to the same
// value, then the layer can early out without needing a full commit.
- if (layer_tree_->inner_viewport_scroll_layer()) {
- layer_tree_->inner_viewport_scroll_layer()->SetScrollOffsetFromImplSide(
+ if (inner_viewport_scroll_layer_.get()) {
+ inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
gfx::ScrollOffsetWithDelta(
- layer_tree_->inner_viewport_scroll_layer()->scroll_offset(),
+ inner_viewport_scroll_layer_->scroll_offset(),
inner_viewport_scroll_delta));
}
@@ -899,7 +1098,7 @@
QueueSwapPromise(std::move(swap_promise));
}
- if (layer_tree_->root_layer()) {
+ if (root_layer_.get()) {
for (size_t i = 0; i < info->scrolls.size(); ++i) {
Layer* layer = LayerById(info->scrolls[i].layer_id);
if (!layer)
@@ -916,6 +1115,24 @@
ApplyViewportDeltas(info);
}
+void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) {
+ if (device_scale_factor == device_scale_factor_)
+ return;
+ device_scale_factor_ = device_scale_factor;
+
+ property_trees_.needs_rebuild = true;
+ SetNeedsCommit();
+}
+
+void LayerTreeHost::SetPaintedDeviceScaleFactor(
+ float painted_device_scale_factor) {
+ if (painted_device_scale_factor == painted_device_scale_factor_)
+ return;
+ painted_device_scale_factor_ = painted_device_scale_factor;
+
+ SetNeedsCommit();
+}
+
void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints,
TopControlsState current,
bool animate) {
@@ -925,14 +1142,14 @@
}
void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) {
- AnimationHost* animation_host = layer_tree_->animation_host();
+ AnimationHost* animation_host = layer_tree_.animation_host();
std::unique_ptr<AnimationEvents> events = animation_host->CreateEvents();
if (animation_host->AnimateLayers(monotonic_time))
animation_host->UpdateAnimationState(true, events.get());
if (!events->events_.empty())
- layer_tree_->property_trees()->needs_rebuild = true;
+ property_trees_.needs_rebuild = true;
}
UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) {
@@ -989,6 +1206,46 @@
return data.size;
}
+void LayerTreeHost::RegisterViewportLayers(
+ scoped_refptr<Layer> overscroll_elasticity_layer,
+ scoped_refptr<Layer> page_scale_layer,
+ scoped_refptr<Layer> inner_viewport_scroll_layer,
+ scoped_refptr<Layer> outer_viewport_scroll_layer) {
+ DCHECK(!inner_viewport_scroll_layer ||
+ inner_viewport_scroll_layer != outer_viewport_scroll_layer);
+ overscroll_elasticity_layer_ = overscroll_elasticity_layer;
+ page_scale_layer_ = page_scale_layer;
+ inner_viewport_scroll_layer_ = inner_viewport_scroll_layer;
+ outer_viewport_scroll_layer_ = outer_viewport_scroll_layer;
+}
+
+void LayerTreeHost::RegisterSelection(const LayerSelection& selection) {
+ if (selection_ == selection)
+ return;
+
+ selection_ = selection;
+ SetNeedsCommit();
+}
+
+void LayerTreeHost::SetHaveScrollEventHandlers(bool have_event_handlers) {
+ if (have_scroll_event_handlers_ == have_event_handlers)
+ return;
+
+ have_scroll_event_handlers_ = have_event_handlers;
+ SetNeedsCommit();
+}
+
+void LayerTreeHost::SetEventListenerProperties(
+ EventListenerClass event_class,
+ EventListenerProperties properties) {
+ const size_t index = static_cast<size_t>(event_class);
+ if (event_listener_properties_[index] == properties)
+ return;
+
+ event_listener_properties_[index] = properties;
+ SetNeedsCommit();
+}
+
int LayerTreeHost::ScheduleMicroBenchmark(
const std::string& benchmark_name,
std::unique_ptr<base::Value> value,
@@ -1054,7 +1311,7 @@
}
Layer* LayerTreeHost::LayerById(int id) const {
- return layer_tree_->LayerById(id);
+ return layer_tree_.LayerById(id);
}
Layer* LayerTreeHost::LayerByElementId(ElementId element_id) const {
@@ -1086,7 +1343,7 @@
}
void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() {
- layer_tree_->property_trees()->needs_rebuild = true;
+ property_trees_.needs_rebuild = true;
}
void LayerTreeHost::SetElementFilterMutated(ElementId element_id,
@@ -1247,12 +1504,17 @@
swap_promises->swap(swap_promise_list_);
DCHECK(swap_promise_list_.empty());
+ proto->set_needs_full_tree_sync(needs_full_tree_sync_);
+ proto->set_needs_meta_info_recomputation(needs_meta_info_recomputation_);
proto->set_source_frame_number(source_frame_number_);
+
+ LayerProtoConverter::SerializeLayerHierarchy(root_layer_,
+ proto->mutable_root_layer());
// Serialize the LayerTree before serializing the properties. During layer
// property serialization, we clear the list |layer_that_should_properties_|
// from the LayerTree.
- layer_tree_->ToProtobuf(proto->mutable_layer_tree());
+ layer_tree_.ToProtobuf(proto->mutable_layer_tree());
LayerProtoConverter::SerializeLayerProperties(this,
proto->mutable_layer_updates());
@@ -1262,13 +1524,51 @@
proto::PictureDataVectorToSkPicturesProto(pictures,
proto->mutable_pictures());
+ proto->set_hud_layer_id(hud_layer_ ? hud_layer_->id() : Layer::INVALID_ID);
debug_state_.ToProtobuf(proto->mutable_debug_state());
+ SizeToProto(device_viewport_size_, proto->mutable_device_viewport_size());
+ proto->set_top_controls_shrink_blink_size(top_controls_shrink_blink_size_);
+ proto->set_top_controls_height(top_controls_height_);
+ proto->set_top_controls_shown_ratio(top_controls_shown_ratio_);
+ proto->set_device_scale_factor(device_scale_factor_);
+ proto->set_painted_device_scale_factor(painted_device_scale_factor_);
+ proto->set_page_scale_factor(page_scale_factor_);
+ proto->set_min_page_scale_factor(min_page_scale_factor_);
+ proto->set_max_page_scale_factor(max_page_scale_factor_);
Vector2dFToProto(elastic_overscroll_, proto->mutable_elastic_overscroll());
proto->set_has_gpu_rasterization_trigger(has_gpu_rasterization_trigger_);
proto->set_content_is_suitable_for_gpu_rasterization(
content_is_suitable_for_gpu_rasterization_);
+ proto->set_background_color(background_color_);
+ proto->set_has_transparent_background(has_transparent_background_);
+ proto->set_have_scroll_event_handlers(have_scroll_event_handlers_);
+ proto->set_wheel_event_listener_properties(static_cast<uint32_t>(
+ event_listener_properties(EventListenerClass::kMouseWheel)));
+ proto->set_touch_start_or_move_event_listener_properties(
+ static_cast<uint32_t>(
+ event_listener_properties(EventListenerClass::kTouchStartOrMove)));
+ proto->set_touch_end_or_cancel_event_listener_properties(
+ static_cast<uint32_t>(
+ event_listener_properties(EventListenerClass::kTouchEndOrCancel)));
proto->set_id(id_);
proto->set_next_commit_forces_redraw(next_commit_forces_redraw_);
+
+ // Viewport layers.
+ proto->set_overscroll_elasticity_layer_id(
+ overscroll_elasticity_layer_ ? overscroll_elasticity_layer_->id()
+ : Layer::INVALID_ID);
+ proto->set_page_scale_layer_id(page_scale_layer_ ? page_scale_layer_->id()
+ : Layer::INVALID_ID);
+ proto->set_inner_viewport_scroll_layer_id(
+ inner_viewport_scroll_layer_ ? inner_viewport_scroll_layer_->id()
+ : Layer::INVALID_ID);
+ proto->set_outer_viewport_scroll_layer_id(
+ outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
+ : Layer::INVALID_ID);
+
+ LayerSelectionToProtobuf(selection_, proto->mutable_selection());
+
+ property_trees_.ToProtobuf(proto->mutable_property_trees());
proto->set_surface_client_id(surface_client_id_);
proto->set_next_surface_sequence(next_surface_sequence_);
@@ -1280,9 +1580,19 @@
void LayerTreeHost::FromProtobufForCommit(const proto::LayerTreeHost& proto) {
DCHECK(client_picture_cache_);
+ needs_full_tree_sync_ = proto.needs_full_tree_sync();
+ needs_meta_info_recomputation_ = proto.needs_meta_info_recomputation();
source_frame_number_ = proto.source_frame_number();
- layer_tree_->FromProtobuf(proto.layer_tree());
+ // Layer hierarchy.
+ scoped_refptr<Layer> new_root_layer =
+ LayerProtoConverter::DeserializeLayerHierarchy(root_layer_,
+ proto.root_layer(), this);
+ if (root_layer_ != new_root_layer) {
+ root_layer_ = new_root_layer;
+ }
+
+ layer_tree_.FromProtobuf(proto.layer_tree());
// Ensure ClientPictureCache contains all the necessary SkPictures before
// deserializing the properties.
@@ -1291,26 +1601,80 @@
SkPicturesProtoToPictureDataVector(proto_pictures);
client_picture_cache_->ApplyCacheUpdate(pictures);
- LayerProtoConverter::DeserializeLayerProperties(layer_tree_->root_layer(),
+ LayerProtoConverter::DeserializeLayerProperties(root_layer_.get(),
proto.layer_updates());
// The deserialization is finished, so now clear the cache.
client_picture_cache_->Flush();
debug_state_.FromProtobuf(proto.debug_state());
+ device_viewport_size_ = ProtoToSize(proto.device_viewport_size());
+ top_controls_shrink_blink_size_ = proto.top_controls_shrink_blink_size();
+ top_controls_height_ = proto.top_controls_height();
+ top_controls_shown_ratio_ = proto.top_controls_shown_ratio();
+ device_scale_factor_ = proto.device_scale_factor();
+ painted_device_scale_factor_ = proto.painted_device_scale_factor();
+ page_scale_factor_ = proto.page_scale_factor();
+ min_page_scale_factor_ = proto.min_page_scale_factor();
+ max_page_scale_factor_ = proto.max_page_scale_factor();
elastic_overscroll_ = ProtoToVector2dF(proto.elastic_overscroll());
has_gpu_rasterization_trigger_ = proto.has_gpu_rasterization_trigger();
content_is_suitable_for_gpu_rasterization_ =
proto.content_is_suitable_for_gpu_rasterization();
+ background_color_ = proto.background_color();
+ has_transparent_background_ = proto.has_transparent_background();
+ have_scroll_event_handlers_ = proto.have_scroll_event_handlers();
+ event_listener_properties_[static_cast<size_t>(
+ EventListenerClass::kMouseWheel)] =
+ static_cast<EventListenerProperties>(
+ proto.wheel_event_listener_properties());
+ event_listener_properties_[static_cast<size_t>(
+ EventListenerClass::kTouchStartOrMove)] =
+ static_cast<EventListenerProperties>(
+ proto.touch_start_or_move_event_listener_properties());
+ event_listener_properties_[static_cast<size_t>(
+ EventListenerClass::kTouchEndOrCancel)] =
+ static_cast<EventListenerProperties>(
+ proto.touch_end_or_cancel_event_listener_properties());
id_ = proto.id();
next_commit_forces_redraw_ = proto.next_commit_forces_redraw();
+ hud_layer_ = static_cast<HeadsUpDisplayLayer*>(
+ UpdateAndGetLayer(hud_layer_.get(), proto.hud_layer_id(), &layer_tree_));
+ overscroll_elasticity_layer_ =
+ UpdateAndGetLayer(overscroll_elasticity_layer_.get(),
+ proto.overscroll_elasticity_layer_id(), &layer_tree_);
+ page_scale_layer_ = UpdateAndGetLayer(
+ page_scale_layer_.get(), proto.page_scale_layer_id(), &layer_tree_);
+ inner_viewport_scroll_layer_ =
+ UpdateAndGetLayer(inner_viewport_scroll_layer_.get(),
+ proto.inner_viewport_scroll_layer_id(), &layer_tree_);
+ outer_viewport_scroll_layer_ =
+ UpdateAndGetLayer(outer_viewport_scroll_layer_.get(),
+ proto.outer_viewport_scroll_layer_id(), &layer_tree_);
+
+ LayerSelectionFromProtobuf(&selection_, proto.selection());
+
+ // It is required to create new PropertyTrees before deserializing it.
+ property_trees_ = PropertyTrees();
+ property_trees_.FromProtobuf(proto.property_trees());
+
+ // Forcefully override the sequence number of all layers in the tree to have
+ // a valid sequence number. Changing the sequence number for a layer does not
+ // need a commit, so the value will become out of date for layers that are not
+ // updated for other reasons. All layers that at this point are part of the
+ // layer tree are valid, so it is OK that they have a valid sequence number.
+ int seq_num = property_trees_.sequence_number;
+ LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) {
+ layer->set_property_tree_sequence_number(seq_num);
+ });
+
surface_client_id_ = proto.surface_client_id();
next_surface_sequence_ = proto.next_surface_sequence();
}
AnimationHost* LayerTreeHost::animation_host() const {
- return layer_tree_->animation_host();
+ return layer_tree_.animation_host();
}
} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698