| Index: cc/trees/layer_tree_host.cc
|
| diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
|
| index f295efcfaca6ea2c8cdaf8b5fbe7946151a5bcca..ffab7dff5d5e7c901c271283e116c7f3c947f5bf 100644
|
| --- a/cc/trees/layer_tree_host.cc
|
| +++ b/cc/trees/layer_tree_host.cc
|
| @@ -14,7 +14,6 @@
|
| #include <unordered_map>
|
|
|
| #include "base/atomic_sequence_num.h"
|
| -#include "base/auto_reset.h"
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| #include "base/location.h"
|
| @@ -45,6 +44,7 @@
|
| #include "cc/layers/layer_proto_converter.h"
|
| #include "cc/layers/painted_scrollbar_layer.h"
|
| #include "cc/proto/gfx_conversions.h"
|
| +#include "cc/proto/layer_tree.pb.h"
|
| #include "cc/proto/layer_tree_host.pb.h"
|
| #include "cc/resources/ui_resource_request.h"
|
| #include "cc/scheduler/begin_frame_source.h"
|
| @@ -70,20 +70,19 @@ namespace {
|
|
|
| Layer* UpdateAndGetLayer(Layer* current_layer,
|
| int layer_id,
|
| - const std::unordered_map<int, Layer*>& layer_id_map) {
|
| + LayerTree* layer_tree) {
|
| if (layer_id == Layer::INVALID_ID) {
|
| if (current_layer)
|
| current_layer->SetLayerTreeHost(nullptr);
|
|
|
| return nullptr;
|
| }
|
| -
|
| - auto layer_it = layer_id_map.find(layer_id);
|
| - DCHECK(layer_it != layer_id_map.end());
|
| - if (current_layer && current_layer != layer_it->second)
|
| + Layer* layer = layer_tree->LayerById(layer_id);
|
| + DCHECK(layer);
|
| + if (current_layer && current_layer != layer)
|
| current_layer->SetLayerTreeHost(nullptr);
|
|
|
| - return layer_it->second;
|
| + return layer;
|
| }
|
|
|
| std::unique_ptr<base::trace_event::TracedValue>
|
| @@ -242,9 +241,7 @@ LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode)
|
| has_transparent_background_(false),
|
| have_scroll_event_handlers_(false),
|
| event_listener_properties_(),
|
| - animation_host_(std::move(params->animation_host)),
|
| did_complete_scale_animation_(false),
|
| - in_paint_layer_contents_(false),
|
| id_(s_layer_tree_host_sequence_number.GetNext() + 1),
|
| next_commit_forces_redraw_(false),
|
| shared_bitmap_manager_(params->shared_bitmap_manager),
|
| @@ -252,11 +249,11 @@ LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode)
|
| 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(animation_host_);
|
| - animation_host_->SetMutatorHostClient(this);
|
| + layer_tree_.animation_host()->SetMutatorHostClient(this);
|
|
|
| rendering_stats_instrumentation_->set_record_rendering_stats(
|
| debug_state_.RecordRenderingStats());
|
| @@ -367,13 +364,14 @@ void LayerTreeHost::InitializeProxy(
|
| proxy_ = std::move(proxy);
|
| proxy_->Start(std::move(external_begin_frame_source));
|
|
|
| - animation_host_->SetSupportsScrollAnimations(proxy_->SupportsImplScrolling());
|
| + layer_tree_.animation_host()->SetSupportsScrollAnimations(
|
| + proxy_->SupportsImplScrolling());
|
| }
|
|
|
| LayerTreeHost::~LayerTreeHost() {
|
| TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost");
|
|
|
| - animation_host_->SetMutatorHostClient(nullptr);
|
| + layer_tree_.animation_host()->SetMutatorHostClient(nullptr);
|
|
|
| if (root_layer_.get())
|
| root_layer_->SetLayerTreeHost(NULL);
|
| @@ -551,7 +549,7 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
|
| {
|
| TRACE_EVENT0("cc", "LayerTreeHost::PushProperties");
|
|
|
| - TreeSynchronizer::PushLayerProperties(this, 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
|
| @@ -562,7 +560,7 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
|
|
|
| TRACE_EVENT0("cc", "LayerTreeHost::AnimationHost::PushProperties");
|
| DCHECK(host_impl->animation_host());
|
| - 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
|
| @@ -649,7 +647,7 @@ std::unique_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl(
|
|
|
| const bool supports_impl_scrolling = task_runner_provider_->HasImplThread();
|
| std::unique_ptr<AnimationHost> animation_host_impl =
|
| - 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(),
|
| @@ -754,7 +752,7 @@ void LayerTreeHost::SetNextCommitForcesRedraw() {
|
| void LayerTreeHost::SetAnimationEvents(
|
| std::unique_ptr<AnimationEvents> events) {
|
| DCHECK(task_runner_provider_->IsMainThread());
|
| - animation_host_->SetAnimationEvents(std::move(events));
|
| + layer_tree_.animation_host()->SetAnimationEvents(std::move(events));
|
| }
|
|
|
| void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) {
|
| @@ -1049,13 +1047,9 @@ bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) {
|
| for (const auto& layer : update_layer_list)
|
| layer->SavePaintProperties();
|
|
|
| - base::AutoReset<bool> painting(&in_paint_layer_contents_, true);
|
| - bool did_paint_content = false;
|
| bool content_is_suitable_for_gpu = true;
|
| - for (const auto& layer : update_layer_list) {
|
| - did_paint_content |= layer->Update();
|
| - content_is_suitable_for_gpu &= layer->IsSuitableForGpuRasterization();
|
| - }
|
| + 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_;
|
| @@ -1154,10 +1148,11 @@ void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints,
|
| }
|
|
|
| void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) {
|
| - std::unique_ptr<AnimationEvents> events = animation_host_->CreateEvents();
|
| + 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 (animation_host->AnimateLayers(monotonic_time))
|
| + animation_host->UpdateAnimationState(true, events.get());
|
|
|
| if (!events->events_.empty())
|
| property_trees_.needs_rebuild = true;
|
| @@ -1316,8 +1311,7 @@ void LayerTreeHost::SetLayerTreeMutator(
|
| }
|
|
|
| Layer* LayerTreeHost::LayerById(int id) const {
|
| - LayerIdMap::const_iterator iter = layer_id_map_.find(id);
|
| - return iter != layer_id_map_.end() ? iter->second : nullptr;
|
| + return layer_tree_.LayerById(id);
|
| }
|
|
|
| Layer* LayerTreeHost::LayerByElementId(ElementId element_id) const {
|
| @@ -1339,44 +1333,6 @@ void LayerTreeHost::RemoveFromElementMap(Layer* layer) {
|
| element_layers_map_.erase(layer->element_id());
|
| }
|
|
|
| -void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) {
|
| - layers_that_should_push_properties_.insert(layer);
|
| -}
|
| -
|
| -void LayerTreeHost::RemoveLayerShouldPushProperties(Layer* layer) {
|
| - layers_that_should_push_properties_.erase(layer);
|
| -}
|
| -
|
| -std::unordered_set<Layer*>& LayerTreeHost::LayersThatShouldPushProperties() {
|
| - return layers_that_should_push_properties_;
|
| -}
|
| -
|
| -bool LayerTreeHost::LayerNeedsPushPropertiesForTesting(Layer* layer) {
|
| - return layers_that_should_push_properties_.find(layer) !=
|
| - layers_that_should_push_properties_.end();
|
| -}
|
| -
|
| -void LayerTreeHost::RegisterLayer(Layer* layer) {
|
| - DCHECK(!LayerById(layer->id()));
|
| - DCHECK(!in_paint_layer_contents_);
|
| - layer_id_map_[layer->id()] = layer;
|
| - if (layer->element_id()) {
|
| - animation_host_->RegisterElement(layer->element_id(),
|
| - ElementListType::ACTIVE);
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::UnregisterLayer(Layer* layer) {
|
| - DCHECK(LayerById(layer->id()));
|
| - DCHECK(!in_paint_layer_contents_);
|
| - if (layer->element_id()) {
|
| - animation_host_->UnregisterElement(layer->element_id(),
|
| - ElementListType::ACTIVE);
|
| - }
|
| - RemoveLayerShouldPushProperties(layer);
|
| - layer_id_map_.erase(layer->id());
|
| -}
|
| -
|
| bool LayerTreeHost::IsElementInList(ElementId element_id,
|
| ElementListType list_type) const {
|
| return list_type == ElementListType::ACTIVE && LayerByElementId(element_id);
|
| @@ -1555,10 +1511,10 @@ void LayerTreeHost::ToProtobufForCommit(
|
| LayerProtoConverter::SerializeLayerHierarchy(root_layer_,
|
| proto->mutable_root_layer());
|
|
|
| - // layers_that_should_push_properties_ should be serialized before layer
|
| - // properties because it is cleared during the properties serialization.
|
| - for (auto* layer : layers_that_should_push_properties_)
|
| - proto->add_layers_that_should_push_properties(layer->id());
|
| + // 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());
|
|
|
| LayerProtoConverter::SerializeLayerProperties(this,
|
| proto->mutable_layer_updates());
|
| @@ -1594,7 +1550,6 @@ void LayerTreeHost::ToProtobufForCommit(
|
| proto->set_touch_end_or_cancel_event_listener_properties(
|
| static_cast<uint32_t>(
|
| event_listener_properties(EventListenerClass::kTouchEndOrCancel)));
|
| - proto->set_in_paint_layer_contents(in_paint_layer_contents_);
|
| proto->set_id(id_);
|
| proto->set_next_commit_forces_redraw(next_commit_forces_redraw_);
|
|
|
| @@ -1625,7 +1580,6 @@ void LayerTreeHost::ToProtobufForCommit(
|
|
|
| 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();
|
| @@ -1638,8 +1592,7 @@ void LayerTreeHost::FromProtobufForCommit(const proto::LayerTreeHost& proto) {
|
| root_layer_ = new_root_layer;
|
| }
|
|
|
| - for (auto layer_id : proto.layers_that_should_push_properties())
|
| - layers_that_should_push_properties_.insert(layer_id_map_[layer_id]);
|
| + layer_tree_.FromProtobuf(proto.layer_tree());
|
|
|
| // Ensure ClientPictureCache contains all the necessary SkPictures before
|
| // deserializing the properties.
|
| @@ -1683,23 +1636,22 @@ void LayerTreeHost::FromProtobufForCommit(const proto::LayerTreeHost& proto) {
|
| EventListenerClass::kTouchEndOrCancel)] =
|
| static_cast<EventListenerProperties>(
|
| proto.touch_end_or_cancel_event_listener_properties());
|
| - in_paint_layer_contents_ = proto.in_paint_layer_contents();
|
| 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_id_map_));
|
| + UpdateAndGetLayer(hud_layer_.get(), proto.hud_layer_id(), &layer_tree_));
|
| overscroll_elasticity_layer_ =
|
| UpdateAndGetLayer(overscroll_elasticity_layer_.get(),
|
| - proto.overscroll_elasticity_layer_id(), layer_id_map_);
|
| + proto.overscroll_elasticity_layer_id(), &layer_tree_);
|
| page_scale_layer_ = UpdateAndGetLayer(
|
| - page_scale_layer_.get(), proto.page_scale_layer_id(), layer_id_map_);
|
| + 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_id_map_);
|
| + 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_id_map_);
|
| + proto.outer_viewport_scroll_layer_id(), &layer_tree_);
|
|
|
| LayerSelectionFromProtobuf(&selection_, proto.selection());
|
|
|
| @@ -1721,4 +1673,8 @@ void LayerTreeHost::FromProtobufForCommit(const proto::LayerTreeHost& proto) {
|
| next_surface_sequence_ = proto.next_surface_sequence();
|
| }
|
|
|
| +AnimationHost* LayerTreeHost::animation_host() const {
|
| + return layer_tree_.animation_host();
|
| +}
|
| +
|
| } // namespace cc
|
|
|