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

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

Issue 1855013002: cc : Stop calculating visible rects on main thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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.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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 } 66 }
67 67
68 static void ValidateRenderSurfacesRecursive(Layer* layer) { 68 static void ValidateRenderSurfacesRecursive(Layer* layer) {
69 ValidateRenderSurfaceForLayer(layer); 69 ValidateRenderSurfaceForLayer(layer);
70 for (size_t i = 0; i < layer->children().size(); ++i) 70 for (size_t i = 0; i < layer->children().size(); ++i)
71 ValidateRenderSurfacesRecursive(layer->child_at(i)); 71 ValidateRenderSurfacesRecursive(layer->child_at(i));
72 } 72 }
73 #endif 73 #endif
74 74
75 template <typename LayerType> 75 template <typename LayerType>
76 void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, 76 void CalculateVisibleRects(
77 const ClipTree& clip_tree, 77 const typename LayerType::LayerListType& visible_layer_list,
78 const TransformTree& transform_tree, 78 const ClipTree& clip_tree,
79 bool non_root_surfaces_enabled) { 79 const TransformTree& transform_tree,
80 bool non_root_surfaces_enabled) {
80 for (auto& layer : visible_layer_list) { 81 for (auto& layer : visible_layer_list) {
81 gfx::Size layer_bounds = layer->bounds(); 82 gfx::Size layer_bounds = layer->bounds();
82 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 83 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
83 const bool is_unclipped = clip_node->data.resets_clip && 84 const bool is_unclipped = clip_node->data.resets_clip &&
84 !clip_node->data.applies_local_clip && 85 !clip_node->data.applies_local_clip &&
85 non_root_surfaces_enabled; 86 non_root_surfaces_enabled;
86 // When both the layer and the target are unclipped, the entire layer 87 // When both the layer and the target are unclipped, the entire layer
87 // content rect is visible. 88 // content rect is visible.
88 const bool fully_visible = !clip_node->data.layers_are_clipped && 89 const bool fully_visible = !clip_node->data.layers_are_clipped &&
89 !clip_node->data.target_is_clipped && 90 !clip_node->data.target_is_clipped &&
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 // backface is not visible. 435 // backface is not visible.
435 if (TransformToScreenIsKnown(layer, backface_transform_id, tree) && 436 if (TransformToScreenIsKnown(layer, backface_transform_id, tree) &&
436 !HasSingularTransform(backface_transform_id, tree) && 437 !HasSingularTransform(backface_transform_id, tree) &&
437 IsLayerBackFaceVisible(layer, backface_transform_id, tree)) 438 IsLayerBackFaceVisible(layer, backface_transform_id, tree))
438 return false; 439 return false;
439 } 440 }
440 441
441 return true; 442 return true;
442 } 443 }
443 444
444 void FindLayersThatNeedUpdates(Layer* layer,
445 const TransformTree& transform_tree,
446 const EffectTree& effect_tree,
447 LayerList* update_layer_list,
448 std::vector<Layer*>* visible_layer_list) {
449 DCHECK_GE(layer->effect_tree_index(), 0);
450 bool layer_is_drawn =
451 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
452
453 if (!IsRootLayer(layer) &&
454 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
455 return;
456
457 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) {
458 visible_layer_list->push_back(layer);
459 update_layer_list->push_back(layer);
460 }
461
462 // Append mask layers to the update layer list. They don't have valid visible
463 // rects, so need to get added after the above calculation. Replica layers
464 // don't need to be updated.
465 if (Layer* mask_layer = layer->mask_layer())
466 update_layer_list->push_back(mask_layer);
467 if (Layer* replica_layer = layer->replica_layer()) {
468 if (Layer* mask_layer = replica_layer->mask_layer())
469 update_layer_list->push_back(mask_layer);
470 }
471
472 for (size_t i = 0; i < layer->children().size(); ++i) {
473 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
474 update_layer_list, visible_layer_list);
475 }
476 }
477
478 void FindLayersThatNeedUpdates(LayerImpl* layer, 445 void FindLayersThatNeedUpdates(LayerImpl* layer,
479 const TransformTree& transform_tree, 446 const TransformTree& transform_tree,
480 const EffectTree& effect_tree, 447 const EffectTree& effect_tree,
481 LayerImplList* update_layer_list, 448 LayerImplList* update_layer_list,
482 std::vector<LayerImpl*>* visible_layer_list) { 449 std::vector<LayerImpl*>* visible_layer_list) {
483 DCHECK_GE(layer->effect_tree_index(), 0); 450 DCHECK_GE(layer->effect_tree_index(), 0);
484 for (auto* layer_impl : *layer->layer_tree_impl()) { 451 for (auto* layer_impl : *layer->layer_tree_impl()) {
485 bool layer_is_drawn = 452 bool layer_is_drawn =
486 effect_tree.Node(layer->effect_tree_index())->data.is_drawn; 453 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
487 454
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 } 650 }
684 651
685 void ComputeEffects(EffectTree* effect_tree) { 652 void ComputeEffects(EffectTree* effect_tree) {
686 if (!effect_tree->needs_update()) 653 if (!effect_tree->needs_update())
687 return; 654 return;
688 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) 655 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i)
689 effect_tree->UpdateEffects(i); 656 effect_tree->UpdateEffects(i);
690 effect_tree->set_needs_update(false); 657 effect_tree->set_needs_update(false);
691 } 658 }
692 659
693 template <typename LayerType>
694 static void ComputeVisibleRectsInternal( 660 static void ComputeVisibleRectsInternal(
695 LayerType* root_layer, 661 LayerImpl* root_layer,
696 PropertyTrees* property_trees, 662 PropertyTrees* property_trees,
697 bool can_render_to_separate_surface, 663 bool can_render_to_separate_surface,
698 typename LayerType::LayerListType* update_layer_list, 664 LayerImplList* update_layer_list,
699 std::vector<LayerType*>* visible_layer_list) { 665 std::vector<LayerImpl*>* visible_layer_list) {
700 if (property_trees->non_root_surfaces_enabled != 666 if (property_trees->non_root_surfaces_enabled !=
701 can_render_to_separate_surface) { 667 can_render_to_separate_surface) {
702 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; 668 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
703 property_trees->transform_tree.set_needs_update(true); 669 property_trees->transform_tree.set_needs_update(true);
704 } 670 }
705 if (property_trees->transform_tree.needs_update()) 671 if (property_trees->transform_tree.needs_update())
706 property_trees->clip_tree.set_needs_update(true); 672 property_trees->clip_tree.set_needs_update(true);
707 ComputeTransforms(&property_trees->transform_tree); 673 ComputeTransforms(&property_trees->transform_tree);
708 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, 674 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
709 can_render_to_separate_surface); 675 can_render_to_separate_surface);
710 ComputeEffects(&property_trees->effect_tree); 676 ComputeEffects(&property_trees->effect_tree);
711 677
712 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree, 678 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree,
713 property_trees->effect_tree, update_layer_list, 679 property_trees->effect_tree, update_layer_list,
714 visible_layer_list); 680 visible_layer_list);
715 CalculateVisibleRects<LayerType>( 681 CalculateVisibleRects<LayerImpl>(
716 *visible_layer_list, property_trees->clip_tree, 682 *visible_layer_list, property_trees->clip_tree,
717 property_trees->transform_tree, can_render_to_separate_surface); 683 property_trees->transform_tree, can_render_to_separate_surface);
718 } 684 }
719 685
720 void BuildPropertyTreesAndComputeVisibleRects( 686 void UpdateRenderSurfaces(Layer* root_layer, PropertyTrees* property_trees) {
721 Layer* root_layer,
722 const Layer* page_scale_layer,
723 const Layer* inner_viewport_scroll_layer,
724 const Layer* outer_viewport_scroll_layer,
725 const Layer* overscroll_elasticity_layer,
726 const gfx::Vector2dF& elastic_overscroll,
727 float page_scale_factor,
728 float device_scale_factor,
729 const gfx::Rect& viewport,
730 const gfx::Transform& device_transform,
731 bool can_render_to_separate_surface,
732 PropertyTrees* property_trees,
733 LayerList* update_layer_list) {
734 PropertyTreeBuilder::BuildPropertyTrees(
735 root_layer, page_scale_layer, inner_viewport_scroll_layer,
736 outer_viewport_scroll_layer, overscroll_elasticity_layer,
737 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
738 device_transform, property_trees);
739 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree, 687 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree,
740 root_layer); 688 root_layer);
741 #if DCHECK_IS_ON() 689 #if DCHECK_IS_ON()
742 ValidateRenderSurfacesRecursive(root_layer); 690 ValidateRenderSurfacesRecursive(root_layer);
743 #endif 691 #endif
744 ComputeVisibleRects(root_layer, property_trees, 692 }
745 can_render_to_separate_surface, update_layer_list); 693
694 void UpdatePropertyTrees(PropertyTrees* property_trees,
695 bool can_render_to_separate_surface) {
696 if (property_trees->non_root_surfaces_enabled !=
697 can_render_to_separate_surface) {
698 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
699 property_trees->transform_tree.set_needs_update(true);
700 }
701 if (property_trees->transform_tree.needs_update())
702 property_trees->clip_tree.set_needs_update(true);
703 ComputeTransforms(&property_trees->transform_tree);
704 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
705 can_render_to_separate_surface);
706 ComputeEffects(&property_trees->effect_tree);
707 }
708
709 void FindLayersThatNeedUpdates(Layer* layer,
710 const TransformTree& transform_tree,
711 const EffectTree& effect_tree,
712 LayerList* update_layer_list) {
713 DCHECK_GE(layer->effect_tree_index(), 0);
714 bool layer_is_drawn =
715 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
716
717 if (!IsRootLayer(layer) &&
718 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
719 return;
720
721 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree))
722 update_layer_list->push_back(layer);
723 if (Layer* mask_layer = layer->mask_layer())
724 update_layer_list->push_back(mask_layer);
725 if (Layer* replica_layer = layer->replica_layer()) {
726 if (Layer* mask_layer = replica_layer->mask_layer())
727 update_layer_list->push_back(mask_layer);
728 }
729
730 for (size_t i = 0; i < layer->children().size(); ++i) {
731 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
732 update_layer_list);
733 }
734 }
735
736 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees,
737 bool can_render_to_separate_surface,
738 LayerList* update_layer_list) {
739 CalculateVisibleRects<Layer>(*update_layer_list, property_trees->clip_tree,
740 property_trees->transform_tree,
741 can_render_to_separate_surface);
746 } 742 }
747 743
748 void BuildPropertyTreesAndComputeVisibleRects( 744 void BuildPropertyTreesAndComputeVisibleRects(
749 LayerImpl* root_layer, 745 LayerImpl* root_layer,
750 const LayerImpl* page_scale_layer, 746 const LayerImpl* page_scale_layer,
751 const LayerImpl* inner_viewport_scroll_layer, 747 const LayerImpl* inner_viewport_scroll_layer,
752 const LayerImpl* outer_viewport_scroll_layer, 748 const LayerImpl* outer_viewport_scroll_layer,
753 const LayerImpl* overscroll_elasticity_layer, 749 const LayerImpl* overscroll_elasticity_layer,
754 const gfx::Vector2dF& elastic_overscroll, 750 const gfx::Vector2dF& elastic_overscroll,
755 float page_scale_factor, 751 float page_scale_factor,
756 float device_scale_factor, 752 float device_scale_factor,
757 const gfx::Rect& viewport, 753 const gfx::Rect& viewport,
758 const gfx::Transform& device_transform, 754 const gfx::Transform& device_transform,
759 bool can_render_to_separate_surface, 755 bool can_render_to_separate_surface,
760 PropertyTrees* property_trees, 756 PropertyTrees* property_trees,
761 LayerImplList* visible_layer_list) { 757 LayerImplList* visible_layer_list) {
762 PropertyTreeBuilder::BuildPropertyTrees( 758 PropertyTreeBuilder::BuildPropertyTrees(
763 root_layer, page_scale_layer, inner_viewport_scroll_layer, 759 root_layer, page_scale_layer, inner_viewport_scroll_layer,
764 outer_viewport_scroll_layer, overscroll_elasticity_layer, 760 outer_viewport_scroll_layer, overscroll_elasticity_layer,
765 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 761 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
766 device_transform, property_trees); 762 device_transform, property_trees);
767 ComputeVisibleRects(root_layer, property_trees, 763 ComputeVisibleRects(root_layer, property_trees,
768 can_render_to_separate_surface, visible_layer_list); 764 can_render_to_separate_surface, visible_layer_list);
769 } 765 }
770 766
771 void ComputeVisibleRects(Layer* root_layer,
772 PropertyTrees* property_trees,
773 bool can_render_to_separate_surface,
774 LayerList* update_layer_list) {
775 std::vector<Layer*> visible_layer_list;
776 ComputeVisibleRectsInternal(root_layer, property_trees,
777 can_render_to_separate_surface, update_layer_list,
778 &visible_layer_list);
779 }
780
781 void ComputeVisibleRects(LayerImpl* root_layer, 767 void ComputeVisibleRects(LayerImpl* root_layer,
782 PropertyTrees* property_trees, 768 PropertyTrees* property_trees,
783 bool can_render_to_separate_surface, 769 bool can_render_to_separate_surface,
784 LayerImplList* visible_layer_list) { 770 LayerImplList* visible_layer_list) {
785 for (auto* layer : *root_layer->layer_tree_impl()) { 771 for (auto* layer : *root_layer->layer_tree_impl()) {
786 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, 772 UpdateRenderSurfaceForLayer(&property_trees->effect_tree,
787 can_render_to_separate_surface, layer); 773 can_render_to_separate_surface, layer);
788 #if DCHECK_IS_ON() 774 #if DCHECK_IS_ON()
789 if (can_render_to_separate_surface) 775 if (can_render_to_separate_surface)
790 ValidateRenderSurfaceForLayer(layer); 776 ValidateRenderSurfaceForLayer(layer);
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1162 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1177 const Layer* overscroll_elasticity_layer, 1163 const Layer* overscroll_elasticity_layer,
1178 const gfx::Vector2dF& elastic_overscroll) { 1164 const gfx::Vector2dF& elastic_overscroll) {
1179 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1165 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1180 elastic_overscroll); 1166 elastic_overscroll);
1181 } 1167 }
1182 1168
1183 } // namespace draw_property_utils 1169 } // namespace draw_property_utils
1184 1170
1185 } // namespace cc 1171 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/layer_tree_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698