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 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 } | 706 } |
707 | 707 |
708 static ConditionalClip LayerClipRect(PropertyTrees* property_trees, | 708 static ConditionalClip LayerClipRect(PropertyTrees* property_trees, |
709 LayerImpl* layer) { | 709 LayerImpl* layer) { |
710 const EffectTree* effect_tree = &property_trees->effect_tree; | 710 const EffectTree* effect_tree = &property_trees->effect_tree; |
711 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); | 711 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); |
712 const EffectNode* target_node = | 712 const EffectNode* target_node = |
713 effect_node->has_render_surface | 713 effect_node->has_render_surface |
714 ? effect_node | 714 ? effect_node |
715 : effect_tree->Node(effect_node->target_id); | 715 : effect_tree->Node(effect_node->target_id); |
716 // TODO(weiliangc): When effect node has up to date render surface info on | |
717 // compositor thread, no need to check for resourceless draw mode | |
718 if (!property_trees->non_root_surfaces_enabled) { | |
719 target_node = effect_tree->Node(1); | |
720 } | |
721 | |
722 bool include_expanding_clips = false; | 716 bool include_expanding_clips = false; |
723 return ComputeAccumulatedClip(property_trees, include_expanding_clips, | 717 return ComputeAccumulatedClip(property_trees, include_expanding_clips, |
724 layer->clip_tree_index(), target_node->id); | 718 layer->clip_tree_index(), target_node->id); |
725 } | 719 } |
726 | 720 |
727 static void UpdateRenderTarget(EffectTree* effect_tree, | 721 static void UpdateRenderTarget(EffectTree* effect_tree) { |
728 bool can_render_to_separate_surface) { | |
729 for (int i = EffectTree::kContentsRootNodeId; | 722 for (int i = EffectTree::kContentsRootNodeId; |
730 i < static_cast<int>(effect_tree->size()); ++i) { | 723 i < static_cast<int>(effect_tree->size()); ++i) { |
731 EffectNode* node = effect_tree->Node(i); | 724 EffectNode* node = effect_tree->Node(i); |
732 if (i == EffectTree::kContentsRootNodeId) { | 725 if (i == EffectTree::kContentsRootNodeId) { |
733 // Render target of the node corresponding to root is itself. | 726 // Render target of the node corresponding to root is itself. |
734 node->target_id = EffectTree::kContentsRootNodeId; | 727 node->target_id = EffectTree::kContentsRootNodeId; |
735 } else if (!can_render_to_separate_surface) { | |
736 node->target_id = EffectTree::kContentsRootNodeId; | |
737 } else if (effect_tree->parent(node)->has_render_surface) { | 728 } else if (effect_tree->parent(node)->has_render_surface) { |
738 node->target_id = node->parent_id; | 729 node->target_id = node->parent_id; |
739 } else { | 730 } else { |
740 node->target_id = effect_tree->parent(node)->target_id; | 731 node->target_id = effect_tree->parent(node)->target_id; |
741 } | 732 } |
742 } | 733 } |
743 } | 734 } |
744 | 735 |
745 static void UpdateScrollTree(ScrollTree* scroll_tree, | 736 static void UpdateScrollTree(ScrollTree* scroll_tree, |
746 const LayerTreeHost* layer_tree_host) { | 737 const LayerTreeHost* layer_tree_host) { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 void ComputeEffects(EffectTree* effect_tree) { | 861 void ComputeEffects(EffectTree* effect_tree) { |
871 if (!effect_tree->needs_update()) | 862 if (!effect_tree->needs_update()) |
872 return; | 863 return; |
873 for (int i = EffectTree::kContentsRootNodeId; | 864 for (int i = EffectTree::kContentsRootNodeId; |
874 i < static_cast<int>(effect_tree->size()); ++i) | 865 i < static_cast<int>(effect_tree->size()); ++i) |
875 effect_tree->UpdateEffects(i); | 866 effect_tree->UpdateEffects(i); |
876 effect_tree->set_needs_update(false); | 867 effect_tree->set_needs_update(false); |
877 } | 868 } |
878 | 869 |
879 void UpdatePropertyTrees(LayerTreeHost* layer_tree_host, | 870 void UpdatePropertyTrees(LayerTreeHost* layer_tree_host, |
880 PropertyTrees* property_trees, | 871 PropertyTrees* property_trees) { |
881 bool can_render_to_separate_surface) { | |
882 DCHECK(layer_tree_host); | 872 DCHECK(layer_tree_host); |
883 DCHECK(property_trees); | 873 DCHECK(property_trees); |
884 DCHECK_EQ(layer_tree_host->property_trees(), property_trees); | 874 DCHECK_EQ(layer_tree_host->property_trees(), property_trees); |
885 if (property_trees->non_root_surfaces_enabled != | |
886 can_render_to_separate_surface) { | |
887 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | |
888 property_trees->transform_tree.set_needs_update(true); | |
889 } | |
890 if (property_trees->transform_tree.needs_update()) { | 875 if (property_trees->transform_tree.needs_update()) { |
891 property_trees->clip_tree.set_needs_update(true); | 876 property_trees->clip_tree.set_needs_update(true); |
892 property_trees->effect_tree.set_needs_update(true); | 877 property_trees->effect_tree.set_needs_update(true); |
893 } | 878 } |
894 UpdateScrollTree(&property_trees->scroll_tree, layer_tree_host); | 879 UpdateScrollTree(&property_trees->scroll_tree, layer_tree_host); |
895 ComputeTransforms(&property_trees->transform_tree); | 880 ComputeTransforms(&property_trees->transform_tree); |
896 ComputeEffects(&property_trees->effect_tree); | 881 ComputeEffects(&property_trees->effect_tree); |
897 // Computation of clips uses ToScreen which is updated while computing | 882 // Computation of clips uses ToScreen which is updated while computing |
898 // transforms. So, ComputeTransforms should be before ComputeClips. | 883 // transforms. So, ComputeTransforms should be before ComputeClips. |
899 ComputeClips(property_trees); | 884 ComputeClips(property_trees); |
900 } | 885 } |
901 | 886 |
902 void UpdatePropertyTreesAndRenderSurfaces(LayerImpl* root_layer, | 887 void UpdatePropertyTreesAndRenderSurfaces(LayerImpl* root_layer, |
903 PropertyTrees* property_trees, | 888 PropertyTrees* property_trees, |
904 bool can_render_to_separate_surface, | |
905 bool can_adjust_raster_scales) { | 889 bool can_adjust_raster_scales) { |
906 bool render_surfaces_need_update = false; | 890 bool render_surfaces_need_update = false; |
907 if (property_trees->non_root_surfaces_enabled != | |
908 can_render_to_separate_surface) { | |
909 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | |
910 property_trees->transform_tree.set_needs_update(true); | |
911 render_surfaces_need_update = true; | |
912 } | |
913 if (property_trees->can_adjust_raster_scales != can_adjust_raster_scales) { | 891 if (property_trees->can_adjust_raster_scales != can_adjust_raster_scales) { |
914 property_trees->can_adjust_raster_scales = can_adjust_raster_scales; | 892 property_trees->can_adjust_raster_scales = can_adjust_raster_scales; |
915 property_trees->transform_tree.set_needs_update(true); | 893 property_trees->transform_tree.set_needs_update(true); |
916 render_surfaces_need_update = true; | 894 render_surfaces_need_update = true; |
917 } | 895 } |
918 if (property_trees->transform_tree.needs_update()) { | 896 if (property_trees->transform_tree.needs_update()) { |
919 property_trees->clip_tree.set_needs_update(true); | 897 property_trees->clip_tree.set_needs_update(true); |
920 property_trees->effect_tree.set_needs_update(true); | 898 property_trees->effect_tree.set_needs_update(true); |
921 } | 899 } |
922 if (render_surfaces_need_update) { | 900 if (render_surfaces_need_update) { |
923 property_trees->effect_tree.UpdateRenderSurfaces( | 901 property_trees->effect_tree.UpdateRenderSurfaces( |
924 root_layer->layer_tree_impl(), | 902 root_layer->layer_tree_impl()); |
925 property_trees->non_root_surfaces_enabled); | |
926 } | 903 } |
927 UpdateRenderTarget(&property_trees->effect_tree, | 904 UpdateRenderTarget(&property_trees->effect_tree); |
928 property_trees->non_root_surfaces_enabled); | |
929 | 905 |
930 ComputeTransforms(&property_trees->transform_tree); | 906 ComputeTransforms(&property_trees->transform_tree); |
931 ComputeEffects(&property_trees->effect_tree); | 907 ComputeEffects(&property_trees->effect_tree); |
932 // Computation of clips uses ToScreen which is updated while computing | 908 // Computation of clips uses ToScreen which is updated while computing |
933 // transforms. So, ComputeTransforms should be before ComputeClips. | 909 // transforms. So, ComputeTransforms should be before ComputeClips. |
934 ComputeClips(property_trees); | 910 ComputeClips(property_trees); |
935 } | 911 } |
936 | 912 |
937 bool LayerNeedsUpdate(Layer* layer, | 913 bool LayerNeedsUpdate(Layer* layer, |
938 bool layer_is_drawn, | 914 bool layer_is_drawn, |
939 const PropertyTrees* property_trees) { | 915 const PropertyTrees* property_trees) { |
940 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); | 916 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); |
941 } | 917 } |
942 | 918 |
943 bool LayerNeedsUpdate(LayerImpl* layer, | 919 bool LayerNeedsUpdate(LayerImpl* layer, |
944 bool layer_is_drawn, | 920 bool layer_is_drawn, |
945 const PropertyTrees* property_trees) { | 921 const PropertyTrees* property_trees) { |
946 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); | 922 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); |
947 } | 923 } |
948 | 924 |
949 gfx::Transform DrawTransform(const LayerImpl* layer, | 925 gfx::Transform DrawTransform(const LayerImpl* layer, |
950 const TransformTree& transform_tree, | 926 const TransformTree& transform_tree, |
951 const EffectTree& effect_tree) { | 927 const EffectTree& effect_tree) { |
952 // TransformTree::ToTarget computes transform between the layer's transform | 928 // TransformTree::ToTarget computes transform between the layer's transform |
953 // node and surface's transform node and scales it by the surface's content | 929 // node and surface's transform node and scales it by the surface's content |
954 // scale. | 930 // scale. |
955 gfx::Transform xform; | 931 gfx::Transform xform; |
956 if (transform_tree.property_trees()->non_root_surfaces_enabled) | 932 transform_tree.property_trees()->GetToTarget( |
957 transform_tree.property_trees()->GetToTarget( | 933 layer->transform_tree_index(), layer->render_target_effect_tree_index(), |
958 layer->transform_tree_index(), layer->render_target_effect_tree_index(), | 934 &xform); |
959 &xform); | |
960 else | |
961 xform = transform_tree.ToScreen(layer->transform_tree_index()); | |
962 if (layer->should_flatten_transform_from_property_tree()) | 935 if (layer->should_flatten_transform_from_property_tree()) |
963 xform.FlattenTo2d(); | 936 xform.FlattenTo2d(); |
964 xform.Translate(layer->offset_to_transform_parent().x(), | 937 xform.Translate(layer->offset_to_transform_parent().x(), |
965 layer->offset_to_transform_parent().y()); | 938 layer->offset_to_transform_parent().y()); |
966 return xform; | 939 return xform; |
967 } | 940 } |
968 | 941 |
969 gfx::Transform ScreenSpaceTransform(const Layer* layer, | 942 gfx::Transform ScreenSpaceTransform(const Layer* layer, |
970 const TransformTree& tree) { | 943 const TransformTree& tree) { |
971 return ScreenSpaceTransformInternal(layer, tree); | 944 return ScreenSpaceTransformInternal(layer, tree); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1090 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1063 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
1091 const Layer* overscroll_elasticity_layer, | 1064 const Layer* overscroll_elasticity_layer, |
1092 const gfx::Vector2dF& elastic_overscroll) { | 1065 const gfx::Vector2dF& elastic_overscroll) { |
1093 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1066 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
1094 elastic_overscroll); | 1067 elastic_overscroll); |
1095 } | 1068 } |
1096 | 1069 |
1097 } // namespace draw_property_utils | 1070 } // namespace draw_property_utils |
1098 | 1071 |
1099 } // namespace cc | 1072 } // namespace cc |
OLD | NEW |