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 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 } | 385 } |
386 | 386 |
387 template <typename LayerType> | 387 template <typename LayerType> |
388 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, | 388 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, |
389 bool non_root_surfaces_enabled, | 389 bool non_root_surfaces_enabled, |
390 LayerType* layer) { | 390 LayerType* layer) { |
391 if (!non_root_surfaces_enabled) { | 391 if (!non_root_surfaces_enabled) { |
392 layer->SetHasRenderSurface(IsRootLayer(layer)); | 392 layer->SetHasRenderSurface(IsRootLayer(layer)); |
393 return; | 393 return; |
394 } | 394 } |
| 395 |
395 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); | 396 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); |
396 | 397 |
397 if (node->owner_id == layer->id() && node->data.has_render_surface) | 398 if (node->owner_id == layer->id() && node->data.has_render_surface) |
398 layer->SetHasRenderSurface(true); | 399 layer->SetHasRenderSurface(true); |
399 else | 400 else |
400 layer->SetHasRenderSurface(false); | 401 layer->SetHasRenderSurface(false); |
401 } | 402 } |
402 | 403 |
403 void UpdateRenderSurfacesForLayersRecursive(EffectTree* effect_tree, | 404 void UpdateRenderSurfacesForLayersRecursive(EffectTree* effect_tree, |
404 Layer* layer) { | 405 Layer* layer) { |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 } | 681 } |
681 | 682 |
682 void ComputeTransforms(TransformTree* transform_tree) { | 683 void ComputeTransforms(TransformTree* transform_tree) { |
683 if (!transform_tree->needs_update()) | 684 if (!transform_tree->needs_update()) |
684 return; | 685 return; |
685 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) | 686 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) |
686 transform_tree->UpdateTransforms(i); | 687 transform_tree->UpdateTransforms(i); |
687 transform_tree->set_needs_update(false); | 688 transform_tree->set_needs_update(false); |
688 } | 689 } |
689 | 690 |
| 691 void UpdateRenderTarget(EffectTree* effect_tree, |
| 692 bool can_render_to_separate_surface) { |
| 693 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { |
| 694 EffectNode* node = effect_tree->Node(i); |
| 695 if (i == 1) { |
| 696 // Render target on the first effect node is root. |
| 697 node->data.target_id = 0; |
| 698 } else if (!can_render_to_separate_surface) { |
| 699 node->data.target_id = 1; |
| 700 } else if (effect_tree->parent(node)->data.has_render_surface) { |
| 701 node->data.target_id = node->parent_id; |
| 702 } else { |
| 703 node->data.target_id = effect_tree->parent(node)->data.target_id; |
| 704 } |
| 705 } |
| 706 } |
| 707 |
690 void ComputeEffects(EffectTree* effect_tree) { | 708 void ComputeEffects(EffectTree* effect_tree) { |
691 if (!effect_tree->needs_update()) | 709 if (!effect_tree->needs_update()) |
692 return; | 710 return; |
693 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) | 711 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) |
694 effect_tree->UpdateEffects(i); | 712 effect_tree->UpdateEffects(i); |
695 effect_tree->set_needs_update(false); | 713 effect_tree->set_needs_update(false); |
696 } | 714 } |
697 | 715 |
698 static void ComputeVisibleRectsInternal( | 716 static void ComputeVisibleRectsInternal( |
699 LayerImpl* root_layer, | 717 LayerImpl* root_layer, |
700 PropertyTrees* property_trees, | 718 PropertyTrees* property_trees, |
701 bool can_render_to_separate_surface, | 719 bool can_render_to_separate_surface, |
702 LayerImplList* update_layer_list, | 720 LayerImplList* update_layer_list, |
703 std::vector<LayerImpl*>* visible_layer_list) { | 721 std::vector<LayerImpl*>* visible_layer_list) { |
704 if (property_trees->non_root_surfaces_enabled != | 722 if (property_trees->non_root_surfaces_enabled != |
705 can_render_to_separate_surface) { | 723 can_render_to_separate_surface) { |
706 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | 724 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; |
707 property_trees->transform_tree.set_needs_update(true); | 725 property_trees->transform_tree.set_needs_update(true); |
708 } | 726 } |
709 if (property_trees->transform_tree.needs_update()) | 727 if (property_trees->transform_tree.needs_update()) |
710 property_trees->clip_tree.set_needs_update(true); | 728 property_trees->clip_tree.set_needs_update(true); |
| 729 UpdateRenderTarget(&property_trees->effect_tree, |
| 730 property_trees->non_root_surfaces_enabled); |
711 ComputeTransforms(&property_trees->transform_tree); | 731 ComputeTransforms(&property_trees->transform_tree); |
712 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, | 732 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, |
713 can_render_to_separate_surface); | 733 can_render_to_separate_surface); |
714 ComputeEffects(&property_trees->effect_tree); | 734 ComputeEffects(&property_trees->effect_tree); |
715 | 735 |
716 FindLayersThatNeedUpdates( | 736 FindLayersThatNeedUpdates( |
717 root_layer->layer_tree_impl(), property_trees->transform_tree, | 737 root_layer->layer_tree_impl(), property_trees->transform_tree, |
718 property_trees->effect_tree, update_layer_list, visible_layer_list); | 738 property_trees->effect_tree, update_layer_list, visible_layer_list); |
719 CalculateVisibleRects<LayerImpl>( | 739 CalculateVisibleRects<LayerImpl>( |
720 *visible_layer_list, property_trees->clip_tree, | 740 *visible_layer_list, property_trees->clip_tree, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 can_render_to_separate_surface, visible_layer_list); | 795 can_render_to_separate_surface, visible_layer_list); |
776 } | 796 } |
777 | 797 |
778 void ComputeVisibleRects(LayerImpl* root_layer, | 798 void ComputeVisibleRects(LayerImpl* root_layer, |
779 PropertyTrees* property_trees, | 799 PropertyTrees* property_trees, |
780 bool can_render_to_separate_surface, | 800 bool can_render_to_separate_surface, |
781 LayerImplList* visible_layer_list) { | 801 LayerImplList* visible_layer_list) { |
782 for (auto* layer : *root_layer->layer_tree_impl()) { | 802 for (auto* layer : *root_layer->layer_tree_impl()) { |
783 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, | 803 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, |
784 can_render_to_separate_surface, layer); | 804 can_render_to_separate_surface, layer); |
| 805 EffectNode* node = |
| 806 property_trees->effect_tree.Node(layer->effect_tree_index()); |
| 807 if (node->owner_id == layer->id()) |
| 808 node->data.render_surface = layer->render_surface(); |
785 #if DCHECK_IS_ON() | 809 #if DCHECK_IS_ON() |
786 if (can_render_to_separate_surface) | 810 if (can_render_to_separate_surface) |
787 ValidateRenderSurfaceForLayer(layer); | 811 ValidateRenderSurfaceForLayer(layer); |
788 #endif | 812 #endif |
789 } | 813 } |
790 LayerImplList update_layer_list; | 814 LayerImplList update_layer_list; |
791 ComputeVisibleRectsInternal(root_layer, property_trees, | 815 ComputeVisibleRectsInternal(root_layer, property_trees, |
792 can_render_to_separate_surface, | 816 can_render_to_separate_surface, |
793 &update_layer_list, visible_layer_list); | 817 &update_layer_list, visible_layer_list); |
794 } | 818 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 const TransformTree& tree) { | 938 const TransformTree& tree) { |
915 return ScreenSpaceTransformInternal(layer, | 939 return ScreenSpaceTransformInternal(layer, |
916 tree.Node(layer->transform_tree_index())); | 940 tree.Node(layer->transform_tree_index())); |
917 } | 941 } |
918 | 942 |
919 static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) { | 943 static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) { |
920 if (!layer->render_target()) | 944 if (!layer->render_target()) |
921 return 0.f; | 945 return 0.f; |
922 | 946 |
923 const EffectNode* target_node = | 947 const EffectNode* target_node = |
924 tree.Node(layer->render_target()->effect_tree_index()); | 948 tree.Node(layer->render_target()->EffectTreeIndex()); |
925 const EffectNode* node = tree.Node(layer->effect_tree_index()); | 949 const EffectNode* node = tree.Node(layer->effect_tree_index()); |
926 if (node == target_node) | 950 if (node == target_node) |
927 return 1.f; | 951 return 1.f; |
928 | 952 |
929 float draw_opacity = 1.f; | 953 float draw_opacity = 1.f; |
930 while (node != target_node) { | 954 while (node != target_node) { |
931 draw_opacity *= node->data.opacity; | 955 draw_opacity *= node->data.opacity; |
932 node = tree.parent(node); | 956 node = tree.parent(node); |
933 } | 957 } |
934 return draw_opacity; | 958 return draw_opacity; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1200 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
1177 const Layer* overscroll_elasticity_layer, | 1201 const Layer* overscroll_elasticity_layer, |
1178 const gfx::Vector2dF& elastic_overscroll) { | 1202 const gfx::Vector2dF& elastic_overscroll) { |
1179 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1203 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
1180 elastic_overscroll); | 1204 elastic_overscroll); |
1181 } | 1205 } |
1182 | 1206 |
1183 } // namespace draw_property_utils | 1207 } // namespace draw_property_utils |
1184 | 1208 |
1185 } // namespace cc | 1209 } // namespace cc |
OLD | NEW |