OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/layer_tree_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 | 512 |
513 LayerImplList::reverse_iterator LayerTreeImpl::rbegin() { | 513 LayerImplList::reverse_iterator LayerTreeImpl::rbegin() { |
514 return layer_list_.rbegin(); | 514 return layer_list_.rbegin(); |
515 } | 515 } |
516 | 516 |
517 LayerImplList::reverse_iterator LayerTreeImpl::rend() { | 517 LayerImplList::reverse_iterator LayerTreeImpl::rend() { |
518 return layer_list_.rend(); | 518 return layer_list_.rend(); |
519 } | 519 } |
520 | 520 |
521 int LayerTreeImpl::LayerIdByElementId(ElementId element_id) const { | 521 int LayerTreeImpl::LayerIdByElementId(ElementId element_id) const { |
522 auto iter = element_layers_map_.find(element_id); | 522 auto iter = element_layers_map_.find(element_id.id); |
wkorman
2017/05/08 18:23:24
Similar to my prev comment re: hash, there must be
| |
523 if (iter == element_layers_map_.end()) | 523 if (iter == element_layers_map_.end()) |
524 return Layer::INVALID_ID; | 524 return Layer::INVALID_ID; |
525 | 525 |
526 return iter->second; | 526 return iter->second; |
527 } | 527 } |
528 | 528 |
529 LayerImpl* LayerTreeImpl::LayerByElementId(ElementId element_id) const { | 529 LayerImpl* LayerTreeImpl::LayerByElementId(ElementId element_id) const { |
530 return LayerById(LayerIdByElementId(element_id)); | 530 return LayerById(LayerIdByElementId(element_id)); |
531 } | 531 } |
532 | 532 |
533 void LayerTreeImpl::AddToElementMap(LayerImpl* layer) { | 533 void LayerTreeImpl::AddToElementMap(LayerImpl* layer) { |
534 ElementId element_id = layer->element_id(); | 534 ElementId element_id = layer->element_id(); |
535 if (!element_id) | 535 if (!element_id) |
536 return; | 536 return; |
537 | 537 |
538 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), | 538 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), |
539 "LayerTreeImpl::AddToElementMap", "element", | 539 "LayerTreeImpl::AddToElementMap", "element", element_id.id, |
540 element_id.AsValue().release(), "layer_id", layer->id()); | 540 "layer_id", layer->id()); |
541 | 541 |
542 #if DCHECK_IS_ON() | 542 #if DCHECK_IS_ON() |
543 LayerImpl* existing_layer = LayerByElementId(element_id); | 543 LayerImpl* existing_layer = LayerByElementId(element_id); |
544 bool element_id_collision_detected = | 544 bool element_id_collision_detected = |
545 existing_layer && existing_layer != layer; | 545 existing_layer && existing_layer != layer; |
546 | 546 |
547 // TODO(pdr): Remove this suppression and always check for id collisions. | 547 // TODO(pdr): Remove this suppression and always check for id collisions. |
548 // This is a temporary suppression for SPV2 which generates unnecessary | 548 // This is a temporary suppression for SPV2 which generates unnecessary |
549 // layers that collide. Remove once crbug.com/693693 is fixed. | 549 // layers that collide. Remove once crbug.com/693693 is fixed. |
550 if (!settings().use_layer_lists) | 550 if (!settings().use_layer_lists) |
551 DCHECK(!element_id_collision_detected); | 551 DCHECK(!element_id_collision_detected); |
552 #endif | 552 #endif |
553 | 553 |
554 element_layers_map_[element_id] = layer->id(); | 554 element_layers_map_[element_id.id] = layer->id(); |
555 | 555 |
556 layer_tree_host_impl_->mutator_host()->RegisterElement( | 556 layer_tree_host_impl_->mutator_host()->RegisterElement( |
557 element_id, | 557 element_id, |
558 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); | 558 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); |
559 } | 559 } |
560 | 560 |
561 void LayerTreeImpl::RemoveFromElementMap(LayerImpl* layer) { | 561 void LayerTreeImpl::RemoveFromElementMap(LayerImpl* layer) { |
562 if (!layer->element_id()) | 562 if (!layer->element_id()) |
563 return; | 563 return; |
564 | 564 |
565 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), | 565 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), |
566 "LayerTreeImpl::RemoveFromElementMap", "element", | 566 "LayerTreeImpl::RemoveFromElementMap", "element", |
567 layer->element_id().AsValue().release(), "layer_id", | 567 layer->element_id().id, "layer_id", layer->id()); |
568 layer->id()); | |
569 | 568 |
570 layer_tree_host_impl_->mutator_host()->UnregisterElement( | 569 layer_tree_host_impl_->mutator_host()->UnregisterElement( |
571 layer->element_id(), | 570 layer->element_id(), |
572 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); | 571 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); |
573 | 572 |
574 element_layers_map_.erase(layer->element_id()); | 573 element_layers_map_.erase(layer->element_id().id); |
575 } | 574 } |
576 | 575 |
577 void LayerTreeImpl::AddToOpacityAnimationsMap(int id, float opacity) { | 576 void LayerTreeImpl::AddToOpacityAnimationsMap(int id, float opacity) { |
578 if (LayerImpl* layer = LayerById(id)) | 577 if (LayerImpl* layer = LayerById(id)) |
579 element_id_to_opacity_animations_[layer->element_id()] = opacity; | 578 element_id_to_opacity_animations_[layer->element_id().id] = opacity; |
580 } | 579 } |
581 | 580 |
582 void LayerTreeImpl::SetTransformMutated(ElementId element_id, | 581 void LayerTreeImpl::SetTransformMutated(ElementId element_id, |
583 const gfx::Transform& transform) { | 582 const gfx::Transform& transform) { |
584 DCHECK_EQ(1u, property_trees()->element_id_to_transform_node_index.count( | 583 DCHECK_EQ(1u, property_trees()->element_id_to_transform_node_index.count( |
585 element_id)); | 584 element_id)); |
586 element_id_to_transform_animations_[element_id] = transform; | 585 element_id_to_transform_animations_[element_id.id] = transform; |
587 if (!property_trees()->transform_tree.OnTransformAnimated(element_id, | 586 if (!property_trees()->transform_tree.OnTransformAnimated(element_id, |
588 transform)) | 587 transform)) |
589 return; | 588 return; |
590 | 589 |
591 if (LayerImpl* layer = LayerByElementId(element_id)) | 590 if (LayerImpl* layer = LayerByElementId(element_id)) |
592 layer->set_was_ever_ready_since_last_transform_animation(false); | 591 layer->set_was_ever_ready_since_last_transform_animation(false); |
593 | 592 |
594 set_needs_update_draw_properties(); | 593 set_needs_update_draw_properties(); |
595 } | 594 } |
596 | 595 |
597 void LayerTreeImpl::SetOpacityMutated(ElementId element_id, float opacity) { | 596 void LayerTreeImpl::SetOpacityMutated(ElementId element_id, float opacity) { |
598 DCHECK_EQ( | 597 DCHECK_EQ( |
599 1u, property_trees()->element_id_to_effect_node_index.count(element_id)); | 598 1u, property_trees()->element_id_to_effect_node_index.count(element_id)); |
600 element_id_to_opacity_animations_[element_id] = opacity; | 599 element_id_to_opacity_animations_[element_id.id] = opacity; |
601 if (property_trees()->effect_tree.OnOpacityAnimated(element_id, opacity)) | 600 if (property_trees()->effect_tree.OnOpacityAnimated(element_id, opacity)) |
602 set_needs_update_draw_properties(); | 601 set_needs_update_draw_properties(); |
603 } | 602 } |
604 | 603 |
605 void LayerTreeImpl::SetFilterMutated(ElementId element_id, | 604 void LayerTreeImpl::SetFilterMutated(ElementId element_id, |
606 const FilterOperations& filters) { | 605 const FilterOperations& filters) { |
607 DCHECK_EQ( | 606 DCHECK_EQ( |
608 1u, property_trees()->element_id_to_effect_node_index.count(element_id)); | 607 1u, property_trees()->element_id_to_effect_node_index.count(element_id)); |
609 element_id_to_filter_animations_[element_id] = filters; | 608 element_id_to_filter_animations_[element_id.id] = filters; |
610 if (property_trees()->effect_tree.OnFilterAnimated(element_id, filters)) | 609 if (property_trees()->effect_tree.OnFilterAnimated(element_id, filters)) |
611 set_needs_update_draw_properties(); | 610 set_needs_update_draw_properties(); |
612 } | 611 } |
613 | 612 |
614 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const { | 613 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const { |
615 return InnerViewportScrollLayer() | 614 return InnerViewportScrollLayer() |
616 ? InnerViewportScrollLayer()->scroll_clip_layer() | 615 ? InnerViewportScrollLayer()->scroll_clip_layer() |
617 : NULL; | 616 : NULL; |
618 } | 617 } |
619 | 618 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
694 // frame to a newly-committed property tree. | 693 // frame to a newly-committed property tree. |
695 if (layer_list_.empty()) | 694 if (layer_list_.empty()) |
696 return; | 695 return; |
697 | 696 |
698 // Entries from |element_id_to_*_animations_| should be deleted only after | 697 // Entries from |element_id_to_*_animations_| should be deleted only after |
699 // they have been synchronized with the main thread, which will not be the | 698 // they have been synchronized with the main thread, which will not be the |
700 // case if this is an impl-side invalidation. | 699 // case if this is an impl-side invalidation. |
701 const bool can_delete_animations = !is_impl_side_update; | 700 const bool can_delete_animations = !is_impl_side_update; |
702 auto element_id_to_opacity = element_id_to_opacity_animations_.begin(); | 701 auto element_id_to_opacity = element_id_to_opacity_animations_.begin(); |
703 while (element_id_to_opacity != element_id_to_opacity_animations_.end()) { | 702 while (element_id_to_opacity != element_id_to_opacity_animations_.end()) { |
704 const ElementId id = element_id_to_opacity->first; | 703 ElementId element_id; |
704 element_id.id = element_id_to_opacity->first; | |
705 if (EffectNode* node = | 705 if (EffectNode* node = |
706 property_trees_.effect_tree.FindNodeFromElementId(id)) { | 706 property_trees_.effect_tree.FindNodeFromElementId(element_id)) { |
707 if ((!node->is_currently_animating_opacity || | 707 if ((!node->is_currently_animating_opacity || |
708 node->opacity == element_id_to_opacity->second) && | 708 node->opacity == element_id_to_opacity->second) && |
709 can_delete_animations) { | 709 can_delete_animations) { |
710 element_id_to_opacity_animations_.erase(element_id_to_opacity++); | 710 element_id_to_opacity_animations_.erase(element_id_to_opacity++); |
711 continue; | 711 continue; |
712 } | 712 } |
713 node->opacity = element_id_to_opacity->second; | 713 node->opacity = element_id_to_opacity->second; |
714 property_trees_.effect_tree.set_needs_update(true); | 714 property_trees_.effect_tree.set_needs_update(true); |
715 } | 715 } |
716 ++element_id_to_opacity; | 716 ++element_id_to_opacity; |
717 } | 717 } |
718 | 718 |
719 auto element_id_to_filter = element_id_to_filter_animations_.begin(); | 719 auto element_id_to_filter = element_id_to_filter_animations_.begin(); |
720 while (element_id_to_filter != element_id_to_filter_animations_.end()) { | 720 while (element_id_to_filter != element_id_to_filter_animations_.end()) { |
721 const ElementId id = element_id_to_filter->first; | 721 ElementId element_id; |
722 element_id.id = element_id_to_filter->first; | |
722 if (EffectNode* node = | 723 if (EffectNode* node = |
723 property_trees_.effect_tree.FindNodeFromElementId(id)) { | 724 property_trees_.effect_tree.FindNodeFromElementId(element_id)) { |
724 if ((!node->is_currently_animating_filter || | 725 if ((!node->is_currently_animating_filter || |
725 node->filters == element_id_to_filter->second) && | 726 node->filters == element_id_to_filter->second) && |
726 can_delete_animations) { | 727 can_delete_animations) { |
727 element_id_to_filter_animations_.erase(element_id_to_filter++); | 728 element_id_to_filter_animations_.erase(element_id_to_filter++); |
728 continue; | 729 continue; |
729 } | 730 } |
730 node->filters = element_id_to_filter->second; | 731 node->filters = element_id_to_filter->second; |
731 property_trees_.effect_tree.set_needs_update(true); | 732 property_trees_.effect_tree.set_needs_update(true); |
732 } | 733 } |
733 ++element_id_to_filter; | 734 ++element_id_to_filter; |
734 } | 735 } |
735 | 736 |
736 auto element_id_to_transform = element_id_to_transform_animations_.begin(); | 737 auto element_id_to_transform = element_id_to_transform_animations_.begin(); |
737 while (element_id_to_transform != element_id_to_transform_animations_.end()) { | 738 while (element_id_to_transform != element_id_to_transform_animations_.end()) { |
738 const ElementId id = element_id_to_transform->first; | 739 ElementId element_id; |
740 element_id.id = element_id_to_transform->first; | |
739 if (TransformNode* node = | 741 if (TransformNode* node = |
740 property_trees_.transform_tree.FindNodeFromElementId(id)) { | 742 property_trees_.transform_tree.FindNodeFromElementId(element_id)) { |
741 if ((!node->is_currently_animating || | 743 if ((!node->is_currently_animating || |
742 node->local == element_id_to_transform->second) && | 744 node->local == element_id_to_transform->second) && |
743 can_delete_animations) { | 745 can_delete_animations) { |
744 element_id_to_transform_animations_.erase(element_id_to_transform++); | 746 element_id_to_transform_animations_.erase(element_id_to_transform++); |
745 continue; | 747 continue; |
746 } | 748 } |
747 node->local = element_id_to_transform->second; | 749 node->local = element_id_to_transform->second; |
748 node->needs_local_transform_update = true; | 750 node->needs_local_transform_update = true; |
749 property_trees_.transform_tree.set_needs_update(true); | 751 property_trees_.transform_tree.set_needs_update(true); |
750 } | 752 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
978 | 980 |
979 void LayerTreeImpl::ClearViewportLayers() { | 981 void LayerTreeImpl::ClearViewportLayers() { |
980 overscroll_elasticity_layer_id_ = Layer::INVALID_ID; | 982 overscroll_elasticity_layer_id_ = Layer::INVALID_ID; |
981 page_scale_layer_id_ = Layer::INVALID_ID; | 983 page_scale_layer_id_ = Layer::INVALID_ID; |
982 inner_viewport_scroll_layer_id_ = Layer::INVALID_ID; | 984 inner_viewport_scroll_layer_id_ = Layer::INVALID_ID; |
983 outer_viewport_scroll_layer_id_ = Layer::INVALID_ID; | 985 outer_viewport_scroll_layer_id_ = Layer::INVALID_ID; |
984 } | 986 } |
985 | 987 |
986 // For unit tests, we use the layer's id as its element id. | 988 // For unit tests, we use the layer's id as its element id. |
987 static void SetElementIdForTesting(LayerImpl* layer) { | 989 static void SetElementIdForTesting(LayerImpl* layer) { |
988 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); | 990 ElementId element_id; |
991 element_id.id = layer->id(); | |
992 layer->SetElementId(element_id); | |
989 } | 993 } |
990 | 994 |
991 void LayerTreeImpl::SetElementIdsForTesting() { | 995 void LayerTreeImpl::SetElementIdsForTesting() { |
992 LayerListIterator<LayerImpl> it(root_layer_for_testing_); | 996 LayerListIterator<LayerImpl> it(root_layer_for_testing_); |
993 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { | 997 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { |
994 if (!it->element_id()) | 998 if (!it->element_id()) |
995 SetElementIdForTesting(*it); | 999 SetElementIdForTesting(*it); |
996 } | 1000 } |
997 } | 1001 } |
998 | 1002 |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1226 } | 1230 } |
1227 | 1231 |
1228 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { | 1232 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { |
1229 DCHECK(!LayerById(layer->id())); | 1233 DCHECK(!LayerById(layer->id())); |
1230 layer_id_map_[layer->id()] = layer; | 1234 layer_id_map_[layer->id()] = layer; |
1231 } | 1235 } |
1232 | 1236 |
1233 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { | 1237 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { |
1234 DCHECK(LayerById(layer->id())); | 1238 DCHECK(LayerById(layer->id())); |
1235 layers_that_should_push_properties_.erase(layer); | 1239 layers_that_should_push_properties_.erase(layer); |
1236 element_id_to_transform_animations_.erase(layer->element_id()); | 1240 element_id_to_transform_animations_.erase(layer->element_id().id); |
1237 element_id_to_opacity_animations_.erase(layer->element_id()); | 1241 element_id_to_opacity_animations_.erase(layer->element_id().id); |
1238 element_id_to_filter_animations_.erase(layer->element_id()); | 1242 element_id_to_filter_animations_.erase(layer->element_id().id); |
1239 layer_id_map_.erase(layer->id()); | 1243 layer_id_map_.erase(layer->id()); |
1240 } | 1244 } |
1241 | 1245 |
1242 // These manage ownership of the LayerImpl. | 1246 // These manage ownership of the LayerImpl. |
1243 void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) { | 1247 void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) { |
1244 DCHECK(std::find(layers_->begin(), layers_->end(), layer) == layers_->end()); | 1248 DCHECK(std::find(layers_->begin(), layers_->end(), layer) == layers_->end()); |
1245 DCHECK(layer); | 1249 DCHECK(layer); |
1246 layers_->push_back(std::move(layer)); | 1250 layers_->push_back(std::move(layer)); |
1247 set_needs_update_draw_properties(); | 1251 set_needs_update_draw_properties(); |
1248 } | 1252 } |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2088 | 2092 |
2089 void LayerTreeImpl::ResetAllChangeTracking() { | 2093 void LayerTreeImpl::ResetAllChangeTracking() { |
2090 layers_that_should_push_properties_.clear(); | 2094 layers_that_should_push_properties_.clear(); |
2091 // Iterate over all layers, including masks. | 2095 // Iterate over all layers, including masks. |
2092 for (auto& layer : *layers_) | 2096 for (auto& layer : *layers_) |
2093 layer->ResetChangeTracking(); | 2097 layer->ResetChangeTracking(); |
2094 property_trees_.ResetAllChangeTracking(); | 2098 property_trees_.ResetAllChangeTracking(); |
2095 } | 2099 } |
2096 | 2100 |
2097 } // namespace cc | 2101 } // namespace cc |
OLD | NEW |