| 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
|
|
|