Skip to content

Commit

Permalink
Convert element to layer map to just track elements in list.
Browse files Browse the repository at this point in the history
The element_layers_map_ is only used to determine when elements are in
the active or pending tree for the purposes of ticking animations. This
patch converts the element layers map to a set tracking which element
ids are present.

Bug: 836897
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel;luci.chromium.try:linux-blink-gen-property-trees
Change-Id: I858a00d4f80fc5ac36a21e5d4cf21e0e379abdec
Reviewed-on: https://chromium-review.googlesource.com/1071072
Reviewed-by: Philip Rogers <pdr@chromium.org>
Reviewed-by: Stephen McGruer <smcgruer@chromium.org>
Commit-Queue: Robert Flack <flackr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#562286}
  • Loading branch information
Robert Flack authored and Commit Bot committed May 28, 2018
1 parent 6a6cebb commit 1d7d73f
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 45 deletions.
8 changes: 4 additions & 4 deletions cc/layers/layer_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,15 @@ LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, int id)

DCHECK(layer_tree_impl_);
layer_tree_impl_->RegisterLayer(this);
layer_tree_impl_->AddToElementMap(this);
layer_tree_impl_->AddToElementLayerList(element_id_);

SetNeedsPushProperties();
}

LayerImpl::~LayerImpl() {
DCHECK_EQ(DRAW_MODE_NONE, current_draw_mode_);
layer_tree_impl_->UnregisterLayer(this);
layer_tree_impl_->RemoveFromElementMap(this);
layer_tree_impl_->RemoveFromElementLayerList(element_id_);
TRACE_EVENT_OBJECT_DELETED_WITH_ID(
TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerImpl", this);
}
Expand Down Expand Up @@ -643,9 +643,9 @@ void LayerImpl::SetElementId(ElementId element_id) {
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "LayerImpl::SetElementId",
"element", element_id.AsValue().release());

layer_tree_impl_->RemoveFromElementMap(this);
layer_tree_impl_->RemoveFromElementLayerList(element_id_);
element_id_ = element_id;
layer_tree_impl_->AddToElementMap(this);
layer_tree_impl_->AddToElementLayerList(element_id_);

SetNeedsPushProperties();
}
Expand Down
4 changes: 0 additions & 4 deletions cc/layers/scrollbar_layer_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -965,10 +965,6 @@ TEST_F(AuraScrollbarLayerTest, ScrollbarLayerCreateAfterSetScrollable) {
layer_tree_host_->CommitAndCreatePendingTree();
host_impl->ActivateSyncTree();

LayerImpl* scroll_layer_impl =
host_impl->active_tree()->LayerByElementId(scroll_layer->element_id());
EXPECT_TRUE(scroll_layer_impl->needs_show_scrollbars());

std::unique_ptr<Scrollbar> scrollbar(new FakeScrollbar(false, true, true));
scoped_refptr<Layer> scrollbar_layer = SolidColorScrollbarLayer::Create(
scrollbar->Orientation(), kThumbThickness, kTrackStart,
Expand Down
15 changes: 4 additions & 11 deletions cc/trees/layer_tree_host_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5161,18 +5161,11 @@ bool LayerTreeHostImpl::ScrollAnimationUpdateTarget(

bool LayerTreeHostImpl::IsElementInList(ElementId element_id,
ElementListType list_type) const {
if (list_type == ElementListType::ACTIVE) {
return active_tree()
? active_tree()->LayerByElementId(element_id) != nullptr
: false;
} else {
if (pending_tree() && pending_tree()->LayerByElementId(element_id))
return true;
if (recycle_tree() && recycle_tree()->LayerByElementId(element_id))
return true;
if (list_type == ElementListType::ACTIVE)
return active_tree() && active_tree()->IsElementInLayerList(element_id);

return false;
}
return (pending_tree() && pending_tree()->IsElementInLayerList(element_id)) ||
(recycle_tree() && recycle_tree()->IsElementInLayerList(element_id));
}

void LayerTreeHostImpl::SetMutatorsNeedCommit() {}
Expand Down
35 changes: 15 additions & 20 deletions cc/trees/layer_tree_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -596,52 +596,47 @@ LayerImplList::reverse_iterator LayerTreeImpl::rend() {
return layer_list_.rend();
}

LayerImpl* LayerTreeImpl::LayerByElementId(ElementId element_id) const {
auto iter = element_layers_map_.find(element_id);
return (iter == element_layers_map_.end()) ? nullptr
: LayerById(iter->second);
bool LayerTreeImpl::IsElementInLayerList(ElementId element_id) const {
return elements_in_layer_list_.count(element_id);
}

ElementListType LayerTreeImpl::GetElementTypeForAnimation() const {
return IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING;
}

void LayerTreeImpl::AddToElementMap(LayerImpl* layer) {
ElementId element_id = layer->element_id();
void LayerTreeImpl::AddToElementLayerList(ElementId element_id) {
if (!element_id)
return;

TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("layer-element"),
"LayerTreeImpl::AddToElementMap", "element",
element_id.AsValue().release(), "layer_id", layer->id());
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("layer-element"),
"LayerTreeImpl::AddToElementLayerList", "element",
element_id.AsValue().release());

#if DCHECK_IS_ON()
LayerImpl* existing_layer = LayerByElementId(element_id);
bool element_id_collision_detected =
existing_layer && existing_layer != layer;
elements_in_layer_list_.count(element_id);

DCHECK(!element_id_collision_detected);
#endif

element_layers_map_[element_id] = layer->id();
elements_in_layer_list_.insert(element_id);

host_impl_->mutator_host()->RegisterElement(element_id,
GetElementTypeForAnimation());
}

void LayerTreeImpl::RemoveFromElementMap(LayerImpl* layer) {
if (!layer->element_id())
void LayerTreeImpl::RemoveFromElementLayerList(ElementId element_id) {
if (!element_id)
return;

TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("layer-element"),
"LayerTreeImpl::RemoveFromElementMap", "element",
layer->element_id().AsValue().release(), "layer_id",
layer->id());
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("layer-element"),
"LayerTreeImpl::RemoveFromElementLayerList", "element",
element_id.AsValue().release());

host_impl_->mutator_host()->UnregisterElement(layer->element_id(),
host_impl_->mutator_host()->UnregisterElement(element_id,
GetElementTypeForAnimation());

element_layers_map_.erase(layer->element_id());
elements_in_layer_list_.erase(element_id);
}

void LayerTreeImpl::SetTransformMutated(ElementId element_id,
Expand Down
11 changes: 5 additions & 6 deletions cc/trees/layer_tree_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -381,11 +381,9 @@ class CC_EXPORT LayerTreeImpl {

LayerImpl* LayerById(int id) const;

// TODO(jaydasika): this is deprecated. It is used by
// scrolling animation to look up layers to mutate.
LayerImpl* LayerByElementId(ElementId element_id) const;
void AddToElementMap(LayerImpl* layer);
void RemoveFromElementMap(LayerImpl* layer);
bool IsElementInLayerList(ElementId element_id) const;
void AddToElementLayerList(ElementId element_id);
void RemoveFromElementLayerList(ElementId element_id);

void SetSurfaceLayerIds(
const base::flat_set<viz::SurfaceId>& surface_layer_ids);
Expand Down Expand Up @@ -622,7 +620,8 @@ class CC_EXPORT LayerTreeImpl {
// Set of layers that need to push properties.
std::unordered_set<LayerImpl*> layers_that_should_push_properties_;

std::unordered_map<ElementId, int, ElementIdHash> element_layers_map_;
// Set of ElementIds which are present in the |layer_list_|.
std::unordered_set<ElementId, ElementIdHash> elements_in_layer_list_;

std::unordered_map<ElementId, float, ElementIdHash>
element_id_to_opacity_animations_;
Expand Down

0 comments on commit 1d7d73f

Please sign in to comment.