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 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 } | 423 } |
424 | 424 |
425 template <typename LayerType> | 425 template <typename LayerType> |
426 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, | 426 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, |
427 bool non_root_surfaces_enabled, | 427 bool non_root_surfaces_enabled, |
428 LayerType* layer) { | 428 LayerType* layer) { |
429 if (!non_root_surfaces_enabled) { | 429 if (!non_root_surfaces_enabled) { |
430 layer->SetHasRenderSurface(IsRootLayer(layer)); | 430 layer->SetHasRenderSurface(IsRootLayer(layer)); |
431 return; | 431 return; |
432 } | 432 } |
| 433 |
433 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); | 434 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); |
434 | 435 |
435 if (node->owner_id == layer->id() && node->data.has_render_surface) | 436 if (node->owner_id == layer->id() && node->data.has_render_surface) |
436 layer->SetHasRenderSurface(true); | 437 layer->SetHasRenderSurface(true); |
437 else | 438 else |
438 layer->SetHasRenderSurface(false); | 439 layer->SetHasRenderSurface(false); |
439 } | 440 } |
440 | 441 |
441 void UpdateRenderSurfacesForLayersRecursive(EffectTree* effect_tree, | 442 void UpdateRenderSurfacesForLayersRecursive(EffectTree* effect_tree, |
442 Layer* layer) { | 443 Layer* layer) { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 } | 595 } |
595 | 596 |
596 void ComputeTransforms(TransformTree* transform_tree) { | 597 void ComputeTransforms(TransformTree* transform_tree) { |
597 if (!transform_tree->needs_update()) | 598 if (!transform_tree->needs_update()) |
598 return; | 599 return; |
599 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) | 600 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) |
600 transform_tree->UpdateTransforms(i); | 601 transform_tree->UpdateTransforms(i); |
601 transform_tree->set_needs_update(false); | 602 transform_tree->set_needs_update(false); |
602 } | 603 } |
603 | 604 |
| 605 void UpdateRenderTarget(EffectTree* effect_tree, |
| 606 bool can_render_to_separate_surface) { |
| 607 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { |
| 608 EffectNode* node = effect_tree->Node(i); |
| 609 if (i == 1) { |
| 610 // Render target on the first effect node is root. |
| 611 node->data.target_id = 0; |
| 612 } else if (!can_render_to_separate_surface) { |
| 613 node->data.target_id = 1; |
| 614 } else if (effect_tree->parent(node)->data.has_render_surface) { |
| 615 node->data.target_id = node->parent_id; |
| 616 } else { |
| 617 node->data.target_id = effect_tree->parent(node)->data.target_id; |
| 618 } |
| 619 } |
| 620 } |
| 621 |
604 void ComputeEffects(EffectTree* effect_tree) { | 622 void ComputeEffects(EffectTree* effect_tree) { |
605 if (!effect_tree->needs_update()) | 623 if (!effect_tree->needs_update()) |
606 return; | 624 return; |
607 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) | 625 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) |
608 effect_tree->UpdateEffects(i); | 626 effect_tree->UpdateEffects(i); |
609 effect_tree->set_needs_update(false); | 627 effect_tree->set_needs_update(false); |
610 } | 628 } |
611 | 629 |
612 static void ComputeVisibleRectsInternal( | 630 static void ComputeVisibleRectsInternal( |
613 LayerImpl* root_layer, | 631 LayerImpl* root_layer, |
614 PropertyTrees* property_trees, | 632 PropertyTrees* property_trees, |
615 bool can_render_to_separate_surface, | 633 bool can_render_to_separate_surface, |
616 LayerImplList* update_layer_list, | 634 LayerImplList* update_layer_list, |
617 std::vector<LayerImpl*>* visible_layer_list) { | 635 std::vector<LayerImpl*>* visible_layer_list) { |
618 if (property_trees->non_root_surfaces_enabled != | 636 if (property_trees->non_root_surfaces_enabled != |
619 can_render_to_separate_surface) { | 637 can_render_to_separate_surface) { |
620 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | 638 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; |
621 property_trees->transform_tree.set_needs_update(true); | 639 property_trees->transform_tree.set_needs_update(true); |
622 } | 640 } |
623 if (property_trees->transform_tree.needs_update()) | 641 if (property_trees->transform_tree.needs_update()) |
624 property_trees->clip_tree.set_needs_update(true); | 642 property_trees->clip_tree.set_needs_update(true); |
| 643 UpdateRenderTarget(&property_trees->effect_tree, |
| 644 property_trees->non_root_surfaces_enabled); |
625 ComputeTransforms(&property_trees->transform_tree); | 645 ComputeTransforms(&property_trees->transform_tree); |
626 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, | 646 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, |
627 can_render_to_separate_surface); | 647 can_render_to_separate_surface); |
628 ComputeEffects(&property_trees->effect_tree); | 648 ComputeEffects(&property_trees->effect_tree); |
629 | 649 |
630 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree, | 650 FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree, |
631 property_trees->effect_tree, update_layer_list, | 651 property_trees->effect_tree, update_layer_list, |
632 visible_layer_list); | 652 visible_layer_list); |
633 CalculateVisibleRects<LayerImpl>( | 653 CalculateVisibleRects<LayerImpl>( |
634 *visible_layer_list, property_trees->clip_tree, | 654 *visible_layer_list, property_trees->clip_tree, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 can_render_to_separate_surface, visible_layer_list); | 736 can_render_to_separate_surface, visible_layer_list); |
717 } | 737 } |
718 | 738 |
719 void ComputeVisibleRects(LayerImpl* root_layer, | 739 void ComputeVisibleRects(LayerImpl* root_layer, |
720 PropertyTrees* property_trees, | 740 PropertyTrees* property_trees, |
721 bool can_render_to_separate_surface, | 741 bool can_render_to_separate_surface, |
722 LayerImplList* visible_layer_list) { | 742 LayerImplList* visible_layer_list) { |
723 for (auto* layer : *root_layer->layer_tree_impl()) { | 743 for (auto* layer : *root_layer->layer_tree_impl()) { |
724 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, | 744 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, |
725 can_render_to_separate_surface, layer); | 745 can_render_to_separate_surface, layer); |
| 746 EffectNode* node = |
| 747 property_trees->effect_tree.Node(layer->effect_tree_index()); |
| 748 if (node->owner_id == layer->id()) |
| 749 node->data.render_surface = layer->render_surface(); |
726 #if DCHECK_IS_ON() | 750 #if DCHECK_IS_ON() |
727 if (can_render_to_separate_surface) | 751 if (can_render_to_separate_surface) |
728 ValidateRenderSurfaceForLayer(layer); | 752 ValidateRenderSurfaceForLayer(layer); |
729 #endif | 753 #endif |
730 } | 754 } |
731 LayerImplList update_layer_list; | 755 LayerImplList update_layer_list; |
732 ComputeVisibleRectsInternal(root_layer, property_trees, | 756 ComputeVisibleRectsInternal(root_layer, property_trees, |
733 can_render_to_separate_surface, | 757 can_render_to_separate_surface, |
734 &update_layer_list, visible_layer_list); | 758 &update_layer_list, visible_layer_list); |
735 } | 759 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 const TransformTree& tree) { | 927 const TransformTree& tree) { |
904 return ScreenSpaceTransformInternal(layer, | 928 return ScreenSpaceTransformInternal(layer, |
905 tree.Node(layer->transform_tree_index())); | 929 tree.Node(layer->transform_tree_index())); |
906 } | 930 } |
907 | 931 |
908 static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) { | 932 static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) { |
909 if (!layer->render_target()) | 933 if (!layer->render_target()) |
910 return 0.f; | 934 return 0.f; |
911 | 935 |
912 const EffectNode* target_node = | 936 const EffectNode* target_node = |
913 tree.Node(layer->render_target()->effect_tree_index()); | 937 tree.Node(layer->render_target()->EffectTreeIndex()); |
914 const EffectNode* node = tree.Node(layer->effect_tree_index()); | 938 const EffectNode* node = tree.Node(layer->effect_tree_index()); |
915 if (node == target_node) | 939 if (node == target_node) |
916 return 1.f; | 940 return 1.f; |
917 | 941 |
918 float draw_opacity = 1.f; | 942 float draw_opacity = 1.f; |
919 while (node != target_node) { | 943 while (node != target_node) { |
920 draw_opacity *= node->data.opacity; | 944 draw_opacity *= node->data.opacity; |
921 node = tree.parent(node); | 945 node = tree.parent(node); |
922 } | 946 } |
923 return draw_opacity; | 947 return draw_opacity; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1189 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
1166 const Layer* overscroll_elasticity_layer, | 1190 const Layer* overscroll_elasticity_layer, |
1167 const gfx::Vector2dF& elastic_overscroll) { | 1191 const gfx::Vector2dF& elastic_overscroll) { |
1168 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1192 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
1169 elastic_overscroll); | 1193 elastic_overscroll); |
1170 } | 1194 } |
1171 | 1195 |
1172 } // namespace draw_property_utils | 1196 } // namespace draw_property_utils |
1173 | 1197 |
1174 } // namespace cc | 1198 } // namespace cc |
OLD | NEW |