| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |