Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(207)

Side by Side Diff: cc/trees/layer_tree_host_common_unittest.cc

Issue 2655233006: cc : Clean up cc clip tree (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common_perftest.cc ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_host_common.h" 5 #include "cc/trees/layer_tree_host_common.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 #include "ui/gfx/geometry/quad_f.h" 55 #include "ui/gfx/geometry/quad_f.h"
56 #include "ui/gfx/geometry/vector2d_conversions.h" 56 #include "ui/gfx/geometry/vector2d_conversions.h"
57 #include "ui/gfx/transform.h" 57 #include "ui/gfx/transform.h"
58 58
59 namespace cc { 59 namespace cc {
60 namespace { 60 namespace {
61 61
62 class VerifyTreeCalcsLayerTreeSettings : public LayerTreeSettings { 62 class VerifyTreeCalcsLayerTreeSettings : public LayerTreeSettings {
63 public: 63 public:
64 VerifyTreeCalcsLayerTreeSettings() { 64 VerifyTreeCalcsLayerTreeSettings() {
65 verify_clip_tree_calculations = true;
66 } 65 }
67 }; 66 };
68 67
69 class LayerTreeHostCommonTestBase : public LayerTestCommon::LayerImplTest { 68 class LayerTreeHostCommonTestBase : public LayerTestCommon::LayerImplTest {
70 public: 69 public:
71 LayerTreeHostCommonTestBase() 70 LayerTreeHostCommonTestBase()
72 : LayerTestCommon::LayerImplTest(VerifyTreeCalcsLayerTreeSettings()) {} 71 : LayerTestCommon::LayerImplTest(VerifyTreeCalcsLayerTreeSettings()) {}
73 explicit LayerTreeHostCommonTestBase(const LayerTreeSettings& settings) 72 explicit LayerTreeHostCommonTestBase(const LayerTreeSettings& settings)
74 : LayerTestCommon::LayerImplTest(settings) {} 73 : LayerTestCommon::LayerImplTest(settings) {}
75 74
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( 116 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
118 root_layer, device_viewport_size); 117 root_layer, device_viewport_size);
119 inputs.device_scale_factor = device_scale_factor; 118 inputs.device_scale_factor = device_scale_factor;
120 inputs.page_scale_factor = page_scale_factor; 119 inputs.page_scale_factor = page_scale_factor;
121 inputs.page_scale_layer = page_scale_layer; 120 inputs.page_scale_layer = page_scale_layer;
122 inputs.inner_viewport_scroll_layer = inner_viewport_scroll_layer; 121 inputs.inner_viewport_scroll_layer = inner_viewport_scroll_layer;
123 inputs.outer_viewport_scroll_layer = outer_viewport_scroll_layer; 122 inputs.outer_viewport_scroll_layer = outer_viewport_scroll_layer;
124 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs); 123 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
125 } 124 }
126 125
127 void ExecuteCalculateDrawProperties( 126 void ExecuteCalculateDrawProperties(LayerImpl* root_layer,
128 LayerImpl* root_layer, 127 float device_scale_factor,
129 float device_scale_factor, 128 float page_scale_factor,
130 float page_scale_factor, 129 LayerImpl* page_scale_layer,
131 LayerImpl* page_scale_layer, 130 LayerImpl* inner_viewport_scroll_layer,
132 LayerImpl* inner_viewport_scroll_layer, 131 LayerImpl* outer_viewport_scroll_layer) {
133 LayerImpl* outer_viewport_scroll_layer,
134 bool skip_verify_visible_rect_calculations = false) {
135 if (device_scale_factor != 132 if (device_scale_factor !=
136 root_layer->layer_tree_impl()->device_scale_factor()) 133 root_layer->layer_tree_impl()->device_scale_factor())
137 root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true; 134 root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true;
138 135
139 root_layer->layer_tree_impl()->SetDeviceScaleFactor(device_scale_factor); 136 root_layer->layer_tree_impl()->SetDeviceScaleFactor(device_scale_factor);
140 137
141 EXPECT_TRUE(page_scale_layer || (page_scale_factor == 1.f)); 138 EXPECT_TRUE(page_scale_layer || (page_scale_factor == 1.f));
142 139
143 gfx::Size device_viewport_size = 140 gfx::Size device_viewport_size =
144 gfx::Size(root_layer->bounds().width() * device_scale_factor, 141 gfx::Size(root_layer->bounds().width() * device_scale_factor,
145 root_layer->bounds().height() * device_scale_factor); 142 root_layer->bounds().height() * device_scale_factor);
146 143
147 render_surface_layer_list_impl_.reset(new LayerImplList); 144 render_surface_layer_list_impl_.reset(new LayerImplList);
148 145
149 // We are probably not testing what is intended if the root_layer bounds are 146 // We are probably not testing what is intended if the root_layer bounds are
150 // empty. 147 // empty.
151 DCHECK(!root_layer->bounds().IsEmpty()); 148 DCHECK(!root_layer->bounds().IsEmpty());
152 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( 149 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
153 root_layer, device_viewport_size, 150 root_layer, device_viewport_size,
154 render_surface_layer_list_impl_.get()); 151 render_surface_layer_list_impl_.get());
155 inputs.device_scale_factor = device_scale_factor; 152 inputs.device_scale_factor = device_scale_factor;
156 inputs.page_scale_factor = page_scale_factor; 153 inputs.page_scale_factor = page_scale_factor;
157 inputs.page_scale_layer = page_scale_layer; 154 inputs.page_scale_layer = page_scale_layer;
158 inputs.inner_viewport_scroll_layer = inner_viewport_scroll_layer; 155 inputs.inner_viewport_scroll_layer = inner_viewport_scroll_layer;
159 inputs.outer_viewport_scroll_layer = outer_viewport_scroll_layer; 156 inputs.outer_viewport_scroll_layer = outer_viewport_scroll_layer;
160 inputs.can_adjust_raster_scales = true; 157 inputs.can_adjust_raster_scales = true;
161 if (skip_verify_visible_rect_calculations)
162 inputs.verify_visible_rect_calculations = false;
163 158
164 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs); 159 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
165 } 160 }
166 161
167 template <class LayerType> 162 template <class LayerType>
168 void ExecuteCalculateDrawProperties(LayerType* root_layer) { 163 void ExecuteCalculateDrawProperties(LayerType* root_layer) {
169 LayerType* page_scale_application_layer = nullptr; 164 LayerType* page_scale_application_layer = nullptr;
170 LayerType* inner_viewport_scroll_layer = nullptr; 165 LayerType* inner_viewport_scroll_layer = nullptr;
171 LayerType* outer_viewport_scroll_layer = nullptr; 166 LayerType* outer_viewport_scroll_layer = nullptr;
172 ExecuteCalculateDrawProperties( 167 ExecuteCalculateDrawProperties(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 elastic_overscroll, page_scale_factor, device_scale_factor, 212 elastic_overscroll, page_scale_factor, device_scale_factor,
218 gfx::Rect(device_viewport_size), gfx::Transform(), property_trees); 213 gfx::Rect(device_viewport_size), gfx::Transform(), property_trees);
219 draw_property_utils::UpdatePropertyTrees(root_layer->layer_tree_host(), 214 draw_property_utils::UpdatePropertyTrees(root_layer->layer_tree_host(),
220 property_trees, 215 property_trees,
221 can_render_to_separate_surface); 216 can_render_to_separate_surface);
222 draw_property_utils::FindLayersThatNeedUpdates( 217 draw_property_utils::FindLayersThatNeedUpdates(
223 root_layer->layer_tree_host(), property_trees, &update_layer_list_); 218 root_layer->layer_tree_host(), property_trees, &update_layer_list_);
224 } 219 }
225 220
226 void ExecuteCalculateDrawPropertiesAndSaveUpdateLayerList( 221 void ExecuteCalculateDrawPropertiesAndSaveUpdateLayerList(
227 LayerImpl* root_layer, 222 LayerImpl* root_layer) {
228 bool skip_verify_visible_rect_calculations = false) {
229 DCHECK(root_layer->layer_tree_impl()); 223 DCHECK(root_layer->layer_tree_impl());
230 PropertyTreeBuilder::PreCalculateMetaInformationForTesting(root_layer); 224 PropertyTreeBuilder::PreCalculateMetaInformationForTesting(root_layer);
231 225
232 bool can_render_to_separate_surface = true; 226 bool can_render_to_separate_surface = true;
233 227
234 LayerImpl* page_scale_layer = nullptr; 228 const LayerImpl* page_scale_layer = nullptr;
235 LayerImpl* inner_viewport_scroll_layer = 229 LayerImpl* inner_viewport_scroll_layer =
236 root_layer->layer_tree_impl()->InnerViewportScrollLayer(); 230 root_layer->layer_tree_impl()->InnerViewportScrollLayer();
237 LayerImpl* outer_viewport_scroll_layer = 231 LayerImpl* outer_viewport_scroll_layer =
238 root_layer->layer_tree_impl()->OuterViewportScrollLayer(); 232 root_layer->layer_tree_impl()->OuterViewportScrollLayer();
239 LayerImpl* overscroll_elasticity_layer = 233 const LayerImpl* overscroll_elasticity_layer =
240 root_layer->layer_tree_impl()->OverscrollElasticityLayer(); 234 root_layer->layer_tree_impl()->OverscrollElasticityLayer();
241 gfx::Vector2dF elastic_overscroll = 235 gfx::Vector2dF elastic_overscroll =
242 root_layer->layer_tree_impl()->elastic_overscroll()->Current( 236 root_layer->layer_tree_impl()->elastic_overscroll()->Current(
243 root_layer->layer_tree_impl()->IsActiveTree()); 237 root_layer->layer_tree_impl()->IsActiveTree());
244 float page_scale_factor = 1.f; 238 float page_scale_factor = 1.f;
245 float device_scale_factor = 1.f; 239 float device_scale_factor = 1.f;
246 gfx::Size device_viewport_size = 240 gfx::Size device_viewport_size =
247 gfx::Size(root_layer->bounds().width() * device_scale_factor, 241 gfx::Size(root_layer->bounds().width() * device_scale_factor,
248 root_layer->bounds().height() * device_scale_factor); 242 root_layer->bounds().height() * device_scale_factor);
249 update_layer_list_impl_.reset(new LayerImplList); 243 update_layer_list_impl_.reset(new LayerImplList);
250 root_layer->layer_tree_impl()->BuildLayerListForTesting(); 244 root_layer->layer_tree_impl()->BuildLayerListForTesting();
251 PropertyTrees* property_trees = 245 PropertyTrees* property_trees =
252 root_layer->layer_tree_impl()->property_trees(); 246 root_layer->layer_tree_impl()->property_trees();
253 draw_property_utils::BuildPropertyTreesAndComputeVisibleRects( 247 PropertyTreeBuilder::BuildPropertyTrees(
254 root_layer, page_scale_layer, inner_viewport_scroll_layer, 248 root_layer, page_scale_layer, inner_viewport_scroll_layer,
255 outer_viewport_scroll_layer, overscroll_elasticity_layer, 249 outer_viewport_scroll_layer, overscroll_elasticity_layer,
256 elastic_overscroll, page_scale_factor, device_scale_factor, 250 elastic_overscroll, page_scale_factor, device_scale_factor,
257 gfx::Rect(device_viewport_size), gfx::Transform(), 251 gfx::Rect(device_viewport_size), gfx::Transform(), property_trees);
258 can_render_to_separate_surface, property_trees, 252 draw_property_utils::UpdatePropertyTreesAndRenderSurfaces(
253 root_layer, property_trees, can_render_to_separate_surface);
254 draw_property_utils::FindLayersThatNeedUpdates(
255 root_layer->layer_tree_impl(), property_trees,
259 update_layer_list_impl_.get()); 256 update_layer_list_impl_.get());
260 draw_property_utils::VerifyClipTreeCalculations(*update_layer_list_impl_, 257 draw_property_utils::ComputeDrawPropertiesOfVisibleLayers(
261 property_trees); 258 update_layer_list_impl(), property_trees);
262 if (!skip_verify_visible_rect_calculations)
263 draw_property_utils::VerifyVisibleRectsCalculations(
264 *update_layer_list_impl_, property_trees);
265 } 259 }
266 260
267 void ExecuteCalculateDrawPropertiesWithoutSeparateSurfaces( 261 void ExecuteCalculateDrawPropertiesWithoutSeparateSurfaces(
268 LayerImpl* root_layer) { 262 LayerImpl* root_layer) {
269 gfx::Size device_viewport_size = 263 gfx::Size device_viewport_size =
270 gfx::Size(root_layer->bounds().width(), root_layer->bounds().height()); 264 gfx::Size(root_layer->bounds().width(), root_layer->bounds().height());
271 render_surface_layer_list_impl_.reset(new LayerImplList); 265 render_surface_layer_list_impl_.reset(new LayerImplList);
272 266
273 DCHECK(!root_layer->bounds().IsEmpty()); 267 DCHECK(!root_layer->bounds().IsEmpty());
274 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( 268 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
1119 child->SetBounds(gfx::Size(10, 10)); 1113 child->SetBounds(gfx::Size(10, 10));
1120 grand_child->test_properties()->transform = grand_child_transform; 1114 grand_child->test_properties()->transform = grand_child_transform;
1121 grand_child->SetBounds(gfx::Size(100, 100)); 1115 grand_child->SetBounds(gfx::Size(100, 100));
1122 grand_child->test_properties()->should_flatten_transform = false; 1116 grand_child->test_properties()->should_flatten_transform = false;
1123 grand_child->SetDrawsContent(true); 1117 grand_child->SetDrawsContent(true);
1124 float device_scale_factor = 1.f; 1118 float device_scale_factor = 1.f;
1125 float page_scale_factor = 1.f; 1119 float page_scale_factor = 1.f;
1126 LayerImpl* page_scale_layer = nullptr; 1120 LayerImpl* page_scale_layer = nullptr;
1127 LayerImpl* inner_viewport_scroll_layer = nullptr; 1121 LayerImpl* inner_viewport_scroll_layer = nullptr;
1128 LayerImpl* outer_viewport_scroll_layer = nullptr; 1122 LayerImpl* outer_viewport_scroll_layer = nullptr;
1129 // Visible rects computed by combining clips in target space and root space
1130 // don't match because of rotation transforms. So, we skip
1131 // verify_visible_rect_calculations.
1132 bool skip_verify_visible_rect_calculations = true;
1133 ExecuteCalculateDrawProperties(root, device_scale_factor, page_scale_factor, 1123 ExecuteCalculateDrawProperties(root, device_scale_factor, page_scale_factor,
1134 page_scale_layer, inner_viewport_scroll_layer, 1124 page_scale_layer, inner_viewport_scroll_layer,
1135 outer_viewport_scroll_layer, 1125 outer_viewport_scroll_layer);
1136 skip_verify_visible_rect_calculations);
1137 1126
1138 // Mapping grand_child's bounds to target space produces a non-empty rect 1127 // Mapping grand_child's bounds to screen space produces an empty rect so
1139 // that is fully contained within the target's bounds, so grand_child should 1128 // grand_child should be hidden.
1140 // be considered fully visible. 1129 EXPECT_EQ(gfx::Rect(), grand_child->visible_layer_rect());
1141 EXPECT_EQ(gfx::Rect(grand_child->bounds()),
1142 grand_child->visible_layer_rect());
1143 } 1130 }
1144 1131
1145 TEST_F(LayerTreeHostCommonTest, TransformsForDegenerateIntermediateLayer) { 1132 TEST_F(LayerTreeHostCommonTest, TransformsForDegenerateIntermediateLayer) {
1146 // A layer that is empty in one axis, but not the other, was accidentally 1133 // A layer that is empty in one axis, but not the other, was accidentally
1147 // skipping a necessary translation. Without that translation, the coordinate 1134 // skipping a necessary translation. Without that translation, the coordinate
1148 // space of the layer's draw transform is incorrect. 1135 // space of the layer's draw transform is incorrect.
1149 // 1136 //
1150 // Normally this isn't a problem, because the layer wouldn't be drawn anyway, 1137 // Normally this isn't a problem, because the layer wouldn't be drawn anyway,
1151 // but if that layer becomes a render surface, then its draw transform is 1138 // but if that layer becomes a render surface, then its draw transform is
1152 // implicitly inherited by the rest of the subtree, which then is positioned 1139 // implicitly inherited by the rest of the subtree, which then is positioned
(...skipping 2826 matching lines...) Expand 10 before | Expand all | Expand 10 after
3979 render_surface2->test_properties()->force_render_surface = true; 3966 render_surface2->test_properties()->force_render_surface = true;
3980 render_surface2->SetDrawsContent(true); 3967 render_surface2->SetDrawsContent(true);
3981 3968
3982 child1->SetMasksToBounds(true); 3969 child1->SetMasksToBounds(true);
3983 child2->SetMasksToBounds(true); 3970 child2->SetMasksToBounds(true);
3984 ExecuteCalculateDrawProperties(root); 3971 ExecuteCalculateDrawProperties(root);
3985 EXPECT_EQ(gfx::Rect(100, 100), child1->visible_layer_rect()); 3972 EXPECT_EQ(gfx::Rect(100, 100), child1->visible_layer_rect());
3986 EXPECT_EQ(gfx::Rect(100, 100), render_surface2->visible_layer_rect()); 3973 EXPECT_EQ(gfx::Rect(100, 100), render_surface2->visible_layer_rect());
3987 } 3974 }
3988 3975
3976 TEST_F(LayerTreeHostCommonTest, VisibleRectOfUnclippedRenderSurface) {
3977 LayerImpl* root = root_layer_for_testing();
3978 LayerImpl* clip = AddChildToRoot<LayerImpl>();
3979 LayerImpl* render_surface1 = AddChild<LayerImpl>(clip);
3980 LayerImpl* render_surface2 = AddChild<LayerImpl>(render_surface1);
3981
3982 root->SetBounds(gfx::Size(100, 100));
3983 clip->SetBounds(gfx::Size(50, 50));
3984 clip->SetMasksToBounds(true);
3985 render_surface1->SetBounds(gfx::Size(100, 100));
3986 render_surface1->test_properties()->force_render_surface = true;
3987 render_surface2->SetBounds(gfx::Size(100, 100));
3988 render_surface2->test_properties()->force_render_surface = true;
3989 render_surface2->SetDrawsContent(true);
3990
3991 ExecuteCalculateDrawProperties(root);
3992 // The clip should be handled by render_surface1 and render_surface2 should
3993 // be unclipped and its visible rect should be clipped only by viewport clip.
3994 EXPECT_FALSE(render_surface2->is_clipped());
3995 EXPECT_EQ(gfx::Rect(100, 100), render_surface2->visible_layer_rect());
3996 }
3997
3989 TEST_F(LayerTreeHostCommonTest, 3998 TEST_F(LayerTreeHostCommonTest,
3990 VisibleRectsWhenClipChildIsBetweenTwoRenderSurfaces) { 3999 VisibleRectsWhenClipChildIsBetweenTwoRenderSurfaces) {
3991 LayerImpl* root = root_layer_for_testing(); 4000 LayerImpl* root = root_layer_for_testing();
3992 LayerImpl* clip_parent = AddChildToRoot<LayerImpl>(); 4001 LayerImpl* clip_parent = AddChildToRoot<LayerImpl>();
3993 LayerImpl* render_surface1 = AddChild<LayerImpl>(clip_parent); 4002 LayerImpl* render_surface1 = AddChild<LayerImpl>(clip_parent);
3994 LayerImpl* clip_child = AddChild<LayerImpl>(render_surface1); 4003 LayerImpl* clip_child = AddChild<LayerImpl>(render_surface1);
3995 LayerImpl* render_surface2 = AddChild<LayerImpl>(clip_child); 4004 LayerImpl* render_surface2 = AddChild<LayerImpl>(clip_child);
3996 4005
3997 root->SetBounds(gfx::Size(100, 100)); 4006 root->SetBounds(gfx::Size(100, 100));
3998 4007
(...skipping 2496 matching lines...) Expand 10 before | Expand all | Expand 10 after
6495 6504
6496 EXPECT_EQ(scroll_child->effect_tree_index(), 6505 EXPECT_EQ(scroll_child->effect_tree_index(),
6497 scroll_child_target->effect_tree_index()); 6506 scroll_child_target->effect_tree_index());
6498 EXPECT_EQ(scroll_child->visible_layer_rect(), gfx::Rect(10, 10, 40, 40)); 6507 EXPECT_EQ(scroll_child->visible_layer_rect(), gfx::Rect(10, 10, 40, 40));
6499 EXPECT_EQ(scroll_child->clip_rect(), gfx::Rect(15, 15, 75, 75)); 6508 EXPECT_EQ(scroll_child->clip_rect(), gfx::Rect(15, 15, 75, 75));
6500 gfx::Transform scale; 6509 gfx::Transform scale;
6501 scale.Scale(1.5f, 1.5f); 6510 scale.Scale(1.5f, 1.5f);
6502 EXPECT_TRANSFORMATION_MATRIX_EQ(scroll_child->DrawTransform(), scale); 6511 EXPECT_TRANSFORMATION_MATRIX_EQ(scroll_child->DrawTransform(), scale);
6503 } 6512 }
6504 6513
6505 TEST_F(LayerTreeHostCommonTest, TargetBetweenScrollChildandScrollParentTarget) {
6506 LayerImpl* root = root_layer_for_testing();
6507 LayerImpl* scroll_child_target = AddChildToRoot<LayerImpl>();
6508 LayerImpl* scroll_child = AddChild<LayerImpl>(scroll_child_target);
6509 LayerImpl* child_of_scroll_child = AddChild<LayerImpl>(scroll_child);
6510 LayerImpl* intervening_target = AddChild<LayerImpl>(scroll_child_target);
6511 LayerImpl* clip = AddChild<LayerImpl>(intervening_target);
6512 LayerImpl* scroll_parent_target = AddChild<LayerImpl>(clip);
6513 LayerImpl* scroll_parent = AddChild<LayerImpl>(scroll_parent_target);
6514
6515 scroll_parent->SetDrawsContent(true);
6516 child_of_scroll_child->SetDrawsContent(true);
6517
6518 scroll_child->test_properties()->scroll_parent = scroll_parent;
6519 scroll_parent->test_properties()->scroll_children =
6520 base::MakeUnique<std::set<LayerImpl*>>();
6521 scroll_parent->test_properties()->scroll_children->insert(scroll_child);
6522
6523 root->SetBounds(gfx::Size(50, 50));
6524 scroll_child_target->SetBounds(gfx::Size(50, 50));
6525 scroll_child_target->SetMasksToBounds(true);
6526 scroll_child_target->test_properties()->force_render_surface = true;
6527 scroll_child->SetBounds(gfx::Size(50, 50));
6528 child_of_scroll_child->SetBounds(gfx::Size(50, 50));
6529 child_of_scroll_child->test_properties()->force_render_surface = true;
6530 intervening_target->SetBounds(gfx::Size(50, 50));
6531 intervening_target->test_properties()->force_render_surface = true;
6532 clip->SetBounds(gfx::Size(50, 50));
6533 clip->SetMasksToBounds(true);
6534 scroll_parent_target->SetBounds(gfx::Size(50, 50));
6535 scroll_parent_target->SetMasksToBounds(true);
6536 scroll_parent_target->test_properties()->force_render_surface = true;
6537 scroll_parent->SetBounds(gfx::Size(50, 50));
6538
6539 ExecuteCalculateDrawProperties(root);
6540 PropertyTrees* property_trees = root->layer_tree_impl()->property_trees();
6541 ClipNode* clip_node =
6542 property_trees->clip_tree.Node(child_of_scroll_child->clip_tree_index());
6543 ClipNode* parent_clip_node = property_trees->clip_tree.parent(clip_node);
6544 DCHECK_GT(parent_clip_node->target_transform_id,
6545 property_trees->transform_tree.TargetId(
6546 child_of_scroll_child->transform_tree_index()));
6547 }
6548
6549 TEST_F(LayerTreeHostCommonTest, SingularTransformSubtreesDoNotDraw) { 6514 TEST_F(LayerTreeHostCommonTest, SingularTransformSubtreesDoNotDraw) {
6550 LayerImpl* root = root_layer_for_testing(); 6515 LayerImpl* root = root_layer_for_testing();
6551 LayerImpl* parent = AddChildToRoot<LayerImpl>(); 6516 LayerImpl* parent = AddChildToRoot<LayerImpl>();
6552 LayerImpl* child = AddChild<LayerImpl>(parent); 6517 LayerImpl* child = AddChild<LayerImpl>(parent);
6553 6518
6554 root->SetBounds(gfx::Size(50, 50)); 6519 root->SetBounds(gfx::Size(50, 50));
6555 root->SetDrawsContent(true); 6520 root->SetDrawsContent(true);
6556 root->test_properties()->sorting_context_id = 1; 6521 root->test_properties()->sorting_context_id = 1;
6557 parent->SetBounds(gfx::Size(30, 30)); 6522 parent->SetBounds(gfx::Size(30, 30));
6558 parent->SetDrawsContent(true); 6523 parent->SetDrawsContent(true);
(...skipping 2413 matching lines...) Expand 10 before | Expand all | Expand 10 after
8972 8937
8973 // The singular transform on |animated| is flattened when inherited by 8938 // The singular transform on |animated| is flattened when inherited by
8974 // |surface|, and this happens to make it invertible. 8939 // |surface|, and this happens to make it invertible.
8975 EXPECT_EQ(gfx::Rect(2, 2), surface->visible_layer_rect()); 8940 EXPECT_EQ(gfx::Rect(2, 2), surface->visible_layer_rect());
8976 EXPECT_EQ(gfx::Rect(2, 2), descendant_of_animation->visible_layer_rect()); 8941 EXPECT_EQ(gfx::Rect(2, 2), descendant_of_animation->visible_layer_rect());
8977 8942
8978 gfx::Transform zero_matrix; 8943 gfx::Transform zero_matrix;
8979 zero_matrix.Scale3d(0.f, 0.f, 0.f); 8944 zero_matrix.Scale3d(0.f, 0.f, 0.f);
8980 root->layer_tree_impl()->property_trees()->transform_tree.OnTransformAnimated( 8945 root->layer_tree_impl()->property_trees()->transform_tree.OnTransformAnimated(
8981 zero_matrix, animated->transform_tree_index(), root->layer_tree_impl()); 8946 zero_matrix, animated->transform_tree_index(), root->layer_tree_impl());
8982 // While computing visible rects by combining clips in screen space, we set 8947 ExecuteCalculateDrawPropertiesAndSaveUpdateLayerList(root);
8983 // the entire layer as visible if the screen space transform is singular. This
8984 // is not always true when we combine clips in target space because if the
8985 // intersection of combined_clip in taret space with layer_rect projected to
8986 // target space is empty, we set it to an empty rect.
8987 bool skip_verify_visible_rect_calculations = true;
8988 ExecuteCalculateDrawPropertiesAndSaveUpdateLayerList(
8989 root, skip_verify_visible_rect_calculations);
8990
8991 // The animated layer maps to the empty rect in clipped target space, so is
8992 // treated as having an empty visible rect.
8993 EXPECT_EQ(gfx::Rect(), animated->visible_layer_rect());
8994 8948
8995 // The animated layer will be treated as fully visible when we combine clips 8949 // The animated layer will be treated as fully visible when we combine clips
8996 // in screen space. 8950 // in screen space.
8997 gfx::Rect visible_rect = draw_property_utils::ComputeLayerVisibleRectDynamic( 8951 EXPECT_EQ(gfx::Rect(120, 120), animated->visible_layer_rect());
8998 root->layer_tree_impl()->property_trees(), animated);
8999 EXPECT_EQ(gfx::Rect(120, 120), visible_rect);
9000 8952
9001 // This time, flattening does not make |animated|'s transform invertible. This 8953 // This time, flattening does not make |animated|'s transform invertible. This
9002 // means the clip cannot be projected into |surface|'s space, so we treat 8954 // means the clip cannot be projected into |surface|'s space, so we treat
9003 // |surface| and layers that draw into it as having empty visible rect. 8955 // |surface| and layers that draw into it as having empty visible rect.
9004 EXPECT_EQ(gfx::Rect(), surface->visible_layer_rect()); 8956 EXPECT_EQ(gfx::Rect(100, 100), surface->visible_layer_rect());
9005 EXPECT_EQ(gfx::Rect(), descendant_of_animation->visible_layer_rect()); 8957 EXPECT_EQ(gfx::Rect(200, 200), descendant_of_animation->visible_layer_rect());
9006 } 8958 }
9007 8959
9008 // Verify that having animated opacity but current opacity 1 still creates 8960 // Verify that having animated opacity but current opacity 1 still creates
9009 // a render surface. 8961 // a render surface.
9010 TEST_F(LayerTreeHostCommonTest, AnimatedOpacityCreatesRenderSurface) { 8962 TEST_F(LayerTreeHostCommonTest, AnimatedOpacityCreatesRenderSurface) {
9011 LayerImpl* root = root_layer_for_testing(); 8963 LayerImpl* root = root_layer_for_testing();
9012 LayerImpl* child = AddChild<LayerImpl>(root); 8964 LayerImpl* child = AddChild<LayerImpl>(root);
9013 LayerImpl* grandchild = AddChild<LayerImpl>(child); 8965 LayerImpl* grandchild = AddChild<LayerImpl>(child);
9014 8966
9015 root->SetBounds(gfx::Size(50, 50)); 8967 root->SetBounds(gfx::Size(50, 50));
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
9792 render_surface->SetBounds(gfx::Size(30, 30)); 9744 render_surface->SetBounds(gfx::Size(30, 30));
9793 render_surface->test_properties()->force_render_surface = true; 9745 render_surface->test_properties()->force_render_surface = true;
9794 test_layer->SetBounds(gfx::Size(30, 30)); 9746 test_layer->SetBounds(gfx::Size(30, 30));
9795 test_layer->SetDrawsContent(true); 9747 test_layer->SetDrawsContent(true);
9796 9748
9797 float device_scale_factor = 1.f; 9749 float device_scale_factor = 1.f;
9798 float page_scale_factor = 1.f; 9750 float page_scale_factor = 1.f;
9799 LayerImpl* page_scale_layer = nullptr; 9751 LayerImpl* page_scale_layer = nullptr;
9800 LayerImpl* inner_viewport_scroll_layer = nullptr; 9752 LayerImpl* inner_viewport_scroll_layer = nullptr;
9801 LayerImpl* outer_viewport_scroll_layer = nullptr; 9753 LayerImpl* outer_viewport_scroll_layer = nullptr;
9802 // Visible rects computed by combining clips in target space and root space
9803 // don't match because of rotation transforms. So, we skip
9804 // verify_visible_rect_calculations.
9805 bool skip_verify_visible_rect_calculations = true;
9806 ExecuteCalculateDrawProperties(root, device_scale_factor, page_scale_factor, 9754 ExecuteCalculateDrawProperties(root, device_scale_factor, page_scale_factor,
9807 page_scale_layer, inner_viewport_scroll_layer, 9755 page_scale_layer, inner_viewport_scroll_layer,
9808 outer_viewport_scroll_layer, 9756 outer_viewport_scroll_layer);
9809 skip_verify_visible_rect_calculations);
9810 9757
9811 TransformTree& transform_tree = 9758 TransformTree& transform_tree =
9812 root->layer_tree_impl()->property_trees()->transform_tree; 9759 root->layer_tree_impl()->property_trees()->transform_tree;
9813 TransformNode* transform_node = 9760 TransformNode* transform_node =
9814 transform_tree.Node(significant_transform->transform_tree_index()); 9761 transform_tree.Node(significant_transform->transform_tree_index());
9815 EXPECT_EQ(transform_node->owning_layer_id, significant_transform->id()); 9762 EXPECT_EQ(transform_node->owning_layer_id, significant_transform->id());
9816 9763
9817 EXPECT_TRUE(root->GetRenderSurface()); 9764 EXPECT_TRUE(root->GetRenderSurface());
9818 EXPECT_FALSE(significant_transform->GetRenderSurface()); 9765 EXPECT_FALSE(significant_transform->GetRenderSurface());
9819 EXPECT_TRUE(layer_clips_subtree->GetRenderSurface()); 9766 EXPECT_TRUE(layer_clips_subtree->GetRenderSurface());
9820 EXPECT_TRUE(render_surface->GetRenderSurface()); 9767 EXPECT_TRUE(render_surface->GetRenderSurface());
9821 EXPECT_FALSE(test_layer->GetRenderSurface()); 9768 EXPECT_FALSE(test_layer->GetRenderSurface());
9822 9769
9823 ClipTree& clip_tree = root->layer_tree_impl()->property_trees()->clip_tree; 9770 EXPECT_EQ(gfx::Rect(30, 20), test_layer->visible_layer_rect());
9824 ClipNode* clip_node = clip_tree.Node(render_surface->clip_tree_index());
9825 EXPECT_EQ(clip_node->clip_type, ClipNode::ClipType::NONE);
9826 EXPECT_EQ(gfx::Rect(20, 20), test_layer->visible_layer_rect());
9827
9828 // Also test the visible rects computed by combining clips in root space.
9829 gfx::Rect visible_rect = draw_property_utils::ComputeLayerVisibleRectDynamic(
9830 root->layer_tree_impl()->property_trees(), test_layer);
9831 EXPECT_EQ(gfx::Rect(30, 20), visible_rect);
9832 } 9771 }
9833 9772
9834 TEST_F(LayerTreeHostCommonTest, TransformOfParentClipNodeAncestorOfTarget) { 9773 TEST_F(LayerTreeHostCommonTest, TransformOfParentClipNodeAncestorOfTarget) {
9835 // Ensure that when parent clip node's transform is an ancestor of current 9774 // Ensure that when parent clip node's transform is an ancestor of current
9836 // clip node's target, clip is 'projected' from parent space to current 9775 // clip node's target, clip is 'projected' from parent space to current
9837 // target space and visible rects are calculated correctly. 9776 // target space and visible rects are calculated correctly.
9838 LayerImpl* root = root_layer_for_testing(); 9777 LayerImpl* root = root_layer_for_testing();
9839 LayerImpl* clip_layer = AddChild<LayerImpl>(root); 9778 LayerImpl* clip_layer = AddChild<LayerImpl>(root);
9840 LayerImpl* target_layer = AddChild<LayerImpl>(clip_layer); 9779 LayerImpl* target_layer = AddChild<LayerImpl>(clip_layer);
9841 LayerImpl* test_layer = AddChild<LayerImpl>(target_layer); 9780 LayerImpl* test_layer = AddChild<LayerImpl>(target_layer);
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
10263 clip_child->SetBounds(gfx::Size(30, 30)); 10202 clip_child->SetBounds(gfx::Size(30, 30));
10264 10203
10265 clip_child->test_properties()->clip_parent = root; 10204 clip_child->test_properties()->clip_parent = root;
10266 root->test_properties()->clip_children = 10205 root->test_properties()->clip_children =
10267 base::MakeUnique<std::set<LayerImpl*>>(); 10206 base::MakeUnique<std::set<LayerImpl*>>();
10268 root->test_properties()->clip_children->insert(clip_child); 10207 root->test_properties()->clip_children->insert(clip_child);
10269 10208
10270 ExecuteCalculateDrawProperties(root); 10209 ExecuteCalculateDrawProperties(root);
10271 10210
10272 EXPECT_EQ(gfx::Rect(-10, -10, 30, 30), render_surface2->clip_rect()); 10211 EXPECT_EQ(gfx::Rect(-10, -10, 30, 30), render_surface2->clip_rect());
10273 // A clip node is created for every render surface and for layers that have
10274 // local clip. So, here it should be craeted for every layer.
10275 EXPECT_EQ(root->layer_tree_impl()->property_trees()->clip_tree.size(), 5u);
10276 } 10212 }
10277 10213
10278 TEST_F(LayerTreeHostCommonTest, MaskLayerDrawProperties) { 10214 TEST_F(LayerTreeHostCommonTest, MaskLayerDrawProperties) {
10279 // Tests that a mask layer's draw properties are computed correctly. 10215 // Tests that a mask layer's draw properties are computed correctly.
10280 LayerImpl* root = root_layer_for_testing(); 10216 LayerImpl* root = root_layer_for_testing();
10281 LayerImpl* child = AddChild<LayerImpl>(root); 10217 LayerImpl* child = AddChild<LayerImpl>(root);
10282 child->test_properties()->SetMaskLayer( 10218 child->test_properties()->SetMaskLayer(
10283 LayerImpl::Create(root->layer_tree_impl(), 100)); 10219 LayerImpl::Create(root->layer_tree_impl(), 100));
10284 LayerImpl* mask = child->test_properties()->mask_layer; 10220 LayerImpl* mask = child->test_properties()->mask_layer;
10285 10221
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
10791 EXPECT_EQ(scroll_child6.id, grand_child10->scroll_tree_index()); 10727 EXPECT_EQ(scroll_child6.id, grand_child10->scroll_tree_index());
10792 EXPECT_EQ(scroll_root1.id, parent3->scroll_tree_index()); 10728 EXPECT_EQ(scroll_root1.id, parent3->scroll_tree_index());
10793 EXPECT_EQ(scroll_child7.id, child8->scroll_tree_index()); 10729 EXPECT_EQ(scroll_child7.id, child8->scroll_tree_index());
10794 EXPECT_EQ(scroll_root1.id, parent4->scroll_tree_index()); 10730 EXPECT_EQ(scroll_root1.id, parent4->scroll_tree_index());
10795 EXPECT_EQ(scroll_root1.id, child9->scroll_tree_index()); 10731 EXPECT_EQ(scroll_root1.id, child9->scroll_tree_index());
10796 EXPECT_EQ(scroll_root1.id, grand_child12->scroll_tree_index()); 10732 EXPECT_EQ(scroll_root1.id, grand_child12->scroll_tree_index());
10797 } 10733 }
10798 10734
10799 } // namespace 10735 } // namespace
10800 } // namespace cc 10736 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common_perftest.cc ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698