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

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
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 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 // backface is not visible. 434 // backface is not visible.
435 if (TransformToScreenIsKnown(layer, backface_transform_id, tree) && 435 if (TransformToScreenIsKnown(layer, backface_transform_id, tree) &&
436 !HasSingularTransform(backface_transform_id, tree) && 436 !HasSingularTransform(backface_transform_id, tree) &&
437 IsLayerBackFaceVisible(layer, backface_transform_id, tree)) 437 IsLayerBackFaceVisible(layer, backface_transform_id, tree))
438 return false; 438 return false;
439 } 439 }
440 440
441 return true; 441 return true;
442 } 442 }
443 443
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, 444 void FindLayersThatNeedUpdates(LayerImpl* layer,
479 const TransformTree& transform_tree, 445 const TransformTree& transform_tree,
480 const EffectTree& effect_tree, 446 const EffectTree& effect_tree,
481 LayerImplList* update_layer_list, 447 LayerImplList* update_layer_list,
482 std::vector<LayerImpl*>* visible_layer_list) { 448 std::vector<LayerImpl*>* visible_layer_list) {
483 DCHECK_GE(layer->effect_tree_index(), 0); 449 DCHECK_GE(layer->effect_tree_index(), 0);
484 for (auto* layer_impl : *layer->layer_tree_impl()) { 450 for (auto* layer_impl : *layer->layer_tree_impl()) {
485 bool layer_is_drawn = 451 bool layer_is_drawn =
486 effect_tree.Node(layer->effect_tree_index())->data.is_drawn; 452 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
487 453
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 } 649 }
684 650
685 void ComputeEffects(EffectTree* effect_tree) { 651 void ComputeEffects(EffectTree* effect_tree) {
686 if (!effect_tree->needs_update()) 652 if (!effect_tree->needs_update())
687 return; 653 return;
688 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) 654 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i)
689 effect_tree->UpdateEffects(i); 655 effect_tree->UpdateEffects(i);
690 effect_tree->set_needs_update(false); 656 effect_tree->set_needs_update(false);
691 } 657 }
692 658
693 template <typename LayerType>
694 static void ComputeVisibleRectsInternal( 659 static void ComputeVisibleRectsInternal(
695 LayerType* root_layer, 660 LayerImpl* root_layer,
696 PropertyTrees* property_trees, 661 PropertyTrees* property_trees,
697 bool can_render_to_separate_surface, 662 bool can_render_to_separate_surface,
698 typename LayerType::LayerListType* update_layer_list, 663 LayerImplList* update_layer_list,
699 std::vector<LayerType*>* visible_layer_list) { 664 std::vector<LayerImpl*>* visible_layer_list) {
700 if (property_trees->non_root_surfaces_enabled != 665 if (property_trees->non_root_surfaces_enabled !=
701 can_render_to_separate_surface) { 666 can_render_to_separate_surface) {
702 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; 667 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
703 property_trees->transform_tree.set_needs_update(true); 668 property_trees->transform_tree.set_needs_update(true);
704 } 669 }
705 if (property_trees->transform_tree.needs_update()) 670 if (property_trees->transform_tree.needs_update())
706 property_trees->clip_tree.set_needs_update(true); 671 property_trees->clip_tree.set_needs_update(true);
707 ComputeTransforms(&property_trees->transform_tree); 672 ComputeTransforms(&property_trees->transform_tree);
708 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, 673 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
709 can_render_to_separate_surface); 674 can_render_to_separate_surface);
710 ComputeEffects(&property_trees->effect_tree); 675 ComputeEffects(&property_trees->effect_tree);
711 676
712 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree, 677 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree,
713 property_trees->effect_tree, update_layer_list, 678 property_trees->effect_tree, update_layer_list,
714 visible_layer_list); 679 visible_layer_list);
715 CalculateVisibleRects<LayerType>( 680 CalculateVisibleRects(*visible_layer_list, property_trees->clip_tree,
716 *visible_layer_list, property_trees->clip_tree, 681 property_trees->transform_tree,
717 property_trees->transform_tree, can_render_to_separate_surface); 682 can_render_to_separate_surface);
718 } 683 }
719 684
720 void BuildPropertyTreesAndComputeVisibleRects( 685 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, 686 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree,
740 root_layer); 687 root_layer);
741 #if DCHECK_IS_ON() 688 #if DCHECK_IS_ON()
742 ValidateRenderSurfacesRecursive(root_layer); 689 ValidateRenderSurfacesRecursive(root_layer);
743 #endif 690 #endif
744 ComputeVisibleRects(root_layer, property_trees, 691 }
745 can_render_to_separate_surface, update_layer_list); 692
693 void UpdatePropertyTrees(PropertyTrees* property_trees,
694 bool can_render_to_separate_surface) {
695 if (property_trees->non_root_surfaces_enabled !=
696 can_render_to_separate_surface) {
697 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
698 property_trees->transform_tree.set_needs_update(true);
699 }
700 if (property_trees->transform_tree.needs_update())
701 property_trees->clip_tree.set_needs_update(true);
702 ComputeTransforms(&property_trees->transform_tree);
703 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
704 can_render_to_separate_surface);
705 ComputeEffects(&property_trees->effect_tree);
706 }
707
708 void FindLayersThatNeedUpdates(Layer* layer,
709 const TransformTree& transform_tree,
710 const EffectTree& effect_tree,
711 LayerList* update_layer_list) {
712 DCHECK_GE(layer->effect_tree_index(), 0);
713 bool layer_is_drawn =
714 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
715
716 if (!IsRootLayer(layer) &&
717 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
718 return;
719
720 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) {
721 update_layer_list->push_back(layer);
722 }
723
724 // Append mask layers to the update layer list. They don't have valid visible
725 // rects, so need to get added after the above calculation. Replica layers
726 // don't need to be updated.
ajuma 2016/04/04 20:47:18 This comment doesn't apply anymore (since we're no
jaydasika 2016/04/04 21:29:17 Done.
727 if (Layer* mask_layer = layer->mask_layer())
728 update_layer_list->push_back(mask_layer);
729 if (Layer* replica_layer = layer->replica_layer()) {
730 if (Layer* mask_layer = replica_layer->mask_layer())
731 update_layer_list->push_back(mask_layer);
732 }
733
734 for (size_t i = 0; i < layer->children().size(); ++i) {
735 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
736 update_layer_list);
737 }
738 }
739
740 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees,
741 bool can_render_to_separate_surface,
742 LayerList* update_layer_list) {
743 std::vector<Layer*> visible_layer_list;
744 for (auto layer : *update_layer_list) {
745 visible_layer_list.push_back(layer.get());
ajuma 2016/04/04 20:47:17 Can we avoid this copy? Maybe use templating so th
jaydasika 2016/04/04 21:29:16 Done.
746 }
747 CalculateVisibleRects(visible_layer_list, property_trees->clip_tree,
748 property_trees->transform_tree,
749 can_render_to_separate_surface);
746 } 750 }
747 751
748 void BuildPropertyTreesAndComputeVisibleRects( 752 void BuildPropertyTreesAndComputeVisibleRects(
749 LayerImpl* root_layer, 753 LayerImpl* root_layer,
750 const LayerImpl* page_scale_layer, 754 const LayerImpl* page_scale_layer,
751 const LayerImpl* inner_viewport_scroll_layer, 755 const LayerImpl* inner_viewport_scroll_layer,
752 const LayerImpl* outer_viewport_scroll_layer, 756 const LayerImpl* outer_viewport_scroll_layer,
753 const LayerImpl* overscroll_elasticity_layer, 757 const LayerImpl* overscroll_elasticity_layer,
754 const gfx::Vector2dF& elastic_overscroll, 758 const gfx::Vector2dF& elastic_overscroll,
755 float page_scale_factor, 759 float page_scale_factor,
756 float device_scale_factor, 760 float device_scale_factor,
757 const gfx::Rect& viewport, 761 const gfx::Rect& viewport,
758 const gfx::Transform& device_transform, 762 const gfx::Transform& device_transform,
759 bool can_render_to_separate_surface, 763 bool can_render_to_separate_surface,
760 PropertyTrees* property_trees, 764 PropertyTrees* property_trees,
761 LayerImplList* visible_layer_list) { 765 LayerImplList* visible_layer_list) {
762 PropertyTreeBuilder::BuildPropertyTrees( 766 PropertyTreeBuilder::BuildPropertyTrees(
763 root_layer, page_scale_layer, inner_viewport_scroll_layer, 767 root_layer, page_scale_layer, inner_viewport_scroll_layer,
764 outer_viewport_scroll_layer, overscroll_elasticity_layer, 768 outer_viewport_scroll_layer, overscroll_elasticity_layer,
765 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 769 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
766 device_transform, property_trees); 770 device_transform, property_trees);
767 ComputeVisibleRects(root_layer, property_trees, 771 ComputeVisibleRects(root_layer, property_trees,
768 can_render_to_separate_surface, visible_layer_list); 772 can_render_to_separate_surface, visible_layer_list);
769 } 773 }
770 774
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, 775 void ComputeVisibleRects(LayerImpl* root_layer,
782 PropertyTrees* property_trees, 776 PropertyTrees* property_trees,
783 bool can_render_to_separate_surface, 777 bool can_render_to_separate_surface,
784 LayerImplList* visible_layer_list) { 778 LayerImplList* visible_layer_list) {
785 for (auto* layer : *root_layer->layer_tree_impl()) { 779 for (auto* layer : *root_layer->layer_tree_impl()) {
786 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, 780 UpdateRenderSurfaceForLayer(&property_trees->effect_tree,
787 can_render_to_separate_surface, layer); 781 can_render_to_separate_surface, layer);
788 #if DCHECK_IS_ON() 782 #if DCHECK_IS_ON()
789 if (can_render_to_separate_surface) 783 if (can_render_to_separate_surface)
790 ValidateRenderSurfaceForLayer(layer); 784 ValidateRenderSurfaceForLayer(layer);
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1170 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1177 const Layer* overscroll_elasticity_layer, 1171 const Layer* overscroll_elasticity_layer,
1178 const gfx::Vector2dF& elastic_overscroll) { 1172 const gfx::Vector2dF& elastic_overscroll) {
1179 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1173 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1180 elastic_overscroll); 1174 elastic_overscroll);
1181 } 1175 }
1182 1176
1183 } // namespace draw_property_utils 1177 } // namespace draw_property_utils
1184 1178
1185 } // namespace cc 1179 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698