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

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, 444 static void FindLayersThatNeedUpdates(Layer* layer,
445 const TransformTree& transform_tree, 445 const TransformTree& transform_tree,
446 const EffectTree& effect_tree, 446 const EffectTree& effect_tree,
447 LayerList* update_layer_list, 447 LayerList* update_layer_list) {
448 std::vector<Layer*>* visible_layer_list) {
449 DCHECK_GE(layer->effect_tree_index(), 0); 448 DCHECK_GE(layer->effect_tree_index(), 0);
450 bool layer_is_drawn = 449 bool layer_is_drawn =
451 effect_tree.Node(layer->effect_tree_index())->data.is_drawn; 450 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
452 451
453 if (!IsRootLayer(layer) && 452 if (!IsRootLayer(layer) &&
454 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree)) 453 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
455 return; 454 return;
456 455
457 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) { 456 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) {
458 visible_layer_list->push_back(layer);
459 update_layer_list->push_back(layer); 457 update_layer_list->push_back(layer);
460 } 458 }
461 459
462 // Append mask layers to the update layer list. They don't have valid visible 460 // 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 461 // rects, so need to get added after the above calculation. Replica layers
464 // don't need to be updated. 462 // don't need to be updated.
465 if (Layer* mask_layer = layer->mask_layer()) 463 if (Layer* mask_layer = layer->mask_layer())
466 update_layer_list->push_back(mask_layer); 464 update_layer_list->push_back(mask_layer);
467 if (Layer* replica_layer = layer->replica_layer()) { 465 if (Layer* replica_layer = layer->replica_layer()) {
468 if (Layer* mask_layer = replica_layer->mask_layer()) 466 if (Layer* mask_layer = replica_layer->mask_layer())
469 update_layer_list->push_back(mask_layer); 467 update_layer_list->push_back(mask_layer);
470 } 468 }
471 469
472 for (size_t i = 0; i < layer->children().size(); ++i) { 470 for (size_t i = 0; i < layer->children().size(); ++i) {
473 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree, 471 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
474 update_layer_list, visible_layer_list); 472 update_layer_list);
475 } 473 }
476 } 474 }
477 475
478 void FindLayersThatNeedUpdates(LayerImpl* layer, 476 void FindLayersThatNeedUpdates(LayerImpl* layer,
479 const TransformTree& transform_tree, 477 const TransformTree& transform_tree,
480 const EffectTree& effect_tree, 478 const EffectTree& effect_tree,
481 LayerImplList* update_layer_list, 479 LayerImplList* update_layer_list,
482 std::vector<LayerImpl*>* visible_layer_list) { 480 std::vector<LayerImpl*>* visible_layer_list) {
483 DCHECK_GE(layer->effect_tree_index(), 0); 481 DCHECK_GE(layer->effect_tree_index(), 0);
484 for (auto* layer_impl : *layer->layer_tree_impl()) { 482 for (auto* layer_impl : *layer->layer_tree_impl()) {
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 } 681 }
684 682
685 void ComputeEffects(EffectTree* effect_tree) { 683 void ComputeEffects(EffectTree* effect_tree) {
686 if (!effect_tree->needs_update()) 684 if (!effect_tree->needs_update())
687 return; 685 return;
688 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) 686 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i)
689 effect_tree->UpdateEffects(i); 687 effect_tree->UpdateEffects(i);
690 effect_tree->set_needs_update(false); 688 effect_tree->set_needs_update(false);
691 } 689 }
692 690
693 template <typename LayerType>
694 static void ComputeVisibleRectsInternal( 691 static void ComputeVisibleRectsInternal(
695 LayerType* root_layer, 692 LayerImpl* root_layer,
696 PropertyTrees* property_trees, 693 PropertyTrees* property_trees,
697 bool can_render_to_separate_surface, 694 bool can_render_to_separate_surface,
698 typename LayerType::LayerListType* update_layer_list, 695 LayerImplList* update_layer_list,
699 std::vector<LayerType*>* visible_layer_list) { 696 std::vector<LayerImpl*>* visible_layer_list) {
700 if (property_trees->non_root_surfaces_enabled != 697 if (property_trees->non_root_surfaces_enabled !=
701 can_render_to_separate_surface) { 698 can_render_to_separate_surface) {
702 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; 699 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
703 property_trees->transform_tree.set_needs_update(true); 700 property_trees->transform_tree.set_needs_update(true);
704 } 701 }
705 if (property_trees->transform_tree.needs_update()) 702 if (property_trees->transform_tree.needs_update())
706 property_trees->clip_tree.set_needs_update(true); 703 property_trees->clip_tree.set_needs_update(true);
707 ComputeTransforms(&property_trees->transform_tree); 704 ComputeTransforms(&property_trees->transform_tree);
708 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, 705 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
709 can_render_to_separate_surface); 706 can_render_to_separate_surface);
710 ComputeEffects(&property_trees->effect_tree); 707 ComputeEffects(&property_trees->effect_tree);
711 708
712 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree, 709 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree,
713 property_trees->effect_tree, update_layer_list, 710 property_trees->effect_tree, update_layer_list,
714 visible_layer_list); 711 visible_layer_list);
715 CalculateVisibleRects<LayerType>( 712 CalculateVisibleRects(*visible_layer_list, property_trees->clip_tree,
716 *visible_layer_list, property_trees->clip_tree, 713 property_trees->transform_tree,
717 property_trees->transform_tree, can_render_to_separate_surface); 714 can_render_to_separate_surface);
715 }
716
717 void Update(Layer* root_layer,
718 PropertyTrees* property_trees,
719 bool can_render_to_separate_surface,
720 LayerList* update_layer_list) {
721 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree,
722 root_layer);
723 #if DCHECK_IS_ON()
724 ValidateRenderSurfacesRecursive(root_layer);
725 #endif
726 if (property_trees->non_root_surfaces_enabled !=
727 can_render_to_separate_surface) {
728 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
729 property_trees->transform_tree.set_needs_update(true);
730 }
731 if (property_trees->transform_tree.needs_update())
732 property_trees->clip_tree.set_needs_update(true);
733 ComputeTransforms(&property_trees->transform_tree);
734 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
735 can_render_to_separate_surface);
736 ComputeEffects(&property_trees->effect_tree);
737 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree,
738 property_trees->effect_tree, update_layer_list);
739 }
740
741 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees,
742 bool can_render_to_separate_surface,
743 LayerList* update_layer_list) {
744 std::vector<Layer*> visible_layer_list;
745 for (auto layer : *update_layer_list) {
746 visible_layer_list.push_back(layer.get());
747 }
748 CalculateVisibleRects(visible_layer_list, property_trees->clip_tree,
749 property_trees->transform_tree,
750 can_render_to_separate_surface);
718 } 751 }
719 752
720 void BuildPropertyTreesAndComputeVisibleRects( 753 void BuildPropertyTreesAndComputeVisibleRects(
jaydasika 2016/04/02 02:54:10 Wanted to delete this function but calling the fun
ajuma 2016/04/04 14:15:05 It's probably just that PropertyTreeBuilder isn't
jaydasika 2016/04/04 18:41:09 That was the reason. Thanks
721 Layer* root_layer, 754 Layer* root_layer,
722 const Layer* page_scale_layer, 755 const Layer* page_scale_layer,
723 const Layer* inner_viewport_scroll_layer, 756 const Layer* inner_viewport_scroll_layer,
724 const Layer* outer_viewport_scroll_layer, 757 const Layer* outer_viewport_scroll_layer,
725 const Layer* overscroll_elasticity_layer, 758 const Layer* overscroll_elasticity_layer,
726 const gfx::Vector2dF& elastic_overscroll, 759 const gfx::Vector2dF& elastic_overscroll,
727 float page_scale_factor, 760 float page_scale_factor,
728 float device_scale_factor, 761 float device_scale_factor,
729 const gfx::Rect& viewport, 762 const gfx::Rect& viewport,
730 const gfx::Transform& device_transform, 763 const gfx::Transform& device_transform,
731 bool can_render_to_separate_surface, 764 PropertyTrees* property_trees) {
732 PropertyTrees* property_trees,
733 LayerList* update_layer_list) {
734 PropertyTreeBuilder::BuildPropertyTrees( 765 PropertyTreeBuilder::BuildPropertyTrees(
735 root_layer, page_scale_layer, inner_viewport_scroll_layer, 766 root_layer, page_scale_layer, inner_viewport_scroll_layer,
736 outer_viewport_scroll_layer, overscroll_elasticity_layer, 767 outer_viewport_scroll_layer, overscroll_elasticity_layer,
737 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 768 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
738 device_transform, property_trees); 769 device_transform, property_trees);
739 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree,
740 root_layer);
741 #if DCHECK_IS_ON()
742 ValidateRenderSurfacesRecursive(root_layer);
743 #endif
744 ComputeVisibleRects(root_layer, property_trees,
745 can_render_to_separate_surface, update_layer_list);
746 } 770 }
747 771
748 void BuildPropertyTreesAndComputeVisibleRects( 772 void BuildPropertyTreesAndComputeVisibleRects(
749 LayerImpl* root_layer, 773 LayerImpl* root_layer,
750 const LayerImpl* page_scale_layer, 774 const LayerImpl* page_scale_layer,
751 const LayerImpl* inner_viewport_scroll_layer, 775 const LayerImpl* inner_viewport_scroll_layer,
752 const LayerImpl* outer_viewport_scroll_layer, 776 const LayerImpl* outer_viewport_scroll_layer,
753 const LayerImpl* overscroll_elasticity_layer, 777 const LayerImpl* overscroll_elasticity_layer,
754 const gfx::Vector2dF& elastic_overscroll, 778 const gfx::Vector2dF& elastic_overscroll,
755 float page_scale_factor, 779 float page_scale_factor,
756 float device_scale_factor, 780 float device_scale_factor,
757 const gfx::Rect& viewport, 781 const gfx::Rect& viewport,
758 const gfx::Transform& device_transform, 782 const gfx::Transform& device_transform,
759 bool can_render_to_separate_surface, 783 bool can_render_to_separate_surface,
760 PropertyTrees* property_trees, 784 PropertyTrees* property_trees,
761 LayerImplList* visible_layer_list) { 785 LayerImplList* visible_layer_list) {
762 PropertyTreeBuilder::BuildPropertyTrees( 786 PropertyTreeBuilder::BuildPropertyTrees(
763 root_layer, page_scale_layer, inner_viewport_scroll_layer, 787 root_layer, page_scale_layer, inner_viewport_scroll_layer,
764 outer_viewport_scroll_layer, overscroll_elasticity_layer, 788 outer_viewport_scroll_layer, overscroll_elasticity_layer,
765 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 789 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
766 device_transform, property_trees); 790 device_transform, property_trees);
767 ComputeVisibleRects(root_layer, property_trees, 791 ComputeVisibleRects(root_layer, property_trees,
768 can_render_to_separate_surface, visible_layer_list); 792 can_render_to_separate_surface, visible_layer_list);
769 } 793 }
770 794
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, 795 void ComputeVisibleRects(LayerImpl* root_layer,
782 PropertyTrees* property_trees, 796 PropertyTrees* property_trees,
783 bool can_render_to_separate_surface, 797 bool can_render_to_separate_surface,
784 LayerImplList* visible_layer_list) { 798 LayerImplList* visible_layer_list) {
785 for (auto* layer : *root_layer->layer_tree_impl()) { 799 for (auto* layer : *root_layer->layer_tree_impl()) {
786 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, 800 UpdateRenderSurfaceForLayer(&property_trees->effect_tree,
787 can_render_to_separate_surface, layer); 801 can_render_to_separate_surface, layer);
788 #if DCHECK_IS_ON() 802 #if DCHECK_IS_ON()
789 if (can_render_to_separate_surface) 803 if (can_render_to_separate_surface)
790 ValidateRenderSurfaceForLayer(layer); 804 ValidateRenderSurfaceForLayer(layer);
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1190 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1177 const Layer* overscroll_elasticity_layer, 1191 const Layer* overscroll_elasticity_layer,
1178 const gfx::Vector2dF& elastic_overscroll) { 1192 const gfx::Vector2dF& elastic_overscroll) {
1179 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1193 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1180 elastic_overscroll); 1194 elastic_overscroll);
1181 } 1195 }
1182 1196
1183 } // namespace draw_property_utils 1197 } // namespace draw_property_utils
1184 1198
1185 } // namespace cc 1199 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698