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_host_common.h" | 5 #include "cc/trees/layer_tree_host_common.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
612 pending_tree_layer->draw_properties() | 612 pending_tree_layer->draw_properties() |
613 .screen_space_transform.To2dTranslation()) | 613 .screen_space_transform.To2dTranslation()) |
614 .Length(); | 614 .Length(); |
615 } | 615 } |
616 } | 616 } |
617 return 0.f; | 617 return 0.f; |
618 } | 618 } |
619 | 619 |
620 // A layer jitters if its screen space transform is same on two successive | 620 // A layer jitters if its screen space transform is same on two successive |
621 // commits, but has changed in between the commits. CalculateFrameJitter | 621 // commits, but has changed in between the commits. CalculateFrameJitter |
622 // computes the jitter in the entire frame. | 622 // computes the jitter for the layer. |
623 int LayerTreeHostCommon::CalculateFrameJitter(LayerImpl* layer) { | 623 int LayerTreeHostCommon::CalculateFrameJitter(LayerImpl* layer) { |
ajuma
2016/03/29 14:24:02
"CalculateLayerJitter" or "CalculateJitter"?
jaydasika
2016/03/29 15:57:24
Done.
| |
624 if (!layer) | |
625 return 0.f; | |
626 float jitter = 0.f; | 624 float jitter = 0.f; |
627 layer->performance_properties().translation_from_last_frame = 0.f; | 625 layer->performance_properties().translation_from_last_frame = 0.f; |
628 layer->performance_properties().last_commit_screen_space_transform = | 626 layer->performance_properties().last_commit_screen_space_transform = |
629 layer->draw_properties().screen_space_transform; | 627 layer->draw_properties().screen_space_transform; |
630 | 628 |
631 if (!layer->visible_layer_rect().IsEmpty()) { | 629 if (!layer->visible_layer_rect().IsEmpty()) { |
632 if (layer->draw_properties().screen_space_transform.ApproximatelyEqual( | 630 if (layer->draw_properties().screen_space_transform.ApproximatelyEqual( |
633 layer->performance_properties() | 631 layer->performance_properties() |
634 .last_commit_screen_space_transform)) { | 632 .last_commit_screen_space_transform)) { |
635 float translation_from_last_commit = | 633 float translation_from_last_commit = |
636 TranslationFromActiveTreeLayerScreenSpaceTransform(layer); | 634 TranslationFromActiveTreeLayerScreenSpaceTransform(layer); |
637 if (translation_from_last_commit > 0.f) { | 635 if (translation_from_last_commit > 0.f) { |
638 layer->performance_properties().num_fixed_point_hits++; | 636 layer->performance_properties().num_fixed_point_hits++; |
639 layer->performance_properties().translation_from_last_frame = | 637 layer->performance_properties().translation_from_last_frame = |
640 translation_from_last_commit; | 638 translation_from_last_commit; |
641 if (layer->performance_properties().num_fixed_point_hits > | 639 if (layer->performance_properties().num_fixed_point_hits > |
642 layer->layer_tree_impl()->kFixedPointHitsThreshold) { | 640 layer->layer_tree_impl()->kFixedPointHitsThreshold) { |
643 // Jitter = Translation from fixed point * sqrt(Area of the layer). | 641 // Jitter = Translation from fixed point * sqrt(Area of the layer). |
644 // The square root of the area is used instead of the area to match | 642 // The square root of the area is used instead of the area to match |
645 // the dimensions of both terms on the rhs. | 643 // the dimensions of both terms on the rhs. |
646 jitter += translation_from_last_commit * | 644 jitter += translation_from_last_commit * |
647 sqrt(layer->visible_layer_rect().size().GetArea()); | 645 sqrt(layer->visible_layer_rect().size().GetArea()); |
648 } | 646 } |
649 } else { | 647 } else { |
650 layer->performance_properties().num_fixed_point_hits = 0; | 648 layer->performance_properties().num_fixed_point_hits = 0; |
651 } | 649 } |
652 } | 650 } |
653 } | 651 } |
654 // Descendants of jittering layer will not contribute to unique jitter. | |
655 if (jitter > 0.f) | |
656 return jitter; | |
657 | |
658 for (size_t i = 0; i < layer->children().size(); ++i) { | |
659 LayerImpl* child_layer = | |
660 LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i); | |
661 jitter += CalculateFrameJitter(child_layer); | |
662 } | |
663 return jitter; | 652 return jitter; |
664 } | 653 } |
665 | 654 |
666 enum PropertyTreeOption { | 655 enum PropertyTreeOption { |
667 BUILD_PROPERTY_TREES_IF_NEEDED, | 656 BUILD_PROPERTY_TREES_IF_NEEDED, |
668 DONT_BUILD_PROPERTY_TREES | 657 DONT_BUILD_PROPERTY_TREES |
669 }; | 658 }; |
670 | 659 |
671 void CalculateRenderTarget(LayerImpl* layer, | 660 void CalculateRenderTarget(LayerImpl* layer, |
672 PropertyTrees* property_trees, | 661 PropertyTrees* property_trees, |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1077 CalculateDrawPropertiesInternal(inputs, DONT_BUILD_PROPERTY_TREES); | 1066 CalculateDrawPropertiesInternal(inputs, DONT_BUILD_PROPERTY_TREES); |
1078 | 1067 |
1079 if (CdpPerfTracingEnabled()) { | 1068 if (CdpPerfTracingEnabled()) { |
1080 LayerTreeImpl* layer_tree_impl = inputs->root_layer->layer_tree_impl(); | 1069 LayerTreeImpl* layer_tree_impl = inputs->root_layer->layer_tree_impl(); |
1081 if (layer_tree_impl->IsPendingTree() && | 1070 if (layer_tree_impl->IsPendingTree() && |
1082 layer_tree_impl->is_first_frame_after_commit()) { | 1071 layer_tree_impl->is_first_frame_after_commit()) { |
1083 LayerImpl* active_tree_root = | 1072 LayerImpl* active_tree_root = |
1084 layer_tree_impl->FindActiveTreeLayerById(inputs->root_layer->id()); | 1073 layer_tree_impl->FindActiveTreeLayerById(inputs->root_layer->id()); |
1085 float jitter = 0.f; | 1074 float jitter = 0.f; |
1086 if (active_tree_root) { | 1075 if (active_tree_root) { |
1087 LayerImpl* last_scrolled_layer = layer_tree_impl->LayerById( | 1076 std::unordered_set<int> jitter_nodes; |
1088 active_tree_root->layer_tree_impl()->LastScrolledLayerId()); | 1077 const int last_scrolled_scroll_node_id = |
1089 jitter = CalculateFrameJitter(last_scrolled_layer); | 1078 layer_tree_impl->LastScrolledScrollNodeId(); |
1079 for (auto* layer : *layer_tree_impl) { | |
1080 // Layers that have the same scroll tree index jitter together. So, it | |
1081 // is enough to calculate jitter on one of these layers. | |
ajuma
2016/03/29 14:24:02
Please clarify this comment to say that once we've
jaydasika
2016/03/29 15:57:24
Done.
| |
1082 int scroll_tree_index = layer->scroll_tree_index(); | |
1083 if (last_scrolled_scroll_node_id <= scroll_tree_index && | |
1084 jitter_nodes.find(scroll_tree_index) == jitter_nodes.end()) { | |
1085 float layer_jitter = CalculateFrameJitter(layer); | |
1086 if (layer_jitter > 0.f) { | |
1087 jitter_nodes.insert(layer->scroll_tree_index()); | |
1088 jitter += layer_jitter; | |
1089 } | |
1090 } | |
1091 } | |
1090 } | 1092 } |
1091 TRACE_EVENT_ASYNC_BEGIN1( | 1093 TRACE_EVENT_ASYNC_BEGIN1( |
1092 "cdp.perf", "jitter", | 1094 "cdp.perf", "jitter", |
1093 inputs->root_layer->layer_tree_impl()->source_frame_number(), "value", | 1095 inputs->root_layer->layer_tree_impl()->source_frame_number(), "value", |
1094 jitter); | 1096 jitter); |
1095 inputs->root_layer->layer_tree_impl()->set_is_first_frame_after_commit( | 1097 inputs->root_layer->layer_tree_impl()->set_is_first_frame_after_commit( |
1096 false); | 1098 false); |
1097 TRACE_EVENT_ASYNC_END1( | 1099 TRACE_EVENT_ASYNC_END1( |
1098 "cdp.perf", "jitter", | 1100 "cdp.perf", "jitter", |
1099 inputs->root_layer->layer_tree_impl()->source_frame_number(), "value", | 1101 inputs->root_layer->layer_tree_impl()->source_frame_number(), "value", |
1100 jitter); | 1102 jitter); |
1101 } | 1103 } |
1102 } | 1104 } |
1103 } | 1105 } |
1104 | 1106 |
1105 void LayerTreeHostCommon::CalculateDrawProperties( | 1107 void LayerTreeHostCommon::CalculateDrawProperties( |
1106 CalcDrawPropsImplInputsForTesting* inputs) { | 1108 CalcDrawPropsImplInputsForTesting* inputs) { |
1107 CalculateDrawPropertiesInternal(inputs, BUILD_PROPERTY_TREES_IF_NEEDED); | 1109 CalculateDrawPropertiesInternal(inputs, BUILD_PROPERTY_TREES_IF_NEEDED); |
1108 } | 1110 } |
1109 | 1111 |
1110 PropertyTrees* GetPropertyTrees(Layer* layer) { | 1112 PropertyTrees* GetPropertyTrees(Layer* layer) { |
1111 return layer->layer_tree_host()->property_trees(); | 1113 return layer->layer_tree_host()->property_trees(); |
1112 } | 1114 } |
1113 | 1115 |
1114 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { | 1116 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { |
1115 return layer->layer_tree_impl()->property_trees(); | 1117 return layer->layer_tree_impl()->property_trees(); |
1116 } | 1118 } |
1117 | 1119 |
1118 } // namespace cc | 1120 } // namespace cc |
OLD | NEW |