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

Side by Side Diff: cc/trees/layer_tree_impl.cc

Issue 2758343002: cc: Use Element Id to Record Animation Changes (Closed)
Patch Set: fix for test Created 3 years, 9 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 unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 layer->id()); 619 layer->id());
620 620
621 layer_tree_host_impl_->mutator_host()->UnregisterElement( 621 layer_tree_host_impl_->mutator_host()->UnregisterElement(
622 layer->element_id(), 622 layer->element_id(),
623 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); 623 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING);
624 624
625 element_layers_map_.erase(layer->element_id()); 625 element_layers_map_.erase(layer->element_id());
626 } 626 }
627 627
628 void LayerTreeImpl::AddToOpacityAnimationsMap(int id, float opacity) { 628 void LayerTreeImpl::AddToOpacityAnimationsMap(int id, float opacity) {
629 opacity_animations_map_[id] = opacity; 629 if (LayerImpl* layer = LayerById(id))
630 element_id_to_opacity_animations_[layer->element_id()] = opacity;
630 } 631 }
631 632
632 void LayerTreeImpl::AddToTransformAnimationsMap(int id, 633 void LayerTreeImpl::AddToTransformAnimationsMap(int id,
633 gfx::Transform transform) { 634 gfx::Transform transform) {
634 transform_animations_map_[id] = transform; 635 if (LayerImpl* layer = LayerById(id))
636 element_id_to_transform_animations_[layer->element_id()] = transform;
635 } 637 }
636 638
637 void LayerTreeImpl::AddToFilterAnimationsMap(int id, 639 void LayerTreeImpl::AddToFilterAnimationsMap(int id,
638 const FilterOperations& filters) { 640 const FilterOperations& filters) {
639 filter_animations_map_[id] = filters; 641 if (LayerImpl* layer = LayerById(id))
642 element_id_to_filter_animations_[layer->element_id()] = filters;
640 } 643 }
641 644
642 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const { 645 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const {
643 return InnerViewportScrollLayer() 646 return InnerViewportScrollLayer()
644 ? InnerViewportScrollLayer()->scroll_clip_layer() 647 ? InnerViewportScrollLayer()->scroll_clip_layer()
645 : NULL; 648 : NULL;
646 } 649 }
647 650
648 LayerImpl* LayerTreeImpl::OuterViewportContainerLayer() const { 651 LayerImpl* LayerTreeImpl::OuterViewportContainerLayer() const {
649 return OuterViewportScrollLayer() 652 return OuterViewportScrollLayer()
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 719
717 void LayerTreeImpl::UpdatePropertyTreeScrollingAndAnimationFromMainThread() { 720 void LayerTreeImpl::UpdatePropertyTreeScrollingAndAnimationFromMainThread() {
718 // TODO(enne): This should get replaced by pulling out scrolling and 721 // TODO(enne): This should get replaced by pulling out scrolling and
719 // animations into their own trees. Then scrolls and animations would have 722 // animations into their own trees. Then scrolls and animations would have
720 // their own ways of synchronizing across commits. This occurs to push 723 // their own ways of synchronizing across commits. This occurs to push
721 // updates from scrolling deltas on the compositor thread that have occurred 724 // updates from scrolling deltas on the compositor thread that have occurred
722 // after begin frame and updates from animations that have ticked since begin 725 // after begin frame and updates from animations that have ticked since begin
723 // frame to a newly-committed property tree. 726 // frame to a newly-committed property tree.
724 if (layer_list_.empty()) 727 if (layer_list_.empty())
725 return; 728 return;
726 std::vector<int> layer_ids_to_remove; 729 auto element_id_to_opacity = element_id_to_opacity_animations_.begin();
727 for (auto& layer_id_to_opacity : opacity_animations_map_) { 730 while (element_id_to_opacity != element_id_to_opacity_animations_.end()) {
728 const int id = layer_id_to_opacity.first; 731 const ElementId id = element_id_to_opacity->first;
729 if (EffectNode* node = 732 if (EffectNode* node =
730 property_trees_.effect_tree.UpdateNodeFromOwningLayerId(id)) { 733 property_trees_.effect_tree.FindNodeFromElementId(id)) {
731 if (!node->is_currently_animating_opacity || 734 if (!node->is_currently_animating_opacity ||
732 node->opacity == layer_id_to_opacity.second) { 735 node->opacity == element_id_to_opacity->second) {
733 layer_ids_to_remove.push_back(id); 736 element_id_to_opacity_animations_.erase(element_id_to_opacity++);
734 continue; 737 continue;
735 } 738 }
736 node->opacity = layer_id_to_opacity.second; 739 node->opacity = element_id_to_opacity->second;
737 property_trees_.effect_tree.set_needs_update(true); 740 property_trees_.effect_tree.set_needs_update(true);
738 } 741 }
742 ++element_id_to_opacity;
739 } 743 }
740 for (auto id : layer_ids_to_remove)
741 opacity_animations_map_.erase(id);
742 layer_ids_to_remove.clear();
743 744
744 for (auto& layer_id_to_transform : transform_animations_map_) { 745 auto element_id_to_filter = element_id_to_filter_animations_.begin();
745 const int id = layer_id_to_transform.first; 746 while (element_id_to_filter != element_id_to_filter_animations_.end()) {
746 if (TransformNode* node = 747 const ElementId id = element_id_to_filter->first;
747 property_trees_.transform_tree.UpdateNodeFromOwningLayerId(id)) { 748 if (EffectNode* node =
748 if (!node->is_currently_animating || 749 property_trees_.effect_tree.FindNodeFromElementId(id)) {
749 node->local == layer_id_to_transform.second) { 750 if (!node->is_currently_animating_filter ||
750 layer_ids_to_remove.push_back(id); 751 node->filters == element_id_to_filter->second) {
752 element_id_to_filter_animations_.erase(element_id_to_filter++);
751 continue; 753 continue;
752 } 754 }
753 node->local = layer_id_to_transform.second; 755 node->filters = element_id_to_filter->second;
756 property_trees_.effect_tree.set_needs_update(true);
757 }
758 ++element_id_to_filter;
759 }
760
761 auto element_id_to_transform = element_id_to_transform_animations_.begin();
762 while (element_id_to_transform != element_id_to_transform_animations_.end()) {
763 const ElementId id = element_id_to_transform->first;
764 if (TransformNode* node =
765 property_trees_.transform_tree.FindNodeFromElementId(id)) {
766 if (!node->is_currently_animating ||
767 node->local == element_id_to_transform->second) {
768 element_id_to_transform_animations_.erase(element_id_to_transform++);
769 continue;
770 }
771 node->local = element_id_to_transform->second;
754 node->needs_local_transform_update = true; 772 node->needs_local_transform_update = true;
755 property_trees_.transform_tree.set_needs_update(true); 773 property_trees_.transform_tree.set_needs_update(true);
756 } 774 }
775 ++element_id_to_transform;
757 } 776 }
758 for (auto id : layer_ids_to_remove)
759 transform_animations_map_.erase(id);
760 layer_ids_to_remove.clear();
761
762 for (auto& layer_id_to_filters : filter_animations_map_) {
763 const int id = layer_id_to_filters.first;
764 if (EffectNode* node =
765 property_trees_.effect_tree.UpdateNodeFromOwningLayerId(id)) {
766 if (!node->is_currently_animating_filter ||
767 node->filters == layer_id_to_filters.second) {
768 layer_ids_to_remove.push_back(id);
769 continue;
770 }
771 node->filters = layer_id_to_filters.second;
772 property_trees_.effect_tree.set_needs_update(true);
773 }
774 }
775 for (auto id : layer_ids_to_remove)
776 filter_animations_map_.erase(id);
777 777
778 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { 778 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) {
779 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); 779 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded();
780 }); 780 });
781 } 781 }
782 782
783 void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) { 783 void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) {
784 DCHECK(IsActiveTree()); 784 DCHECK(IsActiveTree());
785 if (page_scale_factor()->SetCurrent( 785 if (page_scale_factor()->SetCurrent(
786 ClampPageScaleFactorToLimits(active_page_scale))) { 786 ClampPageScaleFactorToLimits(active_page_scale))) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 } 1001 }
1002 1002
1003 // For unit tests, we use the layer's id as its element id. 1003 // For unit tests, we use the layer's id as its element id.
1004 static void SetElementIdForTesting(LayerImpl* layer) { 1004 static void SetElementIdForTesting(LayerImpl* layer) {
1005 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); 1005 layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
1006 } 1006 }
1007 1007
1008 void LayerTreeImpl::SetElementIdsForTesting() { 1008 void LayerTreeImpl::SetElementIdsForTesting() {
1009 LayerListIterator<LayerImpl> it(root_layer_for_testing_); 1009 LayerListIterator<LayerImpl> it(root_layer_for_testing_);
1010 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { 1010 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) {
1011 SetElementIdForTesting(*it); 1011 if (!it->element_id())
1012 SetElementIdForTesting(*it);
1012 } 1013 }
1013 } 1014 }
1014 1015
1015 bool LayerTreeImpl::UpdateDrawProperties( 1016 bool LayerTreeImpl::UpdateDrawProperties(
1016 bool update_lcd_text, 1017 bool update_lcd_text,
1017 bool force_skip_verify_visible_rect_calculations) { 1018 bool force_skip_verify_visible_rect_calculations) {
1018 if (!needs_update_draw_properties_) 1019 if (!needs_update_draw_properties_)
1019 return true; 1020 return true;
1020 1021
1021 // Calling UpdateDrawProperties must clear this flag, so there can be no 1022 // Calling UpdateDrawProperties must clear this flag, so there can be no
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 << "CalcDrawProperties should not set_needs_update_draw_properties()"; 1181 << "CalcDrawProperties should not set_needs_update_draw_properties()";
1181 return true; 1182 return true;
1182 } 1183 }
1183 1184
1184 void LayerTreeImpl::BuildLayerListAndPropertyTreesForTesting() { 1185 void LayerTreeImpl::BuildLayerListAndPropertyTreesForTesting() {
1185 BuildLayerListForTesting(); 1186 BuildLayerListForTesting();
1186 BuildPropertyTreesForTesting(); 1187 BuildPropertyTreesForTesting();
1187 } 1188 }
1188 1189
1189 void LayerTreeImpl::BuildPropertyTreesForTesting() { 1190 void LayerTreeImpl::BuildPropertyTreesForTesting() {
1191 SetElementIdsForTesting();
1190 PropertyTreeBuilder::PreCalculateMetaInformationForTesting(layer_list_[0]); 1192 PropertyTreeBuilder::PreCalculateMetaInformationForTesting(layer_list_[0]);
1191 property_trees_.needs_rebuild = true; 1193 property_trees_.needs_rebuild = true;
1192 property_trees_.transform_tree.set_source_to_parent_updates_allowed(true); 1194 property_trees_.transform_tree.set_source_to_parent_updates_allowed(true);
1193 PropertyTreeBuilder::BuildPropertyTrees( 1195 PropertyTreeBuilder::BuildPropertyTrees(
1194 layer_list_[0], PageScaleLayer(), InnerViewportScrollLayer(), 1196 layer_list_[0], PageScaleLayer(), InnerViewportScrollLayer(),
1195 OuterViewportScrollLayer(), OverscrollElasticityLayer(), 1197 OuterViewportScrollLayer(), OverscrollElasticityLayer(),
1196 elastic_overscroll()->Current(IsActiveTree()), 1198 elastic_overscroll()->Current(IsActiveTree()),
1197 current_page_scale_factor(), device_scale_factor(), 1199 current_page_scale_factor(), device_scale_factor(),
1198 gfx::Rect(DrawViewportSize()), layer_tree_host_impl_->DrawTransform(), 1200 gfx::Rect(DrawViewportSize()), layer_tree_host_impl_->DrawTransform(),
1199 &property_trees_); 1201 &property_trees_);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 } 1254 }
1253 1255
1254 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 1256 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) {
1255 DCHECK(!LayerById(layer->id())); 1257 DCHECK(!LayerById(layer->id()));
1256 layer_id_map_[layer->id()] = layer; 1258 layer_id_map_[layer->id()] = layer;
1257 } 1259 }
1258 1260
1259 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { 1261 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) {
1260 DCHECK(LayerById(layer->id())); 1262 DCHECK(LayerById(layer->id()));
1261 layers_that_should_push_properties_.erase(layer); 1263 layers_that_should_push_properties_.erase(layer);
1262 transform_animations_map_.erase(layer->id()); 1264 element_id_to_transform_animations_.erase(layer->element_id());
1263 opacity_animations_map_.erase(layer->id()); 1265 element_id_to_opacity_animations_.erase(layer->element_id());
1266 element_id_to_filter_animations_.erase(layer->element_id());
1264 layer_id_map_.erase(layer->id()); 1267 layer_id_map_.erase(layer->id());
1265 } 1268 }
1266 1269
1267 // These manage ownership of the LayerImpl. 1270 // These manage ownership of the LayerImpl.
1268 void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) { 1271 void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) {
1269 DCHECK(std::find(layers_->begin(), layers_->end(), layer) == layers_->end()); 1272 DCHECK(std::find(layers_->begin(), layers_->end(), layer) == layers_->end());
1270 1273
1271 // TODO(ajuma): Change this to a DCHECK once we've figured out what's causing 1274 // TODO(ajuma): Change this to a DCHECK once we've figured out what's causing
1272 // crbug.com/701279. 1275 // crbug.com/701279.
1273 CHECK(layer); 1276 CHECK(layer);
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after
2151 2154
2152 void LayerTreeImpl::ResetAllChangeTracking() { 2155 void LayerTreeImpl::ResetAllChangeTracking() {
2153 layers_that_should_push_properties_.clear(); 2156 layers_that_should_push_properties_.clear();
2154 // Iterate over all layers, including masks. 2157 // Iterate over all layers, including masks.
2155 for (auto& layer : *layers_) 2158 for (auto& layer : *layers_)
2156 layer->ResetChangeTracking(); 2159 layer->ResetChangeTracking();
2157 property_trees_.ResetAllChangeTracking(); 2160 property_trees_.ResetAllChangeTracking();
2158 } 2161 }
2159 2162
2160 } // namespace cc 2163 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698