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

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

Issue 2838033002: cc : Don't draw animating layers with singular screen space transform (Closed)
Patch Set: . Created 3 years, 7 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/draw_property_utils.h ('k') | cc/trees/layer_tree_host_common.cc » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/draw_property_utils.h" 5 #include "cc/trees/draw_property_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 static inline bool LayerShouldBeSkippedInternal( 453 static inline bool LayerShouldBeSkippedInternal(
454 LayerType* layer, 454 LayerType* layer,
455 const TransformTree& transform_tree, 455 const TransformTree& transform_tree,
456 const EffectTree& effect_tree) { 456 const EffectTree& effect_tree) {
457 const TransformNode* transform_node = 457 const TransformNode* transform_node =
458 transform_tree.Node(layer->transform_tree_index()); 458 transform_tree.Node(layer->transform_tree_index());
459 const EffectNode* effect_node = effect_tree.Node(layer->effect_tree_index()); 459 const EffectNode* effect_node = effect_tree.Node(layer->effect_tree_index());
460 460
461 if (effect_node->has_render_surface && effect_node->subtree_has_copy_request) 461 if (effect_node->has_render_surface && effect_node->subtree_has_copy_request)
462 return false; 462 return false;
463 // If the layer transform is not invertible, it should be skipped. 463
464 // TODO(ajuma): Correctly process subtrees with singular transform for the 464 // If the layer transform is not invertible, it should be skipped. In case the
465 // case where we may animate to a non-singular transform and wish to 465 // transform is animating and singular, we should not skip it.
466 // pre-raster.
467 return !transform_node->node_and_ancestors_are_animated_or_invertible || 466 return !transform_node->node_and_ancestors_are_animated_or_invertible ||
468 effect_node->hidden_by_backface_visibility || !effect_node->is_drawn; 467 effect_node->hidden_by_backface_visibility || !effect_node->is_drawn;
469 } 468 }
470 469
471 template <typename LayerType> 470 template <typename LayerType>
472 static void UpdateElasticOverscrollInternal( 471 static void UpdateElasticOverscrollInternal(
473 PropertyTrees* property_trees, 472 PropertyTrees* property_trees,
474 const LayerType* overscroll_elasticity_layer, 473 const LayerType* overscroll_elasticity_layer,
475 const gfx::Vector2dF& elastic_overscroll) { 474 const gfx::Vector2dF& elastic_overscroll) {
476 if (!overscroll_elasticity_layer) { 475 if (!overscroll_elasticity_layer) {
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 792
794 void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node, 793 void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
795 gfx::Transform* transform) { 794 gfx::Transform* transform) {
796 DCHECK(effect_node->has_render_surface); 795 DCHECK(effect_node->has_render_surface);
797 if (effect_node->surface_contents_scale.x() != 0.0 && 796 if (effect_node->surface_contents_scale.x() != 0.0 &&
798 effect_node->surface_contents_scale.y() != 0.0) 797 effect_node->surface_contents_scale.y() != 0.0)
799 transform->Scale(1.0 / effect_node->surface_contents_scale.x(), 798 transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
800 1.0 / effect_node->surface_contents_scale.y()); 799 1.0 / effect_node->surface_contents_scale.y());
801 } 800 }
802 801
803 bool LayerShouldBeSkipped(LayerImpl* layer, 802 bool LayerShouldBeSkippedForDrawPropertiesComputation(
804 const TransformTree& transform_tree, 803 LayerImpl* layer,
805 const EffectTree& effect_tree) { 804 const TransformTree& transform_tree,
805 const EffectTree& effect_tree) {
806 return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree); 806 return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
807 } 807 }
808 808
809 bool LayerShouldBeSkipped(Layer* layer, 809 bool LayerShouldBeSkippedForDrawPropertiesComputation(
810 const TransformTree& transform_tree, 810 Layer* layer,
811 const EffectTree& effect_tree) { 811 const TransformTree& transform_tree,
812 const EffectTree& effect_tree) {
812 return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree); 813 return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
813 } 814 }
814 815
815 void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host, 816 void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host,
816 const PropertyTrees* property_trees, 817 const PropertyTrees* property_trees,
817 LayerList* update_layer_list) { 818 LayerList* update_layer_list) {
818 const TransformTree& transform_tree = property_trees->transform_tree; 819 const TransformTree& transform_tree = property_trees->transform_tree;
819 const EffectTree& effect_tree = property_trees->effect_tree; 820 const EffectTree& effect_tree = property_trees->effect_tree;
820 for (auto* layer : *layer_tree_host) { 821 for (auto* layer : *layer_tree_host) {
821 if (!IsRootLayer(layer) && 822 if (!IsRootLayer(layer) && LayerShouldBeSkippedForDrawPropertiesComputation(
822 LayerShouldBeSkipped(layer, transform_tree, effect_tree)) 823 layer, transform_tree, effect_tree))
823 continue; 824 continue;
824 825
825 bool layer_is_drawn = 826 bool layer_is_drawn =
826 effect_tree.Node(layer->effect_tree_index())->is_drawn; 827 effect_tree.Node(layer->effect_tree_index())->is_drawn;
827 828
828 if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) { 829 if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) {
829 update_layer_list->push_back(layer); 830 update_layer_list->push_back(layer);
830 } 831 }
831 832
832 // Append mask layers to the update layer list. They don't have valid 833 // Append mask layers to the update layer list. They don't have valid
833 // visible rects, so need to get added after the above calculation. 834 // visible rects, so need to get added after the above calculation.
834 if (Layer* mask_layer = layer->mask_layer()) 835 if (Layer* mask_layer = layer->mask_layer())
835 update_layer_list->push_back(mask_layer); 836 update_layer_list->push_back(mask_layer);
836 } 837 }
837 } 838 }
838 839
839 void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl, 840 void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
840 const PropertyTrees* property_trees, 841 const PropertyTrees* property_trees,
841 std::vector<LayerImpl*>* visible_layer_list) { 842 std::vector<LayerImpl*>* visible_layer_list) {
842 const TransformTree& transform_tree = property_trees->transform_tree; 843 const TransformTree& transform_tree = property_trees->transform_tree;
843 const EffectTree& effect_tree = property_trees->effect_tree; 844 const EffectTree& effect_tree = property_trees->effect_tree;
844 845
845 for (auto* layer_impl : *layer_tree_impl) { 846 for (auto* layer_impl : *layer_tree_impl) {
846 if (!IsRootLayer(layer_impl) && 847 if (!IsRootLayer(layer_impl) &&
847 LayerShouldBeSkipped(layer_impl, transform_tree, effect_tree)) 848 LayerShouldBeSkippedForDrawPropertiesComputation(
849 layer_impl, transform_tree, effect_tree))
848 continue; 850 continue;
849 851
850 bool layer_is_drawn = 852 bool layer_is_drawn =
851 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn; 853 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
852 854
853 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees)) 855 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees))
854 visible_layer_list->push_back(layer_impl); 856 visible_layer_list->push_back(layer_impl);
855 } 857 }
856 } 858 }
857 859
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1089 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1088 const Layer* overscroll_elasticity_layer, 1090 const Layer* overscroll_elasticity_layer,
1089 const gfx::Vector2dF& elastic_overscroll) { 1091 const gfx::Vector2dF& elastic_overscroll) {
1090 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1092 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1091 elastic_overscroll); 1093 elastic_overscroll);
1092 } 1094 }
1093 1095
1094 } // namespace draw_property_utils 1096 } // namespace draw_property_utils
1095 1097
1096 } // namespace cc 1098 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/layer_tree_host_common.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698