OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/layer_tree_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); | 953 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); |
954 } | 954 } |
955 | 955 |
956 void LayerTreeImpl::SetElementIdsForTesting() { | 956 void LayerTreeImpl::SetElementIdsForTesting() { |
957 LayerListIterator<LayerImpl> it(root_layer_for_testing_); | 957 LayerListIterator<LayerImpl> it(root_layer_for_testing_); |
958 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { | 958 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { |
959 SetElementIdForTesting(*it); | 959 SetElementIdForTesting(*it); |
960 } | 960 } |
961 } | 961 } |
962 | 962 |
963 bool LayerTreeImpl::UpdateDrawProperties( | 963 bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { |
964 bool update_lcd_text, | |
965 bool force_skip_verify_visible_rect_calculations) { | |
966 if (!needs_update_draw_properties_) | 964 if (!needs_update_draw_properties_) |
967 return true; | 965 return true; |
968 | 966 |
969 // Calling UpdateDrawProperties must clear this flag, so there can be no | 967 // Calling UpdateDrawProperties must clear this flag, so there can be no |
970 // early outs before this. | 968 // early outs before this. |
971 needs_update_draw_properties_ = false; | 969 needs_update_draw_properties_ = false; |
972 | 970 |
973 // For max_texture_size. When a new output surface is received the needs | 971 // For max_texture_size. When a new output surface is received the needs |
974 // update draw properties flag is set again. | 972 // update draw properties flag is set again. |
975 if (!layer_tree_host_impl_->compositor_frame_sink()) | 973 if (!layer_tree_host_impl_->compositor_frame_sink()) |
(...skipping 10 matching lines...) Expand all Loading... |
986 base::ElapsedTimer timer; | 984 base::ElapsedTimer timer; |
987 TRACE_EVENT2( | 985 TRACE_EVENT2( |
988 "cc", "LayerTreeImpl::UpdateDrawProperties::CalculateDrawProperties", | 986 "cc", "LayerTreeImpl::UpdateDrawProperties::CalculateDrawProperties", |
989 "IsActive", IsActiveTree(), "SourceFrameNumber", source_frame_number_); | 987 "IsActive", IsActiveTree(), "SourceFrameNumber", source_frame_number_); |
990 bool can_render_to_separate_surface = | 988 bool can_render_to_separate_surface = |
991 (!is_in_resourceless_software_draw_mode()); | 989 (!is_in_resourceless_software_draw_mode()); |
992 | 990 |
993 // We verify visible rect calculations whenever we verify clip tree | 991 // We verify visible rect calculations whenever we verify clip tree |
994 // calculations except when this function is explicitly passed a flag asking | 992 // calculations except when this function is explicitly passed a flag asking |
995 // us to skip it. | 993 // us to skip it. |
996 bool verify_visible_rect_calculations = | |
997 force_skip_verify_visible_rect_calculations | |
998 ? false | |
999 : settings().verify_clip_tree_calculations; | |
1000 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( | 994 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( |
1001 layer_list_[0], DrawViewportSize(), | 995 layer_list_[0], DrawViewportSize(), |
1002 layer_tree_host_impl_->DrawTransform(), device_scale_factor(), | 996 layer_tree_host_impl_->DrawTransform(), device_scale_factor(), |
1003 current_page_scale_factor(), PageScaleLayer(), | 997 current_page_scale_factor(), PageScaleLayer(), |
1004 InnerViewportScrollLayer(), OuterViewportScrollLayer(), | 998 InnerViewportScrollLayer(), OuterViewportScrollLayer(), |
1005 elastic_overscroll()->Current(IsActiveTree()), | 999 elastic_overscroll()->Current(IsActiveTree()), |
1006 OverscrollElasticityLayer(), resource_provider()->max_texture_size(), | 1000 OverscrollElasticityLayer(), resource_provider()->max_texture_size(), |
1007 can_render_to_separate_surface, | 1001 can_render_to_separate_surface, |
1008 settings().layer_transforms_should_scale_layer_contents, | 1002 settings().layer_transforms_should_scale_layer_contents, |
1009 settings().verify_clip_tree_calculations, | |
1010 verify_visible_rect_calculations, | |
1011 &render_surface_layer_list_, &property_trees_); | 1003 &render_surface_layer_list_, &property_trees_); |
1012 LayerTreeHostCommon::CalculateDrawProperties(&inputs); | 1004 LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
1013 if (const char* client_name = GetClientNameForMetrics()) { | 1005 if (const char* client_name = GetClientNameForMetrics()) { |
1014 UMA_HISTOGRAM_COUNTS( | 1006 UMA_HISTOGRAM_COUNTS( |
1015 base::StringPrintf( | 1007 base::StringPrintf( |
1016 "Compositing.%s.LayerTreeImpl.CalculateDrawPropertiesUs", | 1008 "Compositing.%s.LayerTreeImpl.CalculateDrawPropertiesUs", |
1017 client_name), | 1009 client_name), |
1018 timer.Elapsed().InMicroseconds()); | 1010 timer.Elapsed().InMicroseconds()); |
1019 UMA_HISTOGRAM_COUNTS_100( | 1011 UMA_HISTOGRAM_COUNTS_100( |
1020 base::StringPrintf("Compositing.%s.NumRenderSurfaces", client_name), | 1012 base::StringPrintf("Compositing.%s.NumRenderSurfaces", client_name), |
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1781 const gfx::PointF& screen_space_point, | 1773 const gfx::PointF& screen_space_point, |
1782 const LayerImpl* layer) { | 1774 const LayerImpl* layer) { |
1783 // We need to visit all ancestor clip nodes to check this. Checking with just | 1775 // We need to visit all ancestor clip nodes to check this. Checking with just |
1784 // the combined clip stored at a clip node is not enough because parent | 1776 // the combined clip stored at a clip node is not enough because parent |
1785 // combined clip can sometimes be smaller than current combined clip. This can | 1777 // combined clip can sometimes be smaller than current combined clip. This can |
1786 // happen when we have transforms like rotation that inflate the combined | 1778 // happen when we have transforms like rotation that inflate the combined |
1787 // clip's bounds. Also, the point can be clipped by the content rect of an | 1779 // clip's bounds. Also, the point can be clipped by the content rect of an |
1788 // ancestor render surface. | 1780 // ancestor render surface. |
1789 | 1781 |
1790 // We first check if the point is clipped by viewport. | 1782 // We first check if the point is clipped by viewport. |
1791 const PropertyTrees* property_trees = | 1783 PropertyTrees* property_trees = layer->layer_tree_impl()->property_trees(); |
1792 layer->layer_tree_impl()->property_trees(); | |
1793 const ClipTree& clip_tree = property_trees->clip_tree; | 1784 const ClipTree& clip_tree = property_trees->clip_tree; |
1794 const TransformTree& transform_tree = property_trees->transform_tree; | 1785 const TransformTree& transform_tree = property_trees->transform_tree; |
1795 const ClipNode* clip_node = clip_tree.Node(1); | 1786 const ClipNode* clip_node = clip_tree.Node(1); |
1796 gfx::Rect combined_clip_in_target_space = | 1787 gfx::Rect clip = gfx::ToEnclosingRect(clip_node->clip); |
1797 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); | 1788 if (!PointHitsRect(screen_space_point, gfx::Transform(), clip, NULL)) |
1798 if (!PointHitsRect(screen_space_point, gfx::Transform(), | |
1799 combined_clip_in_target_space, NULL)) | |
1800 return true; | 1789 return true; |
1801 | 1790 |
1802 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); | 1791 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); |
1803 clip_node->id > ClipTree::kViewportNodeId; | 1792 clip_node->id > ClipTree::kViewportNodeId; |
1804 clip_node = clip_tree.parent(clip_node)) { | 1793 clip_node = clip_tree.parent(clip_node)) { |
1805 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { | 1794 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { |
1806 const TransformNode* transform_node = | 1795 gfx::Rect clip = gfx::ToEnclosingRect(clip_node->clip); |
1807 transform_tree.Node(clip_node->target_transform_id); | |
1808 gfx::Rect combined_clip_in_target_space = | |
1809 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); | |
1810 | 1796 |
1811 const LayerImpl* target_layer = | 1797 gfx::Transform screen_space_transform = |
1812 layer->layer_tree_impl()->LayerById(transform_node->owning_layer_id); | 1798 transform_tree.ToScreen(clip_node->transform_id); |
1813 DCHECK(transform_node->id == TransformTree::kRootNodeId || | 1799 if (!PointHitsRect(screen_space_point, screen_space_transform, clip, |
1814 target_layer->render_surface() || | 1800 NULL)) { |
1815 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); | |
1816 gfx::Transform surface_screen_space_transform = | |
1817 transform_node->id == TransformTree::kRootNodeId || | |
1818 (layer->layer_tree_impl() | |
1819 ->is_in_resourceless_software_draw_mode()) | |
1820 ? gfx::Transform() | |
1821 : SurfaceScreenSpaceTransform(target_layer); | |
1822 if (!PointHitsRect(screen_space_point, surface_screen_space_transform, | |
1823 combined_clip_in_target_space, NULL)) { | |
1824 return true; | 1801 return true; |
1825 } | 1802 } |
1826 } | 1803 } |
1827 const LayerImpl* clip_node_owner = | 1804 const LayerImpl* clip_node_owner = |
1828 layer->layer_tree_impl()->LayerById(clip_node->owning_layer_id); | 1805 layer->layer_tree_impl()->LayerById(clip_node->owning_layer_id); |
1829 if (clip_node_owner->render_surface() && | 1806 if (clip_node_owner->render_surface() && |
1830 !PointHitsRect( | 1807 !PointHitsRect( |
1831 screen_space_point, SurfaceScreenSpaceTransform(clip_node_owner), | 1808 screen_space_point, SurfaceScreenSpaceTransform(clip_node_owner), |
1832 clip_node_owner->render_surface()->content_rect(), NULL)) { | 1809 clip_node_owner->render_surface()->content_rect(), NULL)) { |
1833 return true; | 1810 return true; |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 | 2079 |
2103 void LayerTreeImpl::ResetAllChangeTracking() { | 2080 void LayerTreeImpl::ResetAllChangeTracking() { |
2104 layers_that_should_push_properties_.clear(); | 2081 layers_that_should_push_properties_.clear(); |
2105 // Iterate over all layers, including masks. | 2082 // Iterate over all layers, including masks. |
2106 for (auto& layer : *layers_) | 2083 for (auto& layer : *layers_) |
2107 layer->ResetChangeTracking(); | 2084 layer->ResetChangeTracking(); |
2108 property_trees_.ResetAllChangeTracking(); | 2085 property_trees_.ResetAllChangeTracking(); |
2109 } | 2086 } |
2110 | 2087 |
2111 } // namespace cc | 2088 } // namespace cc |
OLD | NEW |