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

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

Issue 2834123002: cc: Replace render surface layer list with a render surface list (Closed)
Patch Set: Address review comments Created 3 years, 7 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/damage_tracker.cc ('k') | cc/trees/debug_rect_history.h » ('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/damage_tracker.h" 5 #include "cc/trees/damage_tracker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "cc/base/filter_operation.h" 9 #include "cc/base/filter_operation.h"
10 #include "cc/base/filter_operations.h" 10 #include "cc/base/filter_operations.h"
11 #include "cc/base/math_util.h" 11 #include "cc/base/math_util.h"
12 #include "cc/layers/layer_impl.h" 12 #include "cc/layers/layer_impl.h"
13 #include "cc/test/fake_impl_task_runner_provider.h" 13 #include "cc/test/fake_impl_task_runner_provider.h"
14 #include "cc/test/fake_layer_tree_host_impl.h" 14 #include "cc/test/fake_layer_tree_host_impl.h"
15 #include "cc/test/geometry_test_utils.h" 15 #include "cc/test/geometry_test_utils.h"
16 #include "cc/test/test_task_graph_runner.h" 16 #include "cc/test/test_task_graph_runner.h"
17 #include "cc/trees/layer_tree_host_common.h" 17 #include "cc/trees/layer_tree_host_common.h"
18 #include "cc/trees/layer_tree_impl.h" 18 #include "cc/trees/layer_tree_impl.h"
19 #include "cc/trees/single_thread_proxy.h" 19 #include "cc/trees/single_thread_proxy.h"
20 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
21 #include "third_party/skia/include/effects/SkBlurImageFilter.h" 21 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
22 #include "ui/gfx/geometry/quad_f.h" 22 #include "ui/gfx/geometry/quad_f.h"
23 #include "ui/gfx/geometry/rect_conversions.h" 23 #include "ui/gfx/geometry/rect_conversions.h"
24 24
25 namespace cc { 25 namespace cc {
26 namespace { 26 namespace {
27 27
28 void ExecuteCalculateDrawProperties(LayerImpl* root, 28 void ExecuteCalculateDrawProperties(LayerImpl* root,
29 float device_scale_factor, 29 float device_scale_factor,
30 LayerImplList* render_surface_layer_list) { 30 RenderSurfaceList* render_surface_list) {
31 // Sanity check: The test itself should create the root layer's render 31 // Sanity check: The test itself should create the root layer's render
32 // surface, so that the surface (and its damage tracker) can 32 // surface, so that the surface (and its damage tracker) can
33 // persist across multiple calls to this function. 33 // persist across multiple calls to this function.
34 ASSERT_FALSE(render_surface_layer_list->size()); 34 ASSERT_FALSE(render_surface_list->size());
35 35
36 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( 36 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
37 root, root->bounds(), device_scale_factor, render_surface_layer_list); 37 root, root->bounds(), device_scale_factor, render_surface_list);
38 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs); 38 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
39 ASSERT_TRUE(root->GetRenderSurface()); 39 ASSERT_TRUE(root->GetRenderSurface());
40 } 40 }
41 41
42 void ClearDamageForAllSurfaces(LayerImpl* root) { 42 void ClearDamageForAllSurfaces(LayerImpl* root) {
43 for (auto* layer : *root->layer_tree_impl()) { 43 for (auto* layer : *root->layer_tree_impl()) {
44 if (layer->GetRenderSurface()) 44 if (layer->GetRenderSurface())
45 layer->GetRenderSurface()->damage_tracker()->DidDrawDamagedArea(); 45 layer->GetRenderSurface()->damage_tracker()->DidDrawDamagedArea();
46 } 46 }
47 } 47 }
48 48
49 void EmulateDrawingOneFrame(LayerImpl* root, float device_scale_factor = 1.f) { 49 void EmulateDrawingOneFrame(LayerImpl* root, float device_scale_factor = 1.f) {
50 // This emulates only steps that are relevant to testing the damage tracker: 50 // This emulates only steps that are relevant to testing the damage tracker:
51 // 1. computing the render passes and layerlists 51 // 1. computing the render passes and layerlists
52 // 2. updating all damage trackers in the correct order 52 // 2. updating all damage trackers in the correct order
53 // 3. resetting all update_rects and property_changed flags for all layers 53 // 3. resetting all update_rects and property_changed flags for all layers
54 // and surfaces. 54 // and surfaces.
55 55
56 LayerImplList render_surface_layer_list; 56 RenderSurfaceList render_surface_list;
57 ExecuteCalculateDrawProperties(root, device_scale_factor, 57 ExecuteCalculateDrawProperties(root, device_scale_factor,
58 &render_surface_layer_list); 58 &render_surface_list);
59 59
60 DamageTracker::UpdateDamageTracking(root->layer_tree_impl(), 60 DamageTracker::UpdateDamageTracking(root->layer_tree_impl(),
61 render_surface_layer_list); 61 render_surface_list);
62 62
63 root->layer_tree_impl()->ResetAllChangeTracking(); 63 root->layer_tree_impl()->ResetAllChangeTracking();
64 } 64 }
65 65
66 class DamageTrackerTest : public testing::Test { 66 class DamageTrackerTest : public testing::Test {
67 public: 67 public:
68 DamageTrackerTest() 68 DamageTrackerTest()
69 : host_impl_(&task_runner_provider_, &task_graph_runner_) {} 69 : host_impl_(&task_runner_provider_, &task_graph_runner_) {}
70 70
71 LayerImpl* CreateTestTreeWithOneSurface(int number_of_children) { 71 LayerImpl* CreateTestTreeWithOneSurface(int number_of_children) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } 167 }
168 168
169 protected: 169 protected:
170 FakeImplTaskRunnerProvider task_runner_provider_; 170 FakeImplTaskRunnerProvider task_runner_provider_;
171 TestTaskGraphRunner task_graph_runner_; 171 TestTaskGraphRunner task_graph_runner_;
172 FakeLayerTreeHostImpl host_impl_; 172 FakeLayerTreeHostImpl host_impl_;
173 }; 173 };
174 174
175 TEST_F(DamageTrackerTest, SanityCheckTestTreeWithOneSurface) { 175 TEST_F(DamageTrackerTest, SanityCheckTestTreeWithOneSurface) {
176 // Sanity check that the simple test tree will actually produce the expected 176 // Sanity check that the simple test tree will actually produce the expected
177 // render surfaces and layer lists. 177 // render surfaces.
178 178
179 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(); 179 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
180 LayerImpl* child = root->test_properties()->children[0];
180 181
181 EXPECT_EQ(2u, root->GetRenderSurface()->layer_list().size()); 182 EXPECT_EQ(2, root->GetRenderSurface()->num_contributors());
182 EXPECT_EQ(1, root->GetRenderSurface()->layer_list()[0]->id()); 183 EXPECT_TRUE(root->is_drawn_render_surface_layer_list_member());
183 EXPECT_EQ(2, root->GetRenderSurface()->layer_list()[1]->id()); 184 EXPECT_TRUE(child->is_drawn_render_surface_layer_list_member());
184 185
185 gfx::Rect root_damage_rect; 186 gfx::Rect root_damage_rect;
186 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 187 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
187 &root_damage_rect)); 188 &root_damage_rect));
188 189
189 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString()); 190 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString());
190 } 191 }
191 192
192 TEST_F(DamageTrackerTest, SanityCheckTestTreeWithTwoSurfaces) { 193 TEST_F(DamageTrackerTest, SanityCheckTestTreeWithTwoSurfaces) {
193 // Sanity check that the complex test tree will actually produce the expected 194 // Sanity check that the complex test tree will actually produce the expected
194 // render surfaces and layer lists. 195 // render surfaces.
195 196
196 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces(); 197 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
197 198
198 LayerImpl* child1 = root->test_properties()->children[0]; 199 LayerImpl* child1 = root->test_properties()->children[0];
199 LayerImpl* child2 = root->test_properties()->children[1]; 200 LayerImpl* child2 = root->test_properties()->children[1];
200 201
201 gfx::Rect child_damage_rect; 202 gfx::Rect child_damage_rect;
202 EXPECT_TRUE( 203 EXPECT_TRUE(
203 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 204 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
204 &child_damage_rect)); 205 &child_damage_rect));
205 gfx::Rect root_damage_rect; 206 gfx::Rect root_damage_rect;
206 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 207 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
207 &root_damage_rect)); 208 &root_damage_rect));
208 209
209 ASSERT_TRUE(child1->GetRenderSurface()); 210 ASSERT_TRUE(child1->GetRenderSurface());
210 EXPECT_FALSE(child2->GetRenderSurface()); 211 EXPECT_FALSE(child2->GetRenderSurface());
211 EXPECT_EQ(3u, root->GetRenderSurface()->layer_list().size()); 212 EXPECT_EQ(3, root->GetRenderSurface()->num_contributors());
212 EXPECT_EQ(2u, child1->GetRenderSurface()->layer_list().size()); 213 EXPECT_EQ(2, child1->GetRenderSurface()->num_contributors());
213 214
214 // The render surface for child1 only has a content_rect that encloses 215 // The render surface for child1 only has a content_rect that encloses
215 // grand_child1 and grand_child2, because child1 does not draw content. 216 // grand_child1 and grand_child2, because child1 does not draw content.
216 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(), 217 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
217 child_damage_rect.ToString()); 218 child_damage_rect.ToString());
218 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString()); 219 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString());
219 } 220 }
220 221
221 TEST_F(DamageTrackerTest, VerifyDamageForUpdateRects) { 222 TEST_F(DamageTrackerTest, VerifyDamageForUpdateRects) {
222 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(); 223 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 // CASE 1: The layer's property changed flag takes priority over update rect. 373 // CASE 1: The layer's property changed flag takes priority over update rect.
373 // 374 //
374 child->test_properties()->force_render_surface = true; 375 child->test_properties()->force_render_surface = true;
375 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 376 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
376 EmulateDrawingOneFrame(root); 377 EmulateDrawingOneFrame(root);
377 ClearDamageForAllSurfaces(root); 378 ClearDamageForAllSurfaces(root);
378 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13)); 379 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
379 root->layer_tree_impl()->SetOpacityMutated(child->element_id(), 0.5f); 380 root->layer_tree_impl()->SetOpacityMutated(child->element_id(), 0.5f);
380 EmulateDrawingOneFrame(root); 381 EmulateDrawingOneFrame(root);
381 382
382 ASSERT_EQ(2u, root->GetRenderSurface()->layer_list().size()); 383 ASSERT_EQ(2, root->GetRenderSurface()->num_contributors());
383 384
384 // Damage should be the entire child layer in target_surface space. 385 // Damage should be the entire child layer in target_surface space.
385 gfx::Rect expected_rect = gfx::Rect(100, 100, 30, 30); 386 gfx::Rect expected_rect = gfx::Rect(100, 100, 30, 30);
386 gfx::Rect root_damage_rect; 387 gfx::Rect root_damage_rect;
387 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 388 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
388 &root_damage_rect)); 389 &root_damage_rect));
389 EXPECT_EQ(expected_rect.ToString(), root_damage_rect.ToString()); 390 EXPECT_EQ(expected_rect.ToString(), root_damage_rect.ToString());
390 391
391 // CASE 2: If a layer moves due to property change, it damages both the new 392 // CASE 2: If a layer moves due to property change, it damages both the new
392 // location and the old (exposed) location. The old location is the 393 // location and the old (exposed) location. The old location is the
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 child2->SetPosition(gfx::PointF(400.f, 380.f)); 862 child2->SetPosition(gfx::PointF(400.f, 380.f));
862 child2->SetBounds(gfx::Size(6, 8)); 863 child2->SetBounds(gfx::Size(6, 8));
863 child2->SetDrawsContent(true); 864 child2->SetDrawsContent(true);
864 root->test_properties()->AddChild(std::move(child2)); 865 root->test_properties()->AddChild(std::move(child2));
865 } 866 }
866 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 867 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
867 EmulateDrawingOneFrame(root); 868 EmulateDrawingOneFrame(root);
868 869
869 // Sanity check - all 3 layers should be on the same render surface; render 870 // Sanity check - all 3 layers should be on the same render surface; render
870 // surfaces are tested elsewhere. 871 // surfaces are tested elsewhere.
871 ASSERT_EQ(3u, root->GetRenderSurface()->layer_list().size()); 872 ASSERT_EQ(3, root->GetRenderSurface()->num_contributors());
872 873
873 gfx::Rect root_damage_rect; 874 gfx::Rect root_damage_rect;
874 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 875 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
875 &root_damage_rect)); 876 &root_damage_rect));
876 EXPECT_EQ(gfx::Rect(400, 380, 6, 8).ToString(), root_damage_rect.ToString()); 877 EXPECT_EQ(gfx::Rect(400, 380, 6, 8).ToString(), root_damage_rect.ToString());
877 878
878 // CASE 2: If the layer is removed, its entire old layer becomes exposed, not 879 // CASE 2: If the layer is removed, its entire old layer becomes exposed, not
879 // just the last update rect. 880 // just the last update rect.
880 881
881 // Advance one frame without damage so that we know the damage rect is not 882 // Advance one frame without damage so that we know the damage rect is not
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 // trigger, it means the test no longer actually covers the intended 922 // trigger, it means the test no longer actually covers the intended
922 // scenario. 923 // scenario.
923 ASSERT_FALSE(child2_ptr->LayerPropertyChanged()); 924 ASSERT_FALSE(child2_ptr->LayerPropertyChanged());
924 ASSERT_TRUE(child2_ptr->update_rect().IsEmpty()); 925 ASSERT_TRUE(child2_ptr->update_rect().IsEmpty());
925 } 926 }
926 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 927 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
927 EmulateDrawingOneFrame(root); 928 EmulateDrawingOneFrame(root);
928 929
929 // Sanity check - all 3 layers should be on the same render surface; render 930 // Sanity check - all 3 layers should be on the same render surface; render
930 // surfaces are tested elsewhere. 931 // surfaces are tested elsewhere.
931 ASSERT_EQ(3u, root->GetRenderSurface()->layer_list().size()); 932 ASSERT_EQ(3, root->GetRenderSurface()->num_contributors());
932 933
933 gfx::Rect root_damage_rect; 934 gfx::Rect root_damage_rect;
934 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 935 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
935 &root_damage_rect)); 936 &root_damage_rect));
936 EXPECT_EQ(gfx::Rect(400, 380, 6, 8).ToString(), root_damage_rect.ToString()); 937 EXPECT_EQ(gfx::Rect(400, 380, 6, 8).ToString(), root_damage_rect.ToString());
937 } 938 }
938 939
939 TEST_F(DamageTrackerTest, VerifyDamageForMultipleLayers) { 940 TEST_F(DamageTrackerTest, VerifyDamageForMultipleLayers) {
940 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(); 941 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
941 LayerImpl* child1 = root->test_properties()->children[0]; 942 LayerImpl* child1 = root->test_properties()->children[0];
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 1103
1103 // CASE 1: If a descendant surface disappears, its entire old area becomes 1104 // CASE 1: If a descendant surface disappears, its entire old area becomes
1104 // exposed. 1105 // exposed.
1105 ClearDamageForAllSurfaces(root); 1106 ClearDamageForAllSurfaces(root);
1106 child1->test_properties()->force_render_surface = false; 1107 child1->test_properties()->force_render_surface = false;
1107 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 1108 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1108 EmulateDrawingOneFrame(root); 1109 EmulateDrawingOneFrame(root);
1109 1110
1110 // Sanity check that there is only one surface now. 1111 // Sanity check that there is only one surface now.
1111 ASSERT_FALSE(child1->GetRenderSurface()); 1112 ASSERT_FALSE(child1->GetRenderSurface());
1112 ASSERT_EQ(4u, root->GetRenderSurface()->layer_list().size()); 1113 ASSERT_EQ(4, root->GetRenderSurface()->num_contributors());
1113 1114
1114 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1115 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1115 &root_damage_rect)); 1116 &root_damage_rect));
1116 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(), 1117 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(),
1117 root_damage_rect.ToString()); 1118 root_damage_rect.ToString());
1118 1119
1119 // CASE 2: If a descendant surface appears, its entire old area becomes 1120 // CASE 2: If a descendant surface appears, its entire old area becomes
1120 // exposed. 1121 // exposed.
1121 1122
1122 // Cycle one frame of no change, just to sanity check that the next rect is 1123 // Cycle one frame of no change, just to sanity check that the next rect is
1123 // not because of the old damage state. 1124 // not because of the old damage state.
1124 ClearDamageForAllSurfaces(root); 1125 ClearDamageForAllSurfaces(root);
1125 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 1126 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1126 EmulateDrawingOneFrame(root); 1127 EmulateDrawingOneFrame(root);
1127 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1128 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1128 &root_damage_rect)); 1129 &root_damage_rect));
1129 EXPECT_TRUE(root_damage_rect.IsEmpty()); 1130 EXPECT_TRUE(root_damage_rect.IsEmpty());
1130 1131
1131 // Then change the tree so that the render surface is added back. 1132 // Then change the tree so that the render surface is added back.
1132 ClearDamageForAllSurfaces(root); 1133 ClearDamageForAllSurfaces(root);
1133 child1->test_properties()->force_render_surface = true; 1134 child1->test_properties()->force_render_surface = true;
1134 1135
1135 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 1136 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1136 EmulateDrawingOneFrame(root); 1137 EmulateDrawingOneFrame(root);
1137 1138
1138 // Sanity check that there is a new surface now. 1139 // Sanity check that there is a new surface now.
1139 ASSERT_TRUE(child1->GetRenderSurface()); 1140 ASSERT_TRUE(child1->GetRenderSurface());
1140 EXPECT_EQ(3u, root->GetRenderSurface()->layer_list().size()); 1141 EXPECT_EQ(3, root->GetRenderSurface()->num_contributors());
1141 EXPECT_EQ(2u, child1->GetRenderSurface()->layer_list().size()); 1142 EXPECT_EQ(2, child1->GetRenderSurface()->num_contributors());
1142 1143
1143 EXPECT_TRUE( 1144 EXPECT_TRUE(
1144 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1145 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1145 &child_damage_rect)); 1146 &child_damage_rect));
1146 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1147 EXPECT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1147 &root_damage_rect)); 1148 &root_damage_rect));
1148 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(), 1149 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
1149 child_damage_rect.ToString()); 1150 child_damage_rect.ToString());
1150 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(), 1151 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(),
1151 root_damage_rect.ToString()); 1152 root_damage_rect.ToString());
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 grandchild1->SetDrawsContent(true); 1502 grandchild1->SetDrawsContent(true);
1502 1503
1503 // Really far right. 1504 // Really far right.
1504 grandchild2->SetPosition( 1505 grandchild2->SetPosition(
1505 gfx::PointF(std::numeric_limits<int>::max() - 500, 0)); 1506 gfx::PointF(std::numeric_limits<int>::max() - 500, 0));
1506 grandchild2->SetBounds(gfx::Size(1, 1)); 1507 grandchild2->SetBounds(gfx::Size(1, 1));
1507 grandchild2->SetDrawsContent(true); 1508 grandchild2->SetDrawsContent(true);
1508 1509
1509 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 1510 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1510 float device_scale_factor = 1.f; 1511 float device_scale_factor = 1.f;
1511 LayerImplList render_surface_layer_list; 1512 RenderSurfaceList render_surface_list;
1512 ExecuteCalculateDrawProperties(root, device_scale_factor, 1513 ExecuteCalculateDrawProperties(root, device_scale_factor,
1513 &render_surface_layer_list); 1514 &render_surface_list);
1514 // Avoid the descendant-only property change path that skips unioning damage 1515 // Avoid the descendant-only property change path that skips unioning damage
1515 // from descendant layers. 1516 // from descendant layers.
1516 child1->GetRenderSurface()->NoteAncestorPropertyChanged(); 1517 child1->GetRenderSurface()->NoteAncestorPropertyChanged();
1517 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(), 1518 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
1518 render_surface_layer_list); 1519 render_surface_list);
1519 1520
1520 // The expected damage would be too large to store in a gfx::Rect, so we 1521 // The expected damage would be too large to store in a gfx::Rect, so we
1521 // should damage everything on child1. 1522 // should damage everything on child1.
1522 gfx::Rect damage_rect; 1523 gfx::Rect damage_rect;
1523 EXPECT_FALSE( 1524 EXPECT_FALSE(
1524 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1525 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1525 &damage_rect)); 1526 &damage_rect));
1526 EXPECT_EQ(child1->GetRenderSurface()->content_rect(), 1527 EXPECT_EQ(child1->GetRenderSurface()->content_rect(),
1527 child1->GetRenderSurface()->GetDamageRect()); 1528 child1->GetRenderSurface()->GetDamageRect());
1528 1529
1529 // However, the root should just use the child1 render surface's content rect 1530 // However, the root should just use the child1 render surface's content rect
1530 // as damage. 1531 // as damage.
1531 ASSERT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1532 ASSERT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1532 &damage_rect)); 1533 &damage_rect));
1533 EXPECT_TRUE(damage_rect.Contains(root->GetRenderSurface()->content_rect())); 1534 EXPECT_TRUE(damage_rect.Contains(root->GetRenderSurface()->content_rect()));
1534 EXPECT_TRUE(damage_rect.Contains( 1535 EXPECT_TRUE(damage_rect.Contains(
1535 gfx::ToEnclosingRect(child1->GetRenderSurface()->DrawableContentRect()))); 1536 gfx::ToEnclosingRect(child1->GetRenderSurface()->DrawableContentRect())));
1536 EXPECT_EQ(damage_rect, root->GetRenderSurface()->GetDamageRect()); 1537 EXPECT_EQ(damage_rect, root->GetRenderSurface()->GetDamageRect());
1537 1538
1538 // Add new damage, without changing properties, which goes down a different 1539 // Add new damage, without changing properties, which goes down a different
1539 // path in the damage tracker. 1540 // path in the damage tracker.
1540 root->layer_tree_impl()->ResetAllChangeTracking(); 1541 root->layer_tree_impl()->ResetAllChangeTracking();
1541 grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds())); 1542 grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1542 grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds())); 1543 grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1543 1544
1544 // Recompute all damage / properties. 1545 // Recompute all damage / properties.
1545 render_surface_layer_list.clear(); 1546 render_surface_list.clear();
1546 ExecuteCalculateDrawProperties(root, device_scale_factor, 1547 ExecuteCalculateDrawProperties(root, device_scale_factor,
1547 &render_surface_layer_list); 1548 &render_surface_list);
1548 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(), 1549 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
1549 render_surface_layer_list); 1550 render_surface_list);
1550 1551
1551 // Child1 should still not have a valid rect, since the union of the damage of 1552 // Child1 should still not have a valid rect, since the union of the damage of
1552 // its children is not representable by a single rect. 1553 // its children is not representable by a single rect.
1553 EXPECT_FALSE( 1554 EXPECT_FALSE(
1554 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1555 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1555 &damage_rect)); 1556 &damage_rect));
1556 EXPECT_EQ(child1->GetRenderSurface()->content_rect(), 1557 EXPECT_EQ(child1->GetRenderSurface()->content_rect(),
1557 child1->GetRenderSurface()->GetDamageRect()); 1558 child1->GetRenderSurface()->GetDamageRect());
1558 1559
1559 // Root should have valid damage and contain both its content rect and the 1560 // Root should have valid damage and contain both its content rect and the
(...skipping 25 matching lines...) Expand all
1585 grandchild1->SetDrawsContent(true); 1586 grandchild1->SetDrawsContent(true);
1586 1587
1587 // Really far right. 1588 // Really far right.
1588 grandchild2->SetPosition( 1589 grandchild2->SetPosition(
1589 gfx::PointF(std::numeric_limits<int>::max() - 500, 0)); 1590 gfx::PointF(std::numeric_limits<int>::max() - 500, 0));
1590 grandchild2->SetBounds(gfx::Size(1, 1)); 1591 grandchild2->SetBounds(gfx::Size(1, 1));
1591 grandchild2->SetDrawsContent(true); 1592 grandchild2->SetDrawsContent(true);
1592 1593
1593 root->layer_tree_impl()->property_trees()->needs_rebuild = true; 1594 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1594 float device_scale_factor = 1.f; 1595 float device_scale_factor = 1.f;
1595 LayerImplList render_surface_layer_list; 1596 RenderSurfaceList render_surface_list;
1596 ExecuteCalculateDrawProperties(root, device_scale_factor, 1597 ExecuteCalculateDrawProperties(root, device_scale_factor,
1597 &render_surface_layer_list); 1598 &render_surface_list);
1598 // Avoid the descendant-only property change path that skips unioning damage 1599 // Avoid the descendant-only property change path that skips unioning damage
1599 // from descendant layers. 1600 // from descendant layers.
1600 child1->GetRenderSurface()->NoteAncestorPropertyChanged(); 1601 child1->GetRenderSurface()->NoteAncestorPropertyChanged();
1601 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(), 1602 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
1602 render_surface_layer_list); 1603 render_surface_list);
1603 1604
1604 // The expected damage would be too large to store in a gfx::Rect, so we 1605 // The expected damage would be too large to store in a gfx::Rect, so we
1605 // should damage everything on child1. 1606 // should damage everything on child1.
1606 gfx::Rect damage_rect; 1607 gfx::Rect damage_rect;
1607 EXPECT_FALSE( 1608 EXPECT_FALSE(
1608 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1609 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1609 &damage_rect)); 1610 &damage_rect));
1610 EXPECT_EQ(child1->GetRenderSurface()->content_rect(), 1611 EXPECT_EQ(child1->GetRenderSurface()->content_rect(),
1611 child1->GetRenderSurface()->GetDamageRect()); 1612 child1->GetRenderSurface()->GetDamageRect());
1612 1613
1613 // However, the root should just use the child1 render surface's content rect 1614 // However, the root should just use the child1 render surface's content rect
1614 // as damage. 1615 // as damage.
1615 ASSERT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1616 ASSERT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1616 &damage_rect)); 1617 &damage_rect));
1617 EXPECT_TRUE(damage_rect.Contains(root->GetRenderSurface()->content_rect())); 1618 EXPECT_TRUE(damage_rect.Contains(root->GetRenderSurface()->content_rect()));
1618 EXPECT_TRUE(damage_rect.Contains( 1619 EXPECT_TRUE(damage_rect.Contains(
1619 gfx::ToEnclosingRect(child1->GetRenderSurface()->DrawableContentRect()))); 1620 gfx::ToEnclosingRect(child1->GetRenderSurface()->DrawableContentRect())));
1620 EXPECT_EQ(damage_rect, root->GetRenderSurface()->GetDamageRect()); 1621 EXPECT_EQ(damage_rect, root->GetRenderSurface()->GetDamageRect());
1621 1622
1622 // Add new damage, without changing properties, which goes down a different 1623 // Add new damage, without changing properties, which goes down a different
1623 // path in the damage tracker. 1624 // path in the damage tracker.
1624 root->layer_tree_impl()->ResetAllChangeTracking(); 1625 root->layer_tree_impl()->ResetAllChangeTracking();
1625 grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds())); 1626 grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1626 grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds())); 1627 grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1627 1628
1628 // Recompute all damage / properties. 1629 // Recompute all damage / properties.
1629 render_surface_layer_list.clear(); 1630 render_surface_list.clear();
1630 ExecuteCalculateDrawProperties(root, device_scale_factor, 1631 ExecuteCalculateDrawProperties(root, device_scale_factor,
1631 &render_surface_layer_list); 1632 &render_surface_list);
1632 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(), 1633 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
1633 render_surface_layer_list); 1634 render_surface_list);
1634 1635
1635 // Child1 should still not have a valid rect, since the union of the damage of 1636 // Child1 should still not have a valid rect, since the union of the damage of
1636 // its children is not representable by a single rect. 1637 // its children is not representable by a single rect.
1637 EXPECT_FALSE( 1638 EXPECT_FALSE(
1638 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1639 child1->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1639 &damage_rect)); 1640 &damage_rect));
1640 EXPECT_EQ(child1->GetRenderSurface()->content_rect(), 1641 EXPECT_EQ(child1->GetRenderSurface()->content_rect(),
1641 child1->GetRenderSurface()->GetDamageRect()); 1642 child1->GetRenderSurface()->GetDamageRect());
1642 1643
1643 // Root should have valid damage and contain both its content rect and the 1644 // Root should have valid damage and contain both its content rect and the
1644 // drawable content rect of child1. 1645 // drawable content rect of child1.
1645 ASSERT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid( 1646 ASSERT_TRUE(root->GetRenderSurface()->damage_tracker()->GetDamageRectIfValid(
1646 &damage_rect)); 1647 &damage_rect));
1647 EXPECT_TRUE(damage_rect.Contains(root->GetRenderSurface()->content_rect())); 1648 EXPECT_TRUE(damage_rect.Contains(root->GetRenderSurface()->content_rect()));
1648 EXPECT_TRUE(damage_rect.Contains( 1649 EXPECT_TRUE(damage_rect.Contains(
1649 gfx::ToEnclosingRect(child1->GetRenderSurface()->DrawableContentRect()))); 1650 gfx::ToEnclosingRect(child1->GetRenderSurface()->DrawableContentRect())));
1650 EXPECT_EQ(damage_rect, root->GetRenderSurface()->GetDamageRect()); 1651 EXPECT_EQ(damage_rect, root->GetRenderSurface()->GetDamageRect());
1651 } 1652 }
1652 1653
1653 } // namespace 1654 } // namespace
1654 } // namespace cc 1655 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/damage_tracker.cc ('k') | cc/trees/debug_rect_history.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698