blob: d4c755877c17a5d349089742d680f2f68798ef8b [file] [log] [blame]
[email protected]94f206c12012-08-25 00:09:141// Copyright 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]556fd292013-03-18 08:03:045#include "cc/trees/damage_tracker.h"
[email protected]94f206c12012-08-25 00:09:146
avi02a4d172015-12-21 06:14:367#include <stddef.h>
8
[email protected]681ccff2013-03-18 06:13:529#include "cc/base/math_util.h"
[email protected]cc3cfaa2013-03-18 09:05:5210#include "cc/layers/layer_impl.h"
Khushal7865b5be2017-11-22 03:12:0611#include "cc/paint/filter_operation.h"
12#include "cc/paint/filter_operations.h"
khushalsagarb64b360d2015-10-21 19:25:1613#include "cc/test/fake_impl_task_runner_provider.h"
[email protected]586d51ed2012-12-07 20:31:4514#include "cc/test/fake_layer_tree_host_impl.h"
[email protected]101441ce2012-10-16 01:45:0315#include "cc/test/geometry_test_utils.h"
chrishtr7e3aaf22017-05-04 15:04:0116#include "cc/test/layer_test_common.h"
reveman34b7a1522015-03-23 20:27:4717#include "cc/test/test_task_graph_runner.h"
[email protected]556fd292013-03-18 08:03:0418#include "cc/trees/layer_tree_host_common.h"
miletus5032027d2015-06-10 01:27:4719#include "cc/trees/layer_tree_impl.h"
[email protected]556fd292013-03-18 08:03:0420#include "cc/trees/single_thread_proxy.h"
[email protected]7f0c53db2012-10-02 00:23:1821#include "testing/gtest/include/gtest/gtest.h"
[email protected]b4ead7b2014-04-07 18:12:1822#include "ui/gfx/geometry/quad_f.h"
23#include "ui/gfx/geometry/rect_conversions.h"
[email protected]94f206c12012-08-25 00:09:1424
[email protected]ba565742012-11-10 09:29:4825namespace cc {
[email protected]94f206c12012-08-25 00:09:1426namespace {
27
[email protected]7aad55f2013-07-26 11:25:5328void ExecuteCalculateDrawProperties(LayerImpl* root,
senorblanco2bc7c612016-08-12 19:34:1729 float device_scale_factor,
ajumab784ef42017-04-28 23:01:5230 RenderSurfaceList* render_surface_list) {
[email protected]035441d92013-03-22 23:21:3931 // Sanity check: The test itself should create the root layer's render
32 // surface, so that the surface (and its damage tracker) can
33 // persist across multiple calls to this function.
ajumab784ef42017-04-28 23:01:5234 ASSERT_FALSE(render_surface_list->size());
[email protected]94f206c12012-08-25 00:09:1435
[email protected]7aad55f2013-07-26 11:25:5336 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
ajumab784ef42017-04-28 23:01:5237 root, root->bounds(), device_scale_factor, render_surface_list);
sunxdb365de02016-04-28 20:32:5738 LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
chrishtr7e3aaf22017-05-04 15:04:0139 ASSERT_TRUE(GetRenderSurface(root));
[email protected]94f206c12012-08-25 00:09:1440}
41
sunxdb2e13c92016-04-23 01:00:0542void ClearDamageForAllSurfaces(LayerImpl* root) {
43 for (auto* layer : *root->layer_tree_impl()) {
chrishtr7e3aaf22017-05-04 15:04:0144 if (GetRenderSurface(layer))
45 GetRenderSurface(layer)->damage_tracker()->DidDrawDamagedArea();
sunxdb2e13c92016-04-23 01:00:0546 }
[email protected]94f206c12012-08-25 00:09:1447}
48
jaydasika3a6b14432017-03-21 23:11:1949void EmulateDrawingOneFrame(LayerImpl* root, float device_scale_factor = 1.f) {
[email protected]035441d92013-03-22 23:21:3950 // This emulates only steps that are relevant to testing the damage tracker:
51 // 1. computing the render passes and layerlists
52 // 2. updating all damage trackers in the correct order
[email protected]ed511b8d2013-03-25 03:29:2953 // 3. resetting all update_rects and property_changed flags for all layers
[email protected]035441d92013-03-22 23:21:3954 // and surfaces.
[email protected]94f206c12012-08-25 00:09:1455
ajumab784ef42017-04-28 23:01:5256 RenderSurfaceList render_surface_list;
senorblanco2bc7c612016-08-12 19:34:1757 ExecuteCalculateDrawProperties(root, device_scale_factor,
ajumab784ef42017-04-28 23:01:5258 &render_surface_list);
[email protected]94f206c12012-08-25 00:09:1459
ajuma9c92fa022017-04-18 19:53:0860 DamageTracker::UpdateDamageTracking(root->layer_tree_impl(),
ajumab784ef42017-04-28 23:01:5261 render_surface_list);
[email protected]94f206c12012-08-25 00:09:1462
jaydasikad6f778b2016-05-19 22:51:2663 root->layer_tree_impl()->ResetAllChangeTracking();
[email protected]94f206c12012-08-25 00:09:1464}
65
[email protected]96baf3e2012-10-22 23:09:5566class DamageTrackerTest : public testing::Test {
[email protected]035441d92013-03-22 23:21:3967 public:
reveman34b7a1522015-03-23 20:27:4768 DamageTrackerTest()
pimanc44437a22016-10-29 00:09:2269 : host_impl_(&task_runner_provider_, &task_graph_runner_) {}
[email protected]586d51ed2012-12-07 20:31:4570
vmpstrefb8e7e2017-01-20 23:36:1571 LayerImpl* CreateTestTreeWithOneSurface(int number_of_children) {
rockot2176f922016-06-08 19:18:3272 host_impl_.active_tree()->DetachLayers();
danakj60bc3bc2016-04-09 00:24:4873 std::unique_ptr<LayerImpl> root =
74 LayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]586d51ed2012-12-07 20:31:4575
[email protected]035441d92013-03-22 23:21:3976 root->SetPosition(gfx::PointF());
[email protected]035441d92013-03-22 23:21:3977 root->SetBounds(gfx::Size(500, 500));
[email protected]035441d92013-03-22 23:21:3978 root->SetDrawsContent(true);
jaydasika6b5a32bf2016-04-22 21:56:3679 root->test_properties()->force_render_surface = true;
[email protected]586d51ed2012-12-07 20:31:4580
vmpstrefb8e7e2017-01-20 23:36:1581 for (int i = 0; i < number_of_children; ++i) {
82 std::unique_ptr<LayerImpl> child =
83 LayerImpl::Create(host_impl_.active_tree(), 2 + i);
84 child->SetPosition(gfx::PointF(100.f, 100.f));
85 child->SetBounds(gfx::Size(30, 30));
86 child->SetDrawsContent(true);
87 root->test_properties()->AddChild(std::move(child));
88 }
jaydasikabf1875a2016-06-28 03:39:5989 host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
weiliangcea09f3372017-03-29 16:43:2490 host_impl_.active_tree()->SetElementIdsForTesting();
[email protected]586d51ed2012-12-07 20:31:4591
jaydasikabf1875a2016-06-28 03:39:5992 return host_impl_.active_tree()->root_layer_for_testing();
[email protected]035441d92013-03-22 23:21:3993 }
[email protected]586d51ed2012-12-07 20:31:4594
jaydasikaef64f9e42016-03-12 01:08:1895 LayerImpl* CreateTestTreeWithTwoSurfaces() {
[email protected]035441d92013-03-22 23:21:3996 // This test tree has two render surfaces: one for the root, and one for
97 // child1. Additionally, the root has a second child layer, and child1 has
98 // two children of its own.
[email protected]586d51ed2012-12-07 20:31:4599
rockot2176f922016-06-08 19:18:32100 host_impl_.active_tree()->DetachLayers();
danakj60bc3bc2016-04-09 00:24:48101 std::unique_ptr<LayerImpl> root =
102 LayerImpl::Create(host_impl_.active_tree(), 1);
103 std::unique_ptr<LayerImpl> child1 =
104 LayerImpl::Create(host_impl_.active_tree(), 2);
105 std::unique_ptr<LayerImpl> child2 =
106 LayerImpl::Create(host_impl_.active_tree(), 3);
107 std::unique_ptr<LayerImpl> grand_child1 =
108 LayerImpl::Create(host_impl_.active_tree(), 4);
109 std::unique_ptr<LayerImpl> grand_child2 =
110 LayerImpl::Create(host_impl_.active_tree(), 5);
[email protected]586d51ed2012-12-07 20:31:45111
[email protected]035441d92013-03-22 23:21:39112 root->SetPosition(gfx::PointF());
[email protected]035441d92013-03-22 23:21:39113 root->SetBounds(gfx::Size(500, 500));
[email protected]035441d92013-03-22 23:21:39114 root->SetDrawsContent(true);
jaydasika6b5a32bf2016-04-22 21:56:36115 root->test_properties()->force_render_surface = true;
[email protected]586d51ed2012-12-07 20:31:45116
[email protected]035441d92013-03-22 23:21:39117 child1->SetPosition(gfx::PointF(100.f, 100.f));
[email protected]035441d92013-03-22 23:21:39118 child1->SetBounds(gfx::Size(30, 30));
[email protected]ed511b8d2013-03-25 03:29:29119 // With a child that draws_content, opacity will cause the layer to create
120 // its own RenderSurface. This layer does not draw, but is intended to
awoloszyne83f28c2014-12-22 15:40:00121 // create its own RenderSurface.
[email protected]035441d92013-03-22 23:21:39122 child1->SetDrawsContent(false);
jaydasika6b5a32bf2016-04-22 21:56:36123 child1->test_properties()->force_render_surface = true;
[email protected]586d51ed2012-12-07 20:31:45124
[email protected]035441d92013-03-22 23:21:39125 child2->SetPosition(gfx::PointF(11.f, 11.f));
[email protected]035441d92013-03-22 23:21:39126 child2->SetBounds(gfx::Size(18, 18));
[email protected]035441d92013-03-22 23:21:39127 child2->SetDrawsContent(true);
[email protected]586d51ed2012-12-07 20:31:45128
[email protected]035441d92013-03-22 23:21:39129 grand_child1->SetPosition(gfx::PointF(200.f, 200.f));
[email protected]035441d92013-03-22 23:21:39130 grand_child1->SetBounds(gfx::Size(6, 8));
[email protected]035441d92013-03-22 23:21:39131 grand_child1->SetDrawsContent(true);
[email protected]586d51ed2012-12-07 20:31:45132
[email protected]035441d92013-03-22 23:21:39133 grand_child2->SetPosition(gfx::PointF(190.f, 190.f));
[email protected]035441d92013-03-22 23:21:39134 grand_child2->SetBounds(gfx::Size(6, 8));
[email protected]035441d92013-03-22 23:21:39135 grand_child2->SetDrawsContent(true);
[email protected]586d51ed2012-12-07 20:31:45136
jaydasika89f7b5a2016-06-22 02:08:39137 child1->test_properties()->AddChild(std::move(grand_child1));
138 child1->test_properties()->AddChild(std::move(grand_child2));
139 root->test_properties()->AddChild(std::move(child1));
140 root->test_properties()->AddChild(std::move(child2));
jaydasikabf1875a2016-06-28 03:39:59141 host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
weiliangcea09f3372017-03-29 16:43:24142 host_impl_.active_tree()->SetElementIdsForTesting();
[email protected]586d51ed2012-12-07 20:31:45143
jaydasikabf1875a2016-06-28 03:39:59144 return host_impl_.active_tree()->root_layer_for_testing();
[email protected]035441d92013-03-22 23:21:39145 }
[email protected]586d51ed2012-12-07 20:31:45146
vmpstrefb8e7e2017-01-20 23:36:15147 LayerImpl* CreateAndSetUpTestTreeWithOneSurface(int number_of_children = 1) {
148 LayerImpl* root = CreateTestTreeWithOneSurface(number_of_children);
[email protected]586d51ed2012-12-07 20:31:45149
[email protected]035441d92013-03-22 23:21:39150 // Setup includes going past the first frame which always damages
151 // everything, so that we can actually perform specific tests.
jaydasika16515f52016-03-01 00:28:35152 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18153 EmulateDrawingOneFrame(root);
[email protected]586d51ed2012-12-07 20:31:45154
danakja04855a2015-11-18 20:39:10155 return root;
[email protected]035441d92013-03-22 23:21:39156 }
[email protected]586d51ed2012-12-07 20:31:45157
jaydasikaef64f9e42016-03-12 01:08:18158 LayerImpl* CreateAndSetUpTestTreeWithTwoSurfaces() {
159 LayerImpl* root = CreateTestTreeWithTwoSurfaces();
[email protected]586d51ed2012-12-07 20:31:45160
[email protected]035441d92013-03-22 23:21:39161 // Setup includes going past the first frame which always damages
162 // everything, so that we can actually perform specific tests.
jaydasika16515f52016-03-01 00:28:35163 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18164 EmulateDrawingOneFrame(root);
[email protected]586d51ed2012-12-07 20:31:45165
danakja04855a2015-11-18 20:39:10166 return root;
[email protected]035441d92013-03-22 23:21:39167 }
[email protected]586d51ed2012-12-07 20:31:45168
[email protected]b50e06d2013-03-26 09:16:55169 protected:
khushalsagarb64b360d2015-10-21 19:25:16170 FakeImplTaskRunnerProvider task_runner_provider_;
reveman34b7a1522015-03-23 20:27:47171 TestTaskGraphRunner task_graph_runner_;
[email protected]035441d92013-03-22 23:21:39172 FakeLayerTreeHostImpl host_impl_;
[email protected]94f206c12012-08-25 00:09:14173};
174
[email protected]035441d92013-03-22 23:21:39175TEST_F(DamageTrackerTest, SanityCheckTestTreeWithOneSurface) {
176 // Sanity check that the simple test tree will actually produce the expected
ajumab784ef42017-04-28 23:01:52177 // render surfaces.
[email protected]94f206c12012-08-25 00:09:14178
jaydasikaef64f9e42016-03-12 01:08:18179 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
ajumab784ef42017-04-28 23:01:52180 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:14181
chrishtr7e3aaf22017-05-04 15:04:01182 EXPECT_EQ(2, GetRenderSurface(root)->num_contributors());
ajuma651848a2017-05-01 21:23:45183 EXPECT_TRUE(root->contributes_to_drawn_render_surface());
184 EXPECT_TRUE(child->contributes_to_drawn_render_surface());
[email protected]94f206c12012-08-25 00:09:14185
vmpstrefb8e7e2017-01-20 23:36:15186 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01187 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15188 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:39189
[email protected]b4ead7b2014-04-07 18:12:18190 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07191 EXPECT_TRUE(GetRenderSurface(root)
192 ->damage_tracker()
193 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14194}
195
[email protected]035441d92013-03-22 23:21:39196TEST_F(DamageTrackerTest, SanityCheckTestTreeWithTwoSurfaces) {
197 // Sanity check that the complex test tree will actually produce the expected
ajumab784ef42017-04-28 23:01:52198 // render surfaces.
[email protected]94f206c12012-08-25 00:09:14199
jaydasikaef64f9e42016-03-12 01:08:18200 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
[email protected]94f206c12012-08-25 00:09:14201
jaydasikafc66cfb2016-06-10 04:34:22202 LayerImpl* child1 = root->test_properties()->children[0];
203 LayerImpl* child2 = root->test_properties()->children[1];
vmpstrefb8e7e2017-01-20 23:36:15204
205 gfx::Rect child_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01206 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
207 &child_damage_rect));
vmpstrefb8e7e2017-01-20 23:36:15208 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01209 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15210 &root_damage_rect));
[email protected]94f206c12012-08-25 00:09:14211
chrishtr5f60ca02017-05-11 23:09:49212 EXPECT_NE(GetRenderSurface(child1), GetRenderSurface(root));
213 EXPECT_EQ(GetRenderSurface(child2), GetRenderSurface(root));
chrishtr7e3aaf22017-05-04 15:04:01214 EXPECT_EQ(3, GetRenderSurface(root)->num_contributors());
215 EXPECT_EQ(2, GetRenderSurface(child1)->num_contributors());
[email protected]94f206c12012-08-25 00:09:14216
[email protected]ed511b8d2013-03-25 03:29:29217 // The render surface for child1 only has a content_rect that encloses
[email protected]035441d92013-03-22 23:21:39218 // grand_child1 and grand_child2, because child1 does not draw content.
[email protected]b4ead7b2014-04-07 18:12:18219 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
220 child_damage_rect.ToString());
221 EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07222
223 EXPECT_TRUE(GetRenderSurface(root)
224 ->damage_tracker()
225 ->has_damage_from_contributing_content());
226 EXPECT_TRUE(GetRenderSurface(child1)
227 ->damage_tracker()
228 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14229}
230
[email protected]035441d92013-03-22 23:21:39231TEST_F(DamageTrackerTest, VerifyDamageForUpdateRects) {
jaydasikaef64f9e42016-03-12 01:08:18232 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22233 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:14234
[email protected]035441d92013-03-22 23:21:39235 // CASE 1: Setting the update rect should cause the corresponding damage to
236 // the surface.
jaydasikaef64f9e42016-03-12 01:08:18237 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42238 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
jaydasika16515f52016-03-01 00:28:35239 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18240 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14241
[email protected]035441d92013-03-22 23:21:39242 // Damage position on the surface should be: position of update_rect (10, 11)
243 // relative to the child (100, 100).
vmpstrefb8e7e2017-01-20 23:36:15244 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01245 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15246 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18247 EXPECT_EQ(gfx::Rect(110, 111, 12, 13).ToString(),
248 root_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:14249
[email protected]035441d92013-03-22 23:21:39250 // CASE 2: The same update rect twice in a row still produces the same
251 // damage.
jaydasikaef64f9e42016-03-12 01:08:18252 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42253 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
jaydasika16515f52016-03-01 00:28:35254 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18255 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:01256 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15257 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18258 EXPECT_EQ(gfx::Rect(110, 111, 12, 13).ToString(),
259 root_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:14260
[email protected]035441d92013-03-22 23:21:39261 // CASE 3: Setting a different update rect should cause damage on the new
262 // update region, but no additional exposed old region.
jaydasikaef64f9e42016-03-12 01:08:18263 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42264 child->SetUpdateRect(gfx::Rect(20, 25, 1, 2));
jaydasika16515f52016-03-01 00:28:35265 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18266 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14267
[email protected]035441d92013-03-22 23:21:39268 // Damage position on the surface should be: position of update_rect (20, 25)
269 // relative to the child (100, 100).
chrishtr7e3aaf22017-05-04 15:04:01270 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15271 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18272 EXPECT_EQ(gfx::Rect(120, 125, 1, 2).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07273 EXPECT_TRUE(GetRenderSurface(root)
274 ->damage_tracker()
275 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14276}
277
[email protected]cfa7fd922014-04-29 11:50:03278TEST_F(DamageTrackerTest, VerifyDamageForLayerDamageRects) {
jaydasikaef64f9e42016-03-12 01:08:18279 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22280 LayerImpl* child = root->test_properties()->children[0];
[email protected]cfa7fd922014-04-29 11:50:03281
282 // CASE 1: Adding the layer damage rect should cause the corresponding damage
283 // to the surface.
jaydasikaef64f9e42016-03-12 01:08:18284 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51285 child->AddDamageRect(gfx::Rect(10, 11, 12, 13));
jaydasika16515f52016-03-01 00:28:35286 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18287 EmulateDrawingOneFrame(root);
[email protected]cfa7fd922014-04-29 11:50:03288
289 // Damage position on the surface should be: position of layer damage_rect
290 // (10, 11) relative to the child (100, 100).
vmpstrefb8e7e2017-01-20 23:36:15291 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01292 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15293 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03294 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(110, 111, 12, 13)));
295
296 // CASE 2: The same layer damage rect twice in a row still produces the same
297 // damage.
jaydasikaef64f9e42016-03-12 01:08:18298 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51299 child->AddDamageRect(gfx::Rect(10, 11, 12, 13));
jaydasika16515f52016-03-01 00:28:35300 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18301 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:01302 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15303 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03304 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(110, 111, 12, 13)));
305
306 // CASE 3: Adding a different layer damage rect should cause damage on the
307 // new damaged region, but no additional exposed old region.
jaydasikaef64f9e42016-03-12 01:08:18308 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51309 child->AddDamageRect(gfx::Rect(20, 25, 1, 2));
jaydasika16515f52016-03-01 00:28:35310 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18311 EmulateDrawingOneFrame(root);
[email protected]cfa7fd922014-04-29 11:50:03312
313 // Damage position on the surface should be: position of layer damage_rect
314 // (20, 25) relative to the child (100, 100).
chrishtr7e3aaf22017-05-04 15:04:01315 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15316 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03317 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(120, 125, 1, 2)));
318
319 // CASE 4: Adding multiple layer damage rects should cause a unified
320 // damage on root damage rect.
jaydasikaef64f9e42016-03-12 01:08:18321 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51322 child->AddDamageRect(gfx::Rect(20, 25, 1, 2));
323 child->AddDamageRect(gfx::Rect(10, 15, 3, 4));
jaydasika16515f52016-03-01 00:28:35324 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18325 EmulateDrawingOneFrame(root);
[email protected]cfa7fd922014-04-29 11:50:03326
327 // Damage position on the surface should be: position of layer damage_rect
328 // (20, 25) relative to the child (100, 100).
chrishtr7e3aaf22017-05-04 15:04:01329 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15330 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03331 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(120, 125, 1, 2)));
332 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(110, 115, 3, 4)));
wutao36850732017-07-29 20:24:07333 EXPECT_TRUE(GetRenderSurface(root)
334 ->damage_tracker()
335 ->has_damage_from_contributing_content());
[email protected]cfa7fd922014-04-29 11:50:03336}
337
338TEST_F(DamageTrackerTest, VerifyDamageForLayerUpdateAndDamageRects) {
jaydasikaef64f9e42016-03-12 01:08:18339 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22340 LayerImpl* child = root->test_properties()->children[0];
[email protected]cfa7fd922014-04-29 11:50:03341
342 // CASE 1: Adding the layer damage rect and update rect should cause the
343 // corresponding damage to the surface.
jaydasikaef64f9e42016-03-12 01:08:18344 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51345 child->AddDamageRect(gfx::Rect(5, 6, 12, 13));
danakj19f0c9e2014-10-11 03:24:42346 child->SetUpdateRect(gfx::Rect(15, 16, 14, 10));
jaydasika16515f52016-03-01 00:28:35347 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18348 EmulateDrawingOneFrame(root);
[email protected]cfa7fd922014-04-29 11:50:03349
350 // Damage position on the surface should be: position of unified layer
351 // damage_rect and update rect (5, 6)
352 // relative to the child (100, 100).
vmpstrefb8e7e2017-01-20 23:36:15353 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01354 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15355 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03356 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(105, 106, 24, 20)));
357
358 // CASE 2: The same layer damage rect and update rect twice in a row still
359 // produces the same damage.
jaydasikaef64f9e42016-03-12 01:08:18360 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51361 child->AddDamageRect(gfx::Rect(10, 11, 12, 13));
danakj19f0c9e2014-10-11 03:24:42362 child->SetUpdateRect(gfx::Rect(10, 11, 14, 15));
jaydasika16515f52016-03-01 00:28:35363 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18364 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:01365 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15366 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03367 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(110, 111, 14, 15)));
368
369 // CASE 3: Adding a different layer damage rect and update rect should cause
370 // damage on the new damaged region, but no additional exposed old region.
jaydasikaef64f9e42016-03-12 01:08:18371 ClearDamageForAllSurfaces(root);
danakjd344ab92015-08-28 19:25:51372 child->AddDamageRect(gfx::Rect(20, 25, 2, 3));
danakj19f0c9e2014-10-11 03:24:42373 child->SetUpdateRect(gfx::Rect(5, 10, 7, 8));
jaydasika16515f52016-03-01 00:28:35374 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18375 EmulateDrawingOneFrame(root);
[email protected]cfa7fd922014-04-29 11:50:03376
377 // Damage position on the surface should be: position of unified layer damage
378 // rect and update rect (5, 10) relative to the child (100, 100).
chrishtr7e3aaf22017-05-04 15:04:01379 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15380 &root_damage_rect));
[email protected]cfa7fd922014-04-29 11:50:03381 EXPECT_EQ(true, root_damage_rect.Contains(gfx::Rect(105, 110, 17, 18)));
wutao36850732017-07-29 20:24:07382 EXPECT_TRUE(GetRenderSurface(root)
383 ->damage_tracker()
384 ->has_damage_from_contributing_content());
[email protected]cfa7fd922014-04-29 11:50:03385}
386
[email protected]035441d92013-03-22 23:21:39387TEST_F(DamageTrackerTest, VerifyDamageForPropertyChanges) {
jaydasikaef64f9e42016-03-12 01:08:18388 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22389 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:14390
[email protected]035441d92013-03-22 23:21:39391 // CASE 1: The layer's property changed flag takes priority over update rect.
392 //
jaydasika6b5a32bf2016-04-22 21:56:36393 child->test_properties()->force_render_surface = true;
jaydasika16515f52016-03-01 00:28:35394 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18395 EmulateDrawingOneFrame(root);
396 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42397 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
weiliangcea09f3372017-03-29 16:43:24398 root->layer_tree_impl()->SetOpacityMutated(child->element_id(), 0.5f);
jaydasikaef64f9e42016-03-12 01:08:18399 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14400
chrishtr7e3aaf22017-05-04 15:04:01401 ASSERT_EQ(2, GetRenderSurface(root)->num_contributors());
[email protected]94f206c12012-08-25 00:09:14402
[email protected]035441d92013-03-22 23:21:39403 // Damage should be the entire child layer in target_surface space.
[email protected]b4ead7b2014-04-07 18:12:18404 gfx::Rect expected_rect = gfx::Rect(100, 100, 30, 30);
vmpstrefb8e7e2017-01-20 23:36:15405 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01406 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15407 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18408 EXPECT_EQ(expected_rect.ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07409 EXPECT_TRUE(GetRenderSurface(root)
410 ->damage_tracker()
411 ->has_damage_from_contributing_content());
412 EXPECT_TRUE(GetRenderSurface(child)
413 ->damage_tracker()
414 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14415
[email protected]035441d92013-03-22 23:21:39416 // CASE 2: If a layer moves due to property change, it damages both the new
417 // location and the old (exposed) location. The old location is the
418 // entire old layer, not just the update_rect.
[email protected]94f206c12012-08-25 00:09:14419
[email protected]035441d92013-03-22 23:21:39420 // Cycle one frame of no change, just to sanity check that the next rect is
421 // not because of the old damage state.
jaydasikaef64f9e42016-03-12 01:08:18422 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:35423 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18424 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:01425 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15426 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:39427 EXPECT_TRUE(root_damage_rect.IsEmpty());
[email protected]94f206c12012-08-25 00:09:14428
[email protected]035441d92013-03-22 23:21:39429 // Then, test the actual layer movement.
jaydasikaef64f9e42016-03-12 01:08:18430 ClearDamageForAllSurfaces(root);
ajuma816002e2016-09-23 23:30:42431 gfx::Transform translation;
432 translation.Translate(100.f, 130.f);
weiliangcea09f3372017-03-29 16:43:24433 root->layer_tree_impl()->SetTransformMutated(child->element_id(),
434 translation);
jaydasikaef64f9e42016-03-12 01:08:18435 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14436
[email protected]035441d92013-03-22 23:21:39437 // Expect damage to be the combination of the previous one and the new one.
[email protected]b4ead7b2014-04-07 18:12:18438 expected_rect.Union(gfx::Rect(200, 230, 30, 30));
chrishtr7e3aaf22017-05-04 15:04:01439 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15440 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:39441 EXPECT_FLOAT_RECT_EQ(expected_rect, root_damage_rect);
wutao36850732017-07-29 20:24:07442 EXPECT_TRUE(GetRenderSurface(root)
443 ->damage_tracker()
444 ->has_damage_from_contributing_content());
445 // Transform from browser animation should not be considered as damage from
446 // contributing layer since it is applied to the whole layer which has a
447 // render surface.
448 EXPECT_FALSE(GetRenderSurface(child)
449 ->damage_tracker()
450 ->has_damage_from_contributing_content());
451}
452
453TEST_F(DamageTrackerTest,
454 VerifyDamageForPropertyChangesFromContributingContents) {
455 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
456 LayerImpl* child1 = root->test_properties()->children[0];
457 LayerImpl* child2 = root->test_properties()->children[1];
458 LayerImpl* grandchild1 = child1->test_properties()->children[0];
459
460 // CASE 1: The child1's opacity changed.
461 ClearDamageForAllSurfaces(root);
462 root->layer_tree_impl()->SetOpacityMutated(child1->element_id(), 0.5f);
463 EmulateDrawingOneFrame(root);
464 EXPECT_TRUE(GetRenderSurface(root)
465 ->damage_tracker()
466 ->has_damage_from_contributing_content());
467 EXPECT_FALSE(GetRenderSurface(child1)
468 ->damage_tracker()
469 ->has_damage_from_contributing_content());
470
471 // CASE 2: The layer2's opacity changed.
472 child2->test_properties()->force_render_surface = true;
473 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
474 EmulateDrawingOneFrame(root);
475 ClearDamageForAllSurfaces(root);
476 root->layer_tree_impl()->SetOpacityMutated(child2->element_id(), 0.5f);
477 EmulateDrawingOneFrame(root);
478 EXPECT_TRUE(GetRenderSurface(root)
479 ->damage_tracker()
480 ->has_damage_from_contributing_content());
481 EXPECT_FALSE(GetRenderSurface(child1)
482 ->damage_tracker()
483 ->has_damage_from_contributing_content());
484
485 // CASE 3: The grandchild1's opacity changed.
486 grandchild1->test_properties()->force_render_surface = true;
487 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
488 EmulateDrawingOneFrame(root);
489 ClearDamageForAllSurfaces(root);
490 root->layer_tree_impl()->SetOpacityMutated(grandchild1->element_id(), 0.5f);
491 EmulateDrawingOneFrame(root);
492 EXPECT_TRUE(GetRenderSurface(root)
493 ->damage_tracker()
494 ->has_damage_from_contributing_content());
495 EXPECT_TRUE(GetRenderSurface(child1)
496 ->damage_tracker()
497 ->has_damage_from_contributing_content());
498}
499
500TEST_F(DamageTrackerTest,
501 VerifyDamageForUpdateAndDamageRectsFromContributingContents) {
502 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
503 LayerImpl* child1 = root->test_properties()->children[0];
504 LayerImpl* child2 = root->test_properties()->children[1];
505 LayerImpl* grandchild1 = child1->test_properties()->children[0];
506
507 // CASE 1: Adding the layer1's damage rect and update rect should cause the
508 // corresponding damage to the surface.
509 child1->SetDrawsContent(true);
510 ClearDamageForAllSurfaces(root);
511 child1->AddDamageRect(gfx::Rect(105, 106, 12, 15));
512 child1->SetUpdateRect(gfx::Rect(115, 116, 12, 15));
513 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
514 EmulateDrawingOneFrame(root);
515 EXPECT_TRUE(GetRenderSurface(root)
516 ->damage_tracker()
517 ->has_damage_from_contributing_content());
518 EXPECT_TRUE(GetRenderSurface(child1)
519 ->damage_tracker()
520 ->has_damage_from_contributing_content());
521
522 // CASE 2: Adding the layer2's damage rect and update rect should cause the
523 // corresponding damage to the surface.
524 ClearDamageForAllSurfaces(root);
525 child2->AddDamageRect(gfx::Rect(11, 11, 12, 15));
526 child2->SetUpdateRect(gfx::Rect(12, 12, 12, 15));
527 EmulateDrawingOneFrame(root);
528 EXPECT_TRUE(GetRenderSurface(root)
529 ->damage_tracker()
530 ->has_damage_from_contributing_content());
531 EXPECT_FALSE(GetRenderSurface(child1)
532 ->damage_tracker()
533 ->has_damage_from_contributing_content());
534
535 // CASE 3: Adding the grandchild1's damage rect and update rect should cause
536 // the corresponding damage to the surface.
537 ClearDamageForAllSurfaces(root);
538 grandchild1->AddDamageRect(gfx::Rect(1, 0, 2, 5));
539 grandchild1->SetUpdateRect(gfx::Rect(2, 1, 2, 5));
540 EmulateDrawingOneFrame(root);
541 EXPECT_TRUE(GetRenderSurface(root)
542 ->damage_tracker()
543 ->has_damage_from_contributing_content());
544 EXPECT_TRUE(GetRenderSurface(child1)
545 ->damage_tracker()
546 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14547}
548
jaydasikacf223762016-05-16 23:02:09549TEST_F(DamageTrackerTest, VerifyDamageWhenSurfaceRemoved) {
550 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:22551 LayerImpl* surface = root->test_properties()->children[0];
552 LayerImpl* child = surface->test_properties()->children[0];
jaydasikacf223762016-05-16 23:02:09553 child->SetDrawsContent(true);
554 EmulateDrawingOneFrame(root);
555 ClearDamageForAllSurfaces(root);
556
557 surface->test_properties()->force_render_surface = false;
558 child->SetDrawsContent(false);
559 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
560 EmulateDrawingOneFrame(root);
vmpstrefb8e7e2017-01-20 23:36:15561 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01562 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15563 &root_damage_rect));
jaydasikacf223762016-05-16 23:02:09564 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(),
565 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07566 EXPECT_TRUE(GetRenderSurface(root)
567 ->damage_tracker()
568 ->has_damage_from_contributing_content());
jaydasikacf223762016-05-16 23:02:09569}
570
[email protected]035441d92013-03-22 23:21:39571TEST_F(DamageTrackerTest, VerifyDamageForTransformedLayer) {
572 // If a layer is transformed, the damage rect should still enclose the entire
573 // transformed layer.
[email protected]94f206c12012-08-25 00:09:14574
jaydasikaef64f9e42016-03-12 01:08:18575 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22576 LayerImpl* child = root->test_properties()->children[0];
jaydasika6b5a32bf2016-04-22 21:56:36577 child->test_properties()->force_render_surface = true;
[email protected]94f206c12012-08-25 00:09:14578
[email protected]035441d92013-03-22 23:21:39579 gfx::Transform rotation;
580 rotation.Rotate(45.0);
[email protected]94f206c12012-08-25 00:09:14581
jaydasikaef64f9e42016-03-12 01:08:18582 ClearDamageForAllSurfaces(root);
jaydasika38be7a822016-04-21 16:07:06583 child->test_properties()->transform_origin = gfx::Point3F(
584 child->bounds().width() * 0.5f, child->bounds().height() * 0.5f, 0.f);
[email protected]035441d92013-03-22 23:21:39585 child->SetPosition(gfx::PointF(85.f, 85.f));
jaydasikaadfec8e2016-02-17 02:46:11586 child->NoteLayerPropertyChanged();
jaydasika16515f52016-03-01 00:28:35587 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18588 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14589
[email protected]035441d92013-03-22 23:21:39590 // Sanity check that the layer actually moved to (85, 85), damaging its old
591 // location and new location.
vmpstrefb8e7e2017-01-20 23:36:15592 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01593 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15594 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18595 EXPECT_EQ(gfx::Rect(85, 85, 45, 45).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07596 EXPECT_TRUE(GetRenderSurface(root)
597 ->damage_tracker()
598 ->has_damage_from_contributing_content());
wutaobb1af5a2017-08-16 17:35:35599 // Layer's layer_property_changed_not_from_property_trees_ should be
600 // considered as damage to render surface.
wutao36850732017-07-29 20:24:07601 EXPECT_TRUE(GetRenderSurface(child)
602 ->damage_tracker()
603 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14604
[email protected]035441d92013-03-22 23:21:39605 // With the anchor on the layer's center, now we can test the rotation more
606 // intuitively, since it applies about the layer's anchor.
jaydasikaef64f9e42016-03-12 01:08:18607 ClearDamageForAllSurfaces(root);
weiliangcea09f3372017-03-29 16:43:24608 root->layer_tree_impl()->SetTransformMutated(child->element_id(), rotation);
jaydasikaef64f9e42016-03-12 01:08:18609 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14610
[email protected]035441d92013-03-22 23:21:39611 // Since the child layer is square, rotation by 45 degrees about the center
612 // should increase the size of the expected rect by sqrt(2), centered around
613 // (100, 100). The old exposed region should be fully contained in the new
614 // region.
[email protected]803f6b52013-09-12 00:51:26615 float expected_width = 30.f * sqrt(2.f);
616 float expected_position = 100.f - 0.5f * expected_width;
[email protected]b4ead7b2014-04-07 18:12:18617 gfx::Rect expected_rect = gfx::ToEnclosingRect(gfx::RectF(
618 expected_position, expected_position, expected_width, expected_width));
chrishtr7e3aaf22017-05-04 15:04:01619 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15620 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18621 EXPECT_EQ(expected_rect.ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:07622 EXPECT_TRUE(GetRenderSurface(root)
623 ->damage_tracker()
624 ->has_damage_from_contributing_content());
625 // Transform from browser animation should not be considered as damage from
626 // contributing layer since it is applied to the whole layer which has a
627 // render surface.
628 EXPECT_FALSE(GetRenderSurface(child)
629 ->damage_tracker()
630 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14631}
632
[email protected]035441d92013-03-22 23:21:39633TEST_F(DamageTrackerTest, VerifyDamageForPerspectiveClippedLayer) {
634 // If a layer has a perspective transform that causes w < 0, then not
635 // clipping the layer can cause an invalid damage rect. This test checks that
636 // the w < 0 case is tracked properly.
637 //
638 // The transform is constructed so that if w < 0 clipping is not performed,
639 // the incorrect rect will be very small, specifically: position (500.972504,
640 // 498.544617) and size 0.056610 x 2.910767. Instead, the correctly
641 // transformed rect should actually be very huge (i.e. in theory, -infinity
642 // on the left), and positioned so that the right-most bound rect will be
643 // approximately 501 units in root surface space.
644 //
[email protected]94f206c12012-08-25 00:09:14645
jaydasikaef64f9e42016-03-12 01:08:18646 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22647 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:14648
[email protected]035441d92013-03-22 23:21:39649 gfx::Transform transform;
petermayofba531562016-06-17 21:37:02650 transform.Translate3d(550.0, 500.0, 0.0);
[email protected]035441d92013-03-22 23:21:39651 transform.ApplyPerspectiveDepth(1.0);
652 transform.RotateAboutYAxis(45.0);
653 transform.Translate3d(-50.0, -50.0, 0.0);
[email protected]94f206c12012-08-25 00:09:14654
[email protected]035441d92013-03-22 23:21:39655 // Set up the child
656 child->SetPosition(gfx::PointF(0.f, 0.f));
657 child->SetBounds(gfx::Size(100, 100));
jaydasika10d43fc2016-08-18 04:06:04658 child->test_properties()->transform = transform;
jaydasika16515f52016-03-01 00:28:35659 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18660 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14661
[email protected]035441d92013-03-22 23:21:39662 // Sanity check that the child layer's bounds would actually get clipped by
663 // w < 0, otherwise this test is not actually testing the intended scenario.
petermayod063e7b2017-03-14 12:30:20664 gfx::RectF test_rect(child->position(), gfx::SizeF(child->bounds()));
[email protected]035441d92013-03-22 23:21:39665 bool clipped = false;
petermayod063e7b2017-03-14 12:30:20666 MathUtil::MapQuad(transform, gfx::QuadF(test_rect), &clipped);
[email protected]035441d92013-03-22 23:21:39667 EXPECT_TRUE(clipped);
[email protected]94f206c12012-08-25 00:09:14668
[email protected]035441d92013-03-22 23:21:39669 // Damage the child without moving it.
jaydasika6b5a32bf2016-04-22 21:56:36670 child->test_properties()->force_render_surface = true;
jaydasika16515f52016-03-01 00:28:35671 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18672 EmulateDrawingOneFrame(root);
673 ClearDamageForAllSurfaces(root);
weiliangcea09f3372017-03-29 16:43:24674 root->layer_tree_impl()->SetOpacityMutated(child->element_id(), 0.5f);
jaydasikaef64f9e42016-03-12 01:08:18675 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14676
[email protected]035441d92013-03-22 23:21:39677 // The expected damage should cover the entire root surface (500x500), but we
678 // don't care whether the damage rect was clamped or is larger than the
679 // surface for this test.
vmpstrefb8e7e2017-01-20 23:36:15680 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01681 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15682 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:18683 gfx::Rect damage_we_care_about = gfx::Rect(gfx::Size(500, 500));
[email protected]035441d92013-03-22 23:21:39684 EXPECT_TRUE(root_damage_rect.Contains(damage_we_care_about));
wutao36850732017-07-29 20:24:07685 EXPECT_TRUE(GetRenderSurface(root)
686 ->damage_tracker()
687 ->has_damage_from_contributing_content());
688 EXPECT_FALSE(GetRenderSurface(child)
689 ->damage_tracker()
690 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14691}
692
[email protected]035441d92013-03-22 23:21:39693TEST_F(DamageTrackerTest, VerifyDamageForBlurredSurface) {
jaydasikaef64f9e42016-03-12 01:08:18694 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:22695 LayerImpl* surface = root->test_properties()->children[0];
696 LayerImpl* child = surface->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:14697
[email protected]ae6b1a72013-06-25 18:49:29698 FilterOperations filters;
699 filters.Append(FilterOperation::CreateBlurFilter(5.f));
[email protected]94f206c12012-08-25 00:09:14700
wutao36850732017-07-29 20:24:07701 // Setting the filter should not damage the conrresponding render surface.
jaydasikaef64f9e42016-03-12 01:08:18702 ClearDamageForAllSurfaces(root);
ajumacb2b74432016-07-21 19:11:15703 surface->test_properties()->filters = filters;
jaydasika16515f52016-03-01 00:28:35704 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18705 EmulateDrawingOneFrame(root);
wutao36850732017-07-29 20:24:07706 EXPECT_FALSE(GetRenderSurface(root)
707 ->damage_tracker()
708 ->has_damage_from_contributing_content());
709 EXPECT_FALSE(GetRenderSurface(surface)
710 ->damage_tracker()
711 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14712
[email protected]035441d92013-03-22 23:21:39713 // Setting the update rect should cause the corresponding damage to the
714 // surface, blurred based on the size of the blur filter.
jaydasikaef64f9e42016-03-12 01:08:18715 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42716 child->SetUpdateRect(gfx::Rect(1, 2, 3, 4));
jaydasika16515f52016-03-01 00:28:35717 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18718 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14719
[email protected]35a99a12013-05-09 23:52:29720 // Damage position on the surface should be: position of update_rect (1, 2)
jbroman56c1f9c2016-07-06 19:08:10721 // relative to the child (300, 300), but expanded by the blur outsets
722 // (15, since the blur radius is 5).
vmpstrefb8e7e2017-01-20 23:36:15723 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01724 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15725 &root_damage_rect));
jbroman56c1f9c2016-07-06 19:08:10726 EXPECT_EQ(gfx::Rect(286, 287, 33, 34), root_damage_rect);
wutao36850732017-07-29 20:24:07727 EXPECT_TRUE(GetRenderSurface(root)
728 ->damage_tracker()
729 ->has_damage_from_contributing_content());
730 EXPECT_TRUE(GetRenderSurface(surface)
731 ->damage_tracker()
732 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:14733}
734
[email protected]035441d92013-03-22 23:21:39735TEST_F(DamageTrackerTest, VerifyDamageForImageFilter) {
jaydasikaef64f9e42016-03-12 01:08:18736 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22737 LayerImpl* child = root->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:18738 gfx::Rect root_damage_rect, child_damage_rect;
[email protected]4000abf2012-10-23 04:45:45739
[email protected]035441d92013-03-22 23:21:39740 // Allow us to set damage on child too.
741 child->SetDrawsContent(true);
[email protected]4000abf2012-10-23 04:45:45742
[email protected]1dc7943e2013-09-26 04:41:48743 FilterOperations filters;
Khushal7865b5be2017-11-22 03:12:06744 filters.Append(
745 FilterOperation::CreateReferenceFilter(sk_make_sp<BlurPaintFilter>(
746 2, 2, BlurPaintFilter::TileMode::kClampToBlack_TileMode, nullptr)));
[email protected]4000abf2012-10-23 04:45:45747
[email protected]035441d92013-03-22 23:21:39748 // Setting the filter will damage the whole surface.
jaydasika6b5a32bf2016-04-22 21:56:36749 child->test_properties()->force_render_surface = true;
jaydasika16515f52016-03-01 00:28:35750 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18751 EmulateDrawingOneFrame(root);
wutao36850732017-07-29 20:24:07752 ClearDamageForAllSurfaces(root);
weiliangcea09f3372017-03-29 16:43:24753 child->layer_tree_impl()->SetFilterMutated(child->element_id(), filters);
jaydasika6b5a32bf2016-04-22 21:56:36754 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:01755 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15756 &root_damage_rect));
chrishtr7e3aaf22017-05-04 15:04:01757 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15758 &child_damage_rect));
jbroman56c1f9c2016-07-06 19:08:10759
760 // gfx::Rect(100, 100, 30, 30), expanded by 6px for the 2px blur filter.
761 EXPECT_EQ(gfx::Rect(94, 94, 42, 42), root_damage_rect);
762
763 // gfx::Rect(0, 0, 30, 30), expanded by 6px for the 2px blur filter.
764 EXPECT_EQ(gfx::Rect(-6, -6, 42, 42), child_damage_rect);
[email protected]4000abf2012-10-23 04:45:45765
wutao36850732017-07-29 20:24:07766 EXPECT_TRUE(GetRenderSurface(root)
767 ->damage_tracker()
768 ->has_damage_from_contributing_content());
769 EXPECT_FALSE(GetRenderSurface(child)
770 ->damage_tracker()
771 ->has_damage_from_contributing_content());
772
[email protected]035441d92013-03-22 23:21:39773 // CASE 1: Setting the update rect should damage the whole surface (for now)
jaydasikaef64f9e42016-03-12 01:08:18774 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42775 child->SetUpdateRect(gfx::Rect(1, 1));
jaydasikaef64f9e42016-03-12 01:08:18776 EmulateDrawingOneFrame(root);
[email protected]035441d92013-03-22 23:21:39777
chrishtr7e3aaf22017-05-04 15:04:01778 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15779 &root_damage_rect));
chrishtr7e3aaf22017-05-04 15:04:01780 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15781 &child_damage_rect));
hendrikw920114d2015-08-24 23:38:35782
jbroman56c1f9c2016-07-06 19:08:10783 // gfx::Rect(100, 100, 1, 1), expanded by 6px for the 2px blur filter.
784 EXPECT_EQ(gfx::Rect(94, 94, 13, 13), root_damage_rect);
785
786 // gfx::Rect(0, 0, 1, 1), expanded by 6px for the 2px blur filter.
787 EXPECT_EQ(gfx::Rect(-6, -6, 13, 13), child_damage_rect);
wutao92b485512017-07-29 02:04:17788
wutao36850732017-07-29 20:24:07789 EXPECT_TRUE(GetRenderSurface(root)
790 ->damage_tracker()
791 ->has_damage_from_contributing_content());
792 EXPECT_TRUE(GetRenderSurface(child)
793 ->damage_tracker()
794 ->has_damage_from_contributing_content());
795
wutao92b485512017-07-29 02:04:17796 // CASE 2: No changes, so should not damage the surface.
797 ClearDamageForAllSurfaces(root);
798 EmulateDrawingOneFrame(root);
799
800 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
801 &root_damage_rect));
802 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
803 &child_damage_rect));
804
805 // Should not be expanded by the blur filter.
806 EXPECT_EQ(gfx::Rect(), root_damage_rect);
807 EXPECT_EQ(gfx::Rect(), child_damage_rect);
wutao36850732017-07-29 20:24:07808
809 EXPECT_FALSE(GetRenderSurface(root)
810 ->damage_tracker()
811 ->has_damage_from_contributing_content());
812 EXPECT_FALSE(GetRenderSurface(child)
813 ->damage_tracker()
814 ->has_damage_from_contributing_content());
weiliangcd68cf712016-05-02 23:29:07815}
816
817TEST_F(DamageTrackerTest, VerifyDamageForTransformedImageFilter) {
818 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:22819 LayerImpl* child = root->test_properties()->children[0];
weiliangcd68cf712016-05-02 23:29:07820 gfx::Rect root_damage_rect, child_damage_rect;
821
822 // Allow us to set damage on child too.
823 child->SetDrawsContent(true);
824
825 FilterOperations filters;
Khushal7865b5be2017-11-22 03:12:06826 filters.Append(
827 FilterOperation::CreateReferenceFilter(sk_make_sp<BlurPaintFilter>(
828 2, 2, BlurPaintFilter::TileMode::kClampToBlack_TileMode, nullptr)));
weiliangcd68cf712016-05-02 23:29:07829
830 // Setting the filter will damage the whole surface.
831 gfx::Transform transform;
832 transform.RotateAboutYAxis(60);
833 ClearDamageForAllSurfaces(root);
834 child->test_properties()->force_render_surface = true;
jaydasika10d43fc2016-08-18 04:06:04835 child->test_properties()->transform = transform;
weiliangcd68cf712016-05-02 23:29:07836 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
837 EmulateDrawingOneFrame(root);
weiliangcea09f3372017-03-29 16:43:24838 child->layer_tree_impl()->SetFilterMutated(child->element_id(), filters);
weiliangcd68cf712016-05-02 23:29:07839 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:01840 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15841 &root_damage_rect));
chrishtr7e3aaf22017-05-04 15:04:01842 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15843 &child_damage_rect));
jbroman56c1f9c2016-07-06 19:08:10844
845 // Blur outset is 6px for a 2px blur.
846 int blur_outset = 6;
847 int rotated_outset_left = blur_outset / 2;
848 int expected_rotated_width = (30 + 2 * blur_outset) / 2;
849 gfx::Rect expected_root_damage(100 - rotated_outset_left, 100 - blur_outset,
850 expected_rotated_width, 30 + 2 * blur_outset);
weiliangcd68cf712016-05-02 23:29:07851 expected_root_damage.Union(gfx::Rect(100, 100, 30, 30));
852 EXPECT_EQ(expected_root_damage, root_damage_rect);
jbroman56c1f9c2016-07-06 19:08:10853 EXPECT_EQ(gfx::Rect(-blur_outset, -blur_outset, 30 + 2 * blur_outset,
854 30 + 2 * blur_outset),
855 child_damage_rect);
weiliangcd68cf712016-05-02 23:29:07856
857 // Setting the update rect should damage the whole surface (for now)
858 ClearDamageForAllSurfaces(root);
859 child->SetUpdateRect(gfx::Rect(30, 30));
weiliangcd68cf712016-05-02 23:29:07860 EmulateDrawingOneFrame(root);
861
chrishtr7e3aaf22017-05-04 15:04:01862 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15863 &root_damage_rect));
chrishtr7e3aaf22017-05-04 15:04:01864 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15865 &child_damage_rect));
weiliangcd68cf712016-05-02 23:29:07866
jbroman56c1f9c2016-07-06 19:08:10867 int expect_width = 30 + 2 * blur_outset;
868 int expect_height = 30 + 2 * blur_outset;
869 EXPECT_EQ(gfx::Rect(100 - blur_outset / 2, 100 - blur_outset,
870 expect_width / 2, expect_height),
weiliangcd68cf712016-05-02 23:29:07871 root_damage_rect);
jbroman56c1f9c2016-07-06 19:08:10872 EXPECT_EQ(gfx::Rect(-blur_outset, -blur_outset, expect_width, expect_height),
weiliangcd68cf712016-05-02 23:29:07873 child_damage_rect);
[email protected]4000abf2012-10-23 04:45:45874}
875
senorblanco2bc7c612016-08-12 19:34:17876TEST_F(DamageTrackerTest, VerifyDamageForHighDPIImageFilter) {
877 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
878 LayerImpl* child = root->test_properties()->children[0];
879 gfx::Rect root_damage_rect, child_damage_rect;
880
881 // Allow us to set damage on child too.
882 child->SetDrawsContent(true);
883
884 FilterOperations filters;
885 filters.Append(FilterOperation::CreateBlurFilter(3.f));
886
887 // Setting the filter will damage the whole surface.
888 ClearDamageForAllSurfaces(root);
889 child->test_properties()->force_render_surface = true;
890 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
891 int device_scale_factor = 2;
892 EmulateDrawingOneFrame(root, device_scale_factor);
weiliangcea09f3372017-03-29 16:43:24893 child->layer_tree_impl()->SetFilterMutated(child->element_id(), filters);
senorblanco2bc7c612016-08-12 19:34:17894 EmulateDrawingOneFrame(root, device_scale_factor);
chrishtr7e3aaf22017-05-04 15:04:01895 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15896 &root_damage_rect));
chrishtr7e3aaf22017-05-04 15:04:01897 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15898 &child_damage_rect));
senorblanco2bc7c612016-08-12 19:34:17899
900 // Blur outset is 9px for a 3px blur, scaled up by DSF.
901 int blur_outset = 9 * device_scale_factor;
902 gfx::Rect original_rect(100, 100, 100, 100);
903 gfx::Rect expected_child_damage_rect(60, 60);
904 expected_child_damage_rect.Inset(-blur_outset, -blur_outset);
905 gfx::Rect expected_root_damage_rect(child_damage_rect);
906 expected_root_damage_rect.Offset(200, 200);
907 gfx::Rect expected_total_damage_rect = expected_root_damage_rect;
908 expected_total_damage_rect.Union(original_rect);
909 EXPECT_EQ(expected_total_damage_rect, root_damage_rect);
910 EXPECT_EQ(expected_child_damage_rect, child_damage_rect);
911
912 // Setting the update rect should damage only the affected area (original,
913 // outset by 3 * blur sigma * DSF).
914 ClearDamageForAllSurfaces(root);
915 child->SetUpdateRect(gfx::Rect(30, 30));
916 EmulateDrawingOneFrame(root, device_scale_factor);
917
chrishtr7e3aaf22017-05-04 15:04:01918 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15919 &root_damage_rect));
chrishtr7e3aaf22017-05-04 15:04:01920 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15921 &child_damage_rect));
senorblanco2bc7c612016-08-12 19:34:17922
923 EXPECT_EQ(expected_root_damage_rect, root_damage_rect);
924 EXPECT_EQ(expected_child_damage_rect, child_damage_rect);
925}
926
[email protected]035441d92013-03-22 23:21:39927TEST_F(DamageTrackerTest, VerifyDamageForBackgroundBlurredChild) {
jaydasikaef64f9e42016-03-12 01:08:18928 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:22929 LayerImpl* child1 = root->test_properties()->children[0];
930 LayerImpl* child2 = root->test_properties()->children[1];
[email protected]94f206c12012-08-25 00:09:14931
[email protected]035441d92013-03-22 23:21:39932 // Allow us to set damage on child1 too.
933 child1->SetDrawsContent(true);
[email protected]94f206c12012-08-25 00:09:14934
[email protected]ae6b1a72013-06-25 18:49:29935 FilterOperations filters;
936 filters.Append(FilterOperation::CreateBlurFilter(2.f));
[email protected]94f206c12012-08-25 00:09:14937
[email protected]035441d92013-03-22 23:21:39938 // Setting the filter will damage the whole surface.
jaydasikaef64f9e42016-03-12 01:08:18939 ClearDamageForAllSurfaces(root);
ajuma50bce7e2016-06-24 20:56:04940 child1->test_properties()->background_filters = filters;
941 child1->NoteLayerPropertyChanged();
jaydasika16515f52016-03-01 00:28:35942 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18943 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14944
[email protected]035441d92013-03-22 23:21:39945 // CASE 1: Setting the update rect should cause the corresponding damage to
946 // the surface, blurred based on the size of the child's background
jbroman8eb5fb72016-06-01 18:44:16947 // blur filter. Note that child1's render surface has a size of
948 // 206x208 due to contributions from grand_child1 and grand_child2.
jaydasikaef64f9e42016-03-12 01:08:18949 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42950 root->SetUpdateRect(gfx::Rect(297, 297, 2, 2));
jaydasika16515f52016-03-01 00:28:35951 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18952 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14953
vmpstrefb8e7e2017-01-20 23:36:15954 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:01955 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15956 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:39957 // Damage position on the surface should be a composition of the damage on
958 // the root and on child2. Damage on the root should be: position of
959 // update_rect (297, 297), but expanded by the blur outsets.
[email protected]b4ead7b2014-04-07 18:12:18960 gfx::Rect expected_damage_rect = gfx::Rect(297, 297, 2, 2);
[email protected]94f206c12012-08-25 00:09:14961
jbroman56c1f9c2016-07-06 19:08:10962 // 6px spread for a 2px blur.
963 expected_damage_rect.Inset(-6, -6, -6, -6);
[email protected]b4ead7b2014-04-07 18:12:18964 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:14965
[email protected]035441d92013-03-22 23:21:39966 // CASE 2: Setting the update rect should cause the corresponding damage to
967 // the surface, blurred based on the size of the child's background
968 // blur filter. Since the damage extends to the right/bottom outside
969 // of the blurred layer, only the left/top should end up expanded.
jaydasikaef64f9e42016-03-12 01:08:18970 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42971 root->SetUpdateRect(gfx::Rect(297, 297, 30, 30));
jaydasika16515f52016-03-01 00:28:35972 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18973 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14974
chrishtr7e3aaf22017-05-04 15:04:01975 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15976 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:39977 // Damage position on the surface should be a composition of the damage on
978 // the root and on child2. Damage on the root should be: position of
979 // update_rect (297, 297), but expanded on the left/top by the blur outsets.
[email protected]b4ead7b2014-04-07 18:12:18980 expected_damage_rect = gfx::Rect(297, 297, 30, 30);
[email protected]94f206c12012-08-25 00:09:14981
jbroman56c1f9c2016-07-06 19:08:10982 // 6px spread for a 2px blur.
983 expected_damage_rect.Inset(-6, -6, 0, 0);
[email protected]b4ead7b2014-04-07 18:12:18984 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:14985
[email protected]ed511b8d2013-03-25 03:29:29986 // CASE 3: Setting this update rect outside the blurred content_bounds of the
[email protected]035441d92013-03-22 23:21:39987 // blurred child1 will not cause it to be expanded.
jaydasikaef64f9e42016-03-12 01:08:18988 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:42989 root->SetUpdateRect(gfx::Rect(30, 30, 2, 2));
jaydasika16515f52016-03-01 00:28:35990 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:18991 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:14992
chrishtr7e3aaf22017-05-04 15:04:01993 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:15994 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:39995 // Damage on the root should be: position of update_rect (30, 30), not
996 // expanded.
[email protected]b4ead7b2014-04-07 18:12:18997 expected_damage_rect = gfx::Rect(30, 30, 2, 2);
[email protected]94f206c12012-08-25 00:09:14998
[email protected]b4ead7b2014-04-07 18:12:18999 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:141000
[email protected]ed511b8d2013-03-25 03:29:291001 // CASE 4: Setting this update rect inside the blurred content_bounds but
1002 // outside the original content_bounds of the blurred child1 will
[email protected]035441d92013-03-22 23:21:391003 // cause it to be expanded.
jaydasikaef64f9e42016-03-12 01:08:181004 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421005 root->SetUpdateRect(gfx::Rect(99, 99, 1, 1));
jaydasika16515f52016-03-01 00:28:351006 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181007 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141008
chrishtr7e3aaf22017-05-04 15:04:011009 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151010 &root_damage_rect));
jbroman8eb5fb72016-06-01 18:44:161011 // Damage on the root should be: the originally damaged rect (99,99 1x1)
1012 // plus the rect that can influence with a 2px blur (93,93 13x13) intersected
1013 // with the surface rect (100,100 206x208). So no additional damage occurs
1014 // above or to the left, but there is additional damage within the blurred
1015 // area.
1016 expected_damage_rect = gfx::Rect(99, 99, 7, 7);
[email protected]b4ead7b2014-04-07 18:12:181017 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
[email protected]035441d92013-03-22 23:21:391018
1019 // CASE 5: Setting the update rect on child2, which is above child1, will
1020 // not get blurred by child1, so it does not need to get expanded.
jaydasikaef64f9e42016-03-12 01:08:181021 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421022 child2->SetUpdateRect(gfx::Rect(1, 1));
jaydasika16515f52016-03-01 00:28:351023 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181024 EmulateDrawingOneFrame(root);
[email protected]035441d92013-03-22 23:21:391025
chrishtr7e3aaf22017-05-04 15:04:011026 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151027 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391028 // Damage on child2 should be: position of update_rect offset by the child's
1029 // position (11, 11), and not expanded by anything.
[email protected]b4ead7b2014-04-07 18:12:181030 expected_damage_rect = gfx::Rect(11, 11, 1, 1);
[email protected]035441d92013-03-22 23:21:391031
[email protected]b4ead7b2014-04-07 18:12:181032 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
[email protected]035441d92013-03-22 23:21:391033
1034 // CASE 6: Setting the update rect on child1 will also blur the damage, so
1035 // that any pixels needed for the blur are redrawn in the current
1036 // frame.
jaydasikaef64f9e42016-03-12 01:08:181037 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421038 child1->SetUpdateRect(gfx::Rect(1, 1));
jaydasika16515f52016-03-01 00:28:351039 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181040 EmulateDrawingOneFrame(root);
[email protected]035441d92013-03-22 23:21:391041
chrishtr7e3aaf22017-05-04 15:04:011042 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151043 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391044 // Damage on child1 should be: position of update_rect offset by the child's
1045 // position (100, 100), and expanded by the damage.
[email protected]035441d92013-03-22 23:21:391046
jbroman8eb5fb72016-06-01 18:44:161047 // Damage should be (0,0 1x1), offset by the 100,100 offset of child1 in
1048 // root, and expanded 6px for the 2px blur (i.e., 94,94 13x13), but there
1049 // should be no damage outside child1 (i.e. none above or to the left of
1050 // 100,100.
1051 expected_damage_rect = gfx::Rect(100, 100, 7, 7);
[email protected]b4ead7b2014-04-07 18:12:181052 EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
wutao92b485512017-07-29 02:04:171053
1054 // CASE 7: No changes, so should not damage the surface.
1055 ClearDamageForAllSurfaces(root);
1056 // We want to make sure that the background filter doesn't cause empty damage
1057 // to get expanded. We position child1 so that an expansion of the empty rect
1058 // would have non-empty intersection with child1 in its target space (root
1059 // space).
1060 child1->SetPosition(gfx::PointF());
1061 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1062 EmulateDrawingOneFrame(root);
1063
1064 gfx::Rect child_damage_rect;
1065 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
1066 &root_damage_rect));
1067 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1068 &child_damage_rect));
1069
1070 // Should not be expanded by the blur filter.
1071 EXPECT_EQ(gfx::Rect(), root_damage_rect);
1072 EXPECT_EQ(gfx::Rect(), child_damage_rect);
[email protected]94f206c12012-08-25 00:09:141073}
1074
[email protected]035441d92013-03-22 23:21:391075TEST_F(DamageTrackerTest, VerifyDamageForAddingAndRemovingLayer) {
jaydasikaef64f9e42016-03-12 01:08:181076 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:221077 LayerImpl* child1 = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:141078
[email protected]035441d92013-03-22 23:21:391079 // CASE 1: Adding a new layer should cause the appropriate damage.
1080 //
jaydasikaef64f9e42016-03-12 01:08:181081 ClearDamageForAllSurfaces(root);
[email protected]035441d92013-03-22 23:21:391082 {
danakj60bc3bc2016-04-09 00:24:481083 std::unique_ptr<LayerImpl> child2 =
1084 LayerImpl::Create(host_impl_.active_tree(), 3);
[email protected]035441d92013-03-22 23:21:391085 child2->SetPosition(gfx::PointF(400.f, 380.f));
[email protected]035441d92013-03-22 23:21:391086 child2->SetBounds(gfx::Size(6, 8));
[email protected]035441d92013-03-22 23:21:391087 child2->SetDrawsContent(true);
jaydasika89f7b5a2016-06-22 02:08:391088 root->test_properties()->AddChild(std::move(child2));
[email protected]035441d92013-03-22 23:21:391089 }
jaydasika16515f52016-03-01 00:28:351090 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181091 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141092
[email protected]035441d92013-03-22 23:21:391093 // Sanity check - all 3 layers should be on the same render surface; render
1094 // surfaces are tested elsewhere.
chrishtr7e3aaf22017-05-04 15:04:011095 ASSERT_EQ(3, GetRenderSurface(root)->num_contributors());
[email protected]94f206c12012-08-25 00:09:141096
vmpstrefb8e7e2017-01-20 23:36:151097 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011098 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151099 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181100 EXPECT_EQ(gfx::Rect(400, 380, 6, 8).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071101 EXPECT_TRUE(GetRenderSurface(root)
1102 ->damage_tracker()
1103 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141104
[email protected]035441d92013-03-22 23:21:391105 // CASE 2: If the layer is removed, its entire old layer becomes exposed, not
1106 // just the last update rect.
[email protected]94f206c12012-08-25 00:09:141107
[email protected]035441d92013-03-22 23:21:391108 // Advance one frame without damage so that we know the damage rect is not
1109 // leftover from the previous case.
jaydasikaef64f9e42016-03-12 01:08:181110 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:351111 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181112 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141113
chrishtr7e3aaf22017-05-04 15:04:011114 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151115 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391116 EXPECT_TRUE(root_damage_rect.IsEmpty());
1117
1118 // Then, test removing child1.
jaydasika89f7b5a2016-06-22 02:08:391119 root->test_properties()->RemoveChild(child1);
Ivan Kotenkov05d57542017-10-25 06:47:001120 child1 = nullptr;
jaydasika16515f52016-03-01 00:28:351121 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181122 EmulateDrawingOneFrame(root);
[email protected]035441d92013-03-22 23:21:391123
chrishtr7e3aaf22017-05-04 15:04:011124 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151125 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181126 EXPECT_EQ(gfx::Rect(100, 100, 30, 30).ToString(),
1127 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071128 EXPECT_TRUE(GetRenderSurface(root)
1129 ->damage_tracker()
1130 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141131}
1132
[email protected]035441d92013-03-22 23:21:391133TEST_F(DamageTrackerTest, VerifyDamageForNewUnchangedLayer) {
1134 // If child2 is added to the layer tree, but it doesn't have any explicit
1135 // damage of its own, it should still indeed damage the target surface.
[email protected]94f206c12012-08-25 00:09:141136
jaydasikaef64f9e42016-03-12 01:08:181137 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
[email protected]94f206c12012-08-25 00:09:141138
jaydasikaef64f9e42016-03-12 01:08:181139 ClearDamageForAllSurfaces(root);
[email protected]035441d92013-03-22 23:21:391140 {
danakj60bc3bc2016-04-09 00:24:481141 std::unique_ptr<LayerImpl> child2 =
1142 LayerImpl::Create(host_impl_.active_tree(), 3);
[email protected]035441d92013-03-22 23:21:391143 child2->SetPosition(gfx::PointF(400.f, 380.f));
[email protected]035441d92013-03-22 23:21:391144 child2->SetBounds(gfx::Size(6, 8));
[email protected]035441d92013-03-22 23:21:391145 child2->SetDrawsContent(true);
jaydasika89f7b5a2016-06-22 02:08:391146 root->test_properties()->AddChild(std::move(child2));
jaydasika4b0fd7512016-06-09 18:12:531147 root->layer_tree_impl()->BuildLayerListForTesting();
jaydasikad6f778b2016-05-19 22:51:261148 host_impl_.active_tree()->ResetAllChangeTracking();
jaydasikaef64f9e42016-03-12 01:08:181149 LayerImpl* child2_ptr = host_impl_.active_tree()->LayerById(3);
[email protected]035441d92013-03-22 23:21:391150 // Sanity check the initial conditions of the test, if these asserts
1151 // trigger, it means the test no longer actually covers the intended
1152 // scenario.
jaydasikaef64f9e42016-03-12 01:08:181153 ASSERT_FALSE(child2_ptr->LayerPropertyChanged());
1154 ASSERT_TRUE(child2_ptr->update_rect().IsEmpty());
[email protected]035441d92013-03-22 23:21:391155 }
jaydasika16515f52016-03-01 00:28:351156 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181157 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141158
[email protected]035441d92013-03-22 23:21:391159 // Sanity check - all 3 layers should be on the same render surface; render
1160 // surfaces are tested elsewhere.
chrishtr7e3aaf22017-05-04 15:04:011161 ASSERT_EQ(3, GetRenderSurface(root)->num_contributors());
[email protected]94f206c12012-08-25 00:09:141162
vmpstrefb8e7e2017-01-20 23:36:151163 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011164 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151165 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181166 EXPECT_EQ(gfx::Rect(400, 380, 6, 8).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071167 EXPECT_TRUE(GetRenderSurface(root)
1168 ->damage_tracker()
1169 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141170}
1171
[email protected]035441d92013-03-22 23:21:391172TEST_F(DamageTrackerTest, VerifyDamageForMultipleLayers) {
jaydasikaef64f9e42016-03-12 01:08:181173 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:221174 LayerImpl* child1 = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:141175
[email protected]035441d92013-03-22 23:21:391176 // In this test we don't want the above tree manipulation to be considered
1177 // part of the same frame.
jaydasikaef64f9e42016-03-12 01:08:181178 ClearDamageForAllSurfaces(root);
[email protected]035441d92013-03-22 23:21:391179 {
danakj60bc3bc2016-04-09 00:24:481180 std::unique_ptr<LayerImpl> child2 =
1181 LayerImpl::Create(host_impl_.active_tree(), 3);
[email protected]035441d92013-03-22 23:21:391182 child2->SetPosition(gfx::PointF(400.f, 380.f));
[email protected]035441d92013-03-22 23:21:391183 child2->SetBounds(gfx::Size(6, 8));
[email protected]035441d92013-03-22 23:21:391184 child2->SetDrawsContent(true);
jaydasika89f7b5a2016-06-22 02:08:391185 root->test_properties()->AddChild(std::move(child2));
[email protected]035441d92013-03-22 23:21:391186 }
jaydasikafc66cfb2016-06-10 04:34:221187 LayerImpl* child2 = root->test_properties()->children[1];
jaydasika16515f52016-03-01 00:28:351188 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181189 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141190
[email protected]035441d92013-03-22 23:21:391191 // Damaging two layers simultaneously should cause combined damage.
[email protected]b4ead7b2014-04-07 18:12:181192 // - child1 update rect in surface space: gfx::Rect(100, 100, 1, 2);
1193 // - child2 update rect in surface space: gfx::Rect(400, 380, 3, 4);
jaydasikaef64f9e42016-03-12 01:08:181194 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421195 child1->SetUpdateRect(gfx::Rect(1, 2));
1196 child2->SetUpdateRect(gfx::Rect(3, 4));
jaydasika16515f52016-03-01 00:28:351197 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181198 EmulateDrawingOneFrame(root);
vmpstrefb8e7e2017-01-20 23:36:151199 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011200 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151201 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181202 EXPECT_EQ(gfx::Rect(100, 100, 303, 284).ToString(),
1203 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071204 EXPECT_TRUE(GetRenderSurface(root)
1205 ->damage_tracker()
1206 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141207}
1208
[email protected]035441d92013-03-22 23:21:391209TEST_F(DamageTrackerTest, VerifyDamageForNestedSurfaces) {
jaydasikaef64f9e42016-03-12 01:08:181210 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:221211 LayerImpl* child1 = root->test_properties()->children[0];
1212 LayerImpl* child2 = root->test_properties()->children[1];
1213 LayerImpl* grand_child1 =
1214 root->test_properties()->children[0]->test_properties()->children[0];
jaydasika6b5a32bf2016-04-22 21:56:361215 child2->test_properties()->force_render_surface = true;
1216 grand_child1->test_properties()->force_render_surface = true;
jaydasika16515f52016-03-01 00:28:351217 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181218 EmulateDrawingOneFrame(root);
[email protected]b4ead7b2014-04-07 18:12:181219 gfx::Rect child_damage_rect;
1220 gfx::Rect root_damage_rect;
[email protected]94f206c12012-08-25 00:09:141221
[email protected]035441d92013-03-22 23:21:391222 // CASE 1: Damage to a descendant surface should propagate properly to
1223 // ancestor surface.
jaydasikaef64f9e42016-03-12 01:08:181224 ClearDamageForAllSurfaces(root);
weiliangcea09f3372017-03-29 16:43:241225 root->layer_tree_impl()->SetOpacityMutated(grand_child1->element_id(), 0.5f);
jaydasikaef64f9e42016-03-12 01:08:181226 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011227 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1228 &child_damage_rect));
1229 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151230 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181231 EXPECT_EQ(gfx::Rect(200, 200, 6, 8).ToString(), child_damage_rect.ToString());
1232 EXPECT_EQ(gfx::Rect(300, 300, 6, 8).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071233 EXPECT_TRUE(GetRenderSurface(root)
1234 ->damage_tracker()
1235 ->has_damage_from_contributing_content());
1236 EXPECT_TRUE(GetRenderSurface(child1)
1237 ->damage_tracker()
1238 ->has_damage_from_contributing_content());
1239 EXPECT_FALSE(GetRenderSurface(child2)
1240 ->damage_tracker()
1241 ->has_damage_from_contributing_content());
1242 EXPECT_FALSE(GetRenderSurface(grand_child1)
1243 ->damage_tracker()
1244 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141245
[email protected]035441d92013-03-22 23:21:391246 // CASE 2: Same as previous case, but with additional damage elsewhere that
1247 // should be properly unioned.
1248 // - child1 surface damage in root surface space:
[email protected]b4ead7b2014-04-07 18:12:181249 // gfx::Rect(300, 300, 6, 8);
[email protected]035441d92013-03-22 23:21:391250 // - child2 damage in root surface space:
[email protected]b4ead7b2014-04-07 18:12:181251 // gfx::Rect(11, 11, 18, 18);
jaydasikaef64f9e42016-03-12 01:08:181252 ClearDamageForAllSurfaces(root);
weiliangcea09f3372017-03-29 16:43:241253 root->layer_tree_impl()->SetOpacityMutated(grand_child1->element_id(), 0.7f);
1254 root->layer_tree_impl()->SetOpacityMutated(child2->element_id(), 0.7f);
jaydasikaef64f9e42016-03-12 01:08:181255 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011256 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1257 &child_damage_rect));
1258 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151259 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181260 EXPECT_EQ(gfx::Rect(200, 200, 6, 8).ToString(), child_damage_rect.ToString());
1261 EXPECT_EQ(gfx::Rect(11, 11, 295, 297).ToString(),
1262 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071263 EXPECT_TRUE(GetRenderSurface(root)
1264 ->damage_tracker()
1265 ->has_damage_from_contributing_content());
1266 EXPECT_TRUE(GetRenderSurface(child1)
1267 ->damage_tracker()
1268 ->has_damage_from_contributing_content());
1269 EXPECT_FALSE(GetRenderSurface(child2)
1270 ->damage_tracker()
1271 ->has_damage_from_contributing_content());
1272 EXPECT_FALSE(GetRenderSurface(grand_child1)
1273 ->damage_tracker()
1274 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141275}
1276
[email protected]035441d92013-03-22 23:21:391277TEST_F(DamageTrackerTest, VerifyDamageForSurfaceChangeFromDescendantLayer) {
1278 // If descendant layer changes and affects the content bounds of the render
1279 // surface, then the entire descendant surface should be damaged, and it
1280 // should damage its ancestor surface with the old and new surface regions.
[email protected]94f206c12012-08-25 00:09:141281
[email protected]035441d92013-03-22 23:21:391282 // This is a tricky case, since only the first grand_child changes, but the
1283 // entire surface should be marked dirty.
[email protected]94f206c12012-08-25 00:09:141284
jaydasikaef64f9e42016-03-12 01:08:181285 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:221286 LayerImpl* child1 = root->test_properties()->children[0];
1287 LayerImpl* grand_child1 =
1288 root->test_properties()->children[0]->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:181289 gfx::Rect child_damage_rect;
1290 gfx::Rect root_damage_rect;
[email protected]94f206c12012-08-25 00:09:141291
jaydasikaef64f9e42016-03-12 01:08:181292 ClearDamageForAllSurfaces(root);
[email protected]035441d92013-03-22 23:21:391293 grand_child1->SetPosition(gfx::PointF(195.f, 205.f));
jaydasika16515f52016-03-01 00:28:351294 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181295 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011296 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1297 &child_damage_rect));
1298 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151299 &root_damage_rect));
[email protected]94f206c12012-08-25 00:09:141300
[email protected]035441d92013-03-22 23:21:391301 // The new surface bounds should be damaged entirely, even though only one of
1302 // the layers changed.
[email protected]b4ead7b2014-04-07 18:12:181303 EXPECT_EQ(gfx::Rect(190, 190, 11, 23).ToString(),
1304 child_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:141305
[email protected]035441d92013-03-22 23:21:391306 // Damage to the root surface should be the union of child1's *entire* render
1307 // surface (in target space), and its old exposed area (also in target
1308 // space).
[email protected]b4ead7b2014-04-07 18:12:181309 EXPECT_EQ(gfx::Rect(290, 290, 16, 23).ToString(),
1310 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071311
1312 EXPECT_TRUE(GetRenderSurface(root)
1313 ->damage_tracker()
1314 ->has_damage_from_contributing_content());
1315 EXPECT_TRUE(GetRenderSurface(child1)
1316 ->damage_tracker()
1317 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141318}
1319
[email protected]035441d92013-03-22 23:21:391320TEST_F(DamageTrackerTest, VerifyDamageForSurfaceChangeFromAncestorLayer) {
1321 // An ancestor/owning layer changes that affects the position/transform of
[email protected]ed511b8d2013-03-25 03:29:291322 // the render surface. Note that in this case, the layer_property_changed flag
[email protected]035441d92013-03-22 23:21:391323 // already propagates to the subtree (tested in LayerImpltest), which damages
1324 // the entire child1 surface, but the damage tracker still needs the correct
1325 // logic to compute the exposed region on the root surface.
[email protected]94f206c12012-08-25 00:09:141326
[email protected]27d851ab2013-06-28 01:09:501327 // TODO(shawnsingh): the expectations of this test case should change when we
1328 // add support for a unique scissor_rect per RenderSurface. In that case, the
1329 // child1 surface should be completely unchanged, since we are only
1330 // transforming it, while the root surface would be damaged appropriately.
[email protected]94f206c12012-08-25 00:09:141331
jaydasikaef64f9e42016-03-12 01:08:181332 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:221333 LayerImpl* child1 = root->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:181334 gfx::Rect child_damage_rect;
1335 gfx::Rect root_damage_rect;
[email protected]94f206c12012-08-25 00:09:141336
jaydasikaef64f9e42016-03-12 01:08:181337 ClearDamageForAllSurfaces(root);
ajuma816002e2016-09-23 23:30:421338 gfx::Transform translation;
1339 translation.Translate(-50.f, -50.f);
weiliangcea09f3372017-03-29 16:43:241340 root->layer_tree_impl()->SetTransformMutated(child1->element_id(),
1341 translation);
jaydasikaef64f9e42016-03-12 01:08:181342 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011343 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1344 &child_damage_rect));
1345 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151346 &root_damage_rect));
[email protected]94f206c12012-08-25 00:09:141347
[email protected]035441d92013-03-22 23:21:391348 // The new surface bounds should be damaged entirely.
[email protected]b4ead7b2014-04-07 18:12:181349 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
1350 child_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:141351
[email protected]035441d92013-03-22 23:21:391352 // The entire child1 surface and the old exposed child1 surface should damage
1353 // the root surface.
[email protected]b4ead7b2014-04-07 18:12:181354 // - old child1 surface in target space: gfx::Rect(290, 290, 16, 18)
1355 // - new child1 surface in target space: gfx::Rect(240, 240, 16, 18)
1356 EXPECT_EQ(gfx::Rect(240, 240, 66, 68).ToString(),
1357 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071358
1359 EXPECT_TRUE(GetRenderSurface(root)
1360 ->damage_tracker()
1361 ->has_damage_from_contributing_content());
1362 EXPECT_FALSE(GetRenderSurface(child1)
1363 ->damage_tracker()
1364 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141365}
1366
[email protected]035441d92013-03-22 23:21:391367TEST_F(DamageTrackerTest, VerifyDamageForAddingAndRemovingRenderSurfaces) {
jaydasikaef64f9e42016-03-12 01:08:181368 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:221369 LayerImpl* child1 = root->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:181370 gfx::Rect child_damage_rect;
1371 gfx::Rect root_damage_rect;
[email protected]94f206c12012-08-25 00:09:141372
[email protected]035441d92013-03-22 23:21:391373 // CASE 1: If a descendant surface disappears, its entire old area becomes
1374 // exposed.
jaydasikaef64f9e42016-03-12 01:08:181375 ClearDamageForAllSurfaces(root);
jaydasika6b5a32bf2016-04-22 21:56:361376 child1->test_properties()->force_render_surface = false;
jaydasika16515f52016-03-01 00:28:351377 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181378 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141379
[email protected]035441d92013-03-22 23:21:391380 // Sanity check that there is only one surface now.
chrishtr5f60ca02017-05-11 23:09:491381 ASSERT_EQ(GetRenderSurface(child1), GetRenderSurface(root));
chrishtr7e3aaf22017-05-04 15:04:011382 ASSERT_EQ(4, GetRenderSurface(root)->num_contributors());
[email protected]94f206c12012-08-25 00:09:141383
chrishtr7e3aaf22017-05-04 15:04:011384 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151385 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181386 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(),
1387 root_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:141388
wutao36850732017-07-29 20:24:071389 EXPECT_TRUE(GetRenderSurface(root)
1390 ->damage_tracker()
1391 ->has_damage_from_contributing_content());
1392
[email protected]035441d92013-03-22 23:21:391393 // CASE 2: If a descendant surface appears, its entire old area becomes
1394 // exposed.
[email protected]94f206c12012-08-25 00:09:141395
[email protected]035441d92013-03-22 23:21:391396 // Cycle one frame of no change, just to sanity check that the next rect is
1397 // not because of the old damage state.
jaydasikaef64f9e42016-03-12 01:08:181398 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:351399 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181400 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011401 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151402 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391403 EXPECT_TRUE(root_damage_rect.IsEmpty());
[email protected]94f206c12012-08-25 00:09:141404
[email protected]035441d92013-03-22 23:21:391405 // Then change the tree so that the render surface is added back.
jaydasikaef64f9e42016-03-12 01:08:181406 ClearDamageForAllSurfaces(root);
jaydasika6b5a32bf2016-04-22 21:56:361407 child1->test_properties()->force_render_surface = true;
awoloszyne83f28c2014-12-22 15:40:001408
jaydasika16515f52016-03-01 00:28:351409 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181410 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141411
[email protected]035441d92013-03-22 23:21:391412 // Sanity check that there is a new surface now.
chrishtr7e3aaf22017-05-04 15:04:011413 ASSERT_TRUE(GetRenderSurface(child1));
1414 EXPECT_EQ(3, GetRenderSurface(root)->num_contributors());
1415 EXPECT_EQ(2, GetRenderSurface(child1)->num_contributors());
[email protected]94f206c12012-08-25 00:09:141416
chrishtr7e3aaf22017-05-04 15:04:011417 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1418 &child_damage_rect));
1419 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151420 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181421 EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
1422 child_damage_rect.ToString());
1423 EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(),
1424 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071425 EXPECT_TRUE(GetRenderSurface(root)
1426 ->damage_tracker()
1427 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141428}
1429
[email protected]035441d92013-03-22 23:21:391430TEST_F(DamageTrackerTest, VerifyNoDamageWhenNothingChanged) {
jaydasikaef64f9e42016-03-12 01:08:181431 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:221432 LayerImpl* child1 = root->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:181433 gfx::Rect child_damage_rect;
1434 gfx::Rect root_damage_rect;
[email protected]94f206c12012-08-25 00:09:141435
[email protected]035441d92013-03-22 23:21:391436 // CASE 1: If nothing changes, the damage rect should be empty.
1437 //
jaydasikaef64f9e42016-03-12 01:08:181438 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:351439 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181440 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011441 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1442 &child_damage_rect));
1443 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151444 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391445 EXPECT_TRUE(child_damage_rect.IsEmpty());
1446 EXPECT_TRUE(root_damage_rect.IsEmpty());
wutao36850732017-07-29 20:24:071447 EXPECT_FALSE(GetRenderSurface(root)
1448 ->damage_tracker()
1449 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141450
[email protected]035441d92013-03-22 23:21:391451 // CASE 2: If nothing changes twice in a row, the damage rect should still be
1452 // empty.
1453 //
jaydasikaef64f9e42016-03-12 01:08:181454 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:351455 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181456 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011457 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1458 &child_damage_rect));
1459 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151460 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391461 EXPECT_TRUE(child_damage_rect.IsEmpty());
1462 EXPECT_TRUE(root_damage_rect.IsEmpty());
wutao36850732017-07-29 20:24:071463 EXPECT_FALSE(GetRenderSurface(root)
1464 ->damage_tracker()
1465 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141466}
1467
[email protected]035441d92013-03-22 23:21:391468TEST_F(DamageTrackerTest, VerifyNoDamageForUpdateRectThatDoesNotDrawContent) {
jaydasikaef64f9e42016-03-12 01:08:181469 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
jaydasikafc66cfb2016-06-10 04:34:221470 LayerImpl* child1 = root->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:181471 gfx::Rect child_damage_rect;
1472 gfx::Rect root_damage_rect;
[email protected]94f206c12012-08-25 00:09:141473
[email protected]035441d92013-03-22 23:21:391474 // In our specific tree, the update rect of child1 should not cause any
1475 // damage to any surface because it does not actually draw content.
jaydasikaef64f9e42016-03-12 01:08:181476 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421477 child1->SetUpdateRect(gfx::Rect(1, 2));
jaydasika16515f52016-03-01 00:28:351478 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181479 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011480 EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1481 &child_damage_rect));
1482 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151483 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391484 EXPECT_TRUE(child_damage_rect.IsEmpty());
1485 EXPECT_TRUE(root_damage_rect.IsEmpty());
wutao36850732017-07-29 20:24:071486 EXPECT_FALSE(GetRenderSurface(root)
1487 ->damage_tracker()
1488 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141489}
1490
[email protected]035441d92013-03-22 23:21:391491TEST_F(DamageTrackerTest, VerifyDamageForMask) {
jaydasikaef64f9e42016-03-12 01:08:181492 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:221493 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:141494
[email protected]035441d92013-03-22 23:21:391495 // In the current implementation of the damage tracker, changes to mask
1496 // layers should damage the entire corresponding surface.
[email protected]94f206c12012-08-25 00:09:141497
jaydasikaef64f9e42016-03-12 01:08:181498 ClearDamageForAllSurfaces(root);
[email protected]94f206c12012-08-25 00:09:141499
[email protected]035441d92013-03-22 23:21:391500 // Set up the mask layer.
1501 {
danakj60bc3bc2016-04-09 00:24:481502 std::unique_ptr<LayerImpl> mask_layer =
1503 LayerImpl::Create(host_impl_.active_tree(), 3);
[email protected]035441d92013-03-22 23:21:391504 mask_layer->SetPosition(child->position());
bokancccfde72014-10-08 15:15:221505 mask_layer->SetBounds(child->bounds());
ajuma1d4026a32016-06-14 13:18:501506 child->test_properties()->SetMaskLayer(std::move(mask_layer));
jaydasika6b5a32bf2016-04-22 21:56:361507 child->test_properties()->force_render_surface = true;
[email protected]035441d92013-03-22 23:21:391508 }
ajuma1d4026a32016-06-14 13:18:501509 LayerImpl* mask_layer = child->test_properties()->mask_layer;
[email protected]94f206c12012-08-25 00:09:141510
[email protected]035441d92013-03-22 23:21:391511 // Add opacity and a grand_child so that the render surface persists even
1512 // after we remove the mask.
[email protected]035441d92013-03-22 23:21:391513 {
danakj60bc3bc2016-04-09 00:24:481514 std::unique_ptr<LayerImpl> grand_child =
1515 LayerImpl::Create(host_impl_.active_tree(), 4);
[email protected]035441d92013-03-22 23:21:391516 grand_child->SetPosition(gfx::PointF(2.f, 2.f));
[email protected]035441d92013-03-22 23:21:391517 grand_child->SetBounds(gfx::Size(2, 2));
[email protected]035441d92013-03-22 23:21:391518 grand_child->SetDrawsContent(true);
jaydasika89f7b5a2016-06-22 02:08:391519 child->test_properties()->AddChild(std::move(grand_child));
[email protected]035441d92013-03-22 23:21:391520 }
jaydasika16515f52016-03-01 00:28:351521 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181522 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141523
[email protected]035441d92013-03-22 23:21:391524 // CASE 1: the update_rect on a mask layer should damage the entire target
1525 // surface.
jaydasikaef64f9e42016-03-12 01:08:181526 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421527 mask_layer->SetUpdateRect(gfx::Rect(1, 2, 3, 4));
jaydasika16515f52016-03-01 00:28:351528 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181529 EmulateDrawingOneFrame(root);
vmpstrefb8e7e2017-01-20 23:36:151530 gfx::Rect child_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011531 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151532 &child_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181533 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:141534
wutao36850732017-07-29 20:24:071535 EXPECT_TRUE(GetRenderSurface(root)
1536 ->damage_tracker()
1537 ->has_damage_from_contributing_content());
1538 EXPECT_FALSE(GetRenderSurface(child)
1539 ->damage_tracker()
1540 ->has_damage_from_contributing_content());
1541
[email protected]035441d92013-03-22 23:21:391542 // CASE 2: a property change on the mask layer should damage the entire
1543 // target surface.
[email protected]94f206c12012-08-25 00:09:141544
[email protected]035441d92013-03-22 23:21:391545 // Advance one frame without damage so that we know the damage rect is not
1546 // leftover from the previous case.
jaydasikaef64f9e42016-03-12 01:08:181547 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:351548 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181549 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011550 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151551 &child_damage_rect));
[email protected]035441d92013-03-22 23:21:391552 EXPECT_TRUE(child_damage_rect.IsEmpty());
[email protected]94f206c12012-08-25 00:09:141553
[email protected]035441d92013-03-22 23:21:391554 // Then test the property change.
jaydasikaef64f9e42016-03-12 01:08:181555 ClearDamageForAllSurfaces(root);
jaydasika865fd482016-02-24 09:26:151556 mask_layer->NoteLayerPropertyChanged();
[email protected]94f206c12012-08-25 00:09:141557
jaydasika16515f52016-03-01 00:28:351558 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181559 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011560 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151561 &child_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181562 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString());
[email protected]94f206c12012-08-25 00:09:141563
wutao36850732017-07-29 20:24:071564 EXPECT_TRUE(GetRenderSurface(root)
1565 ->damage_tracker()
1566 ->has_damage_from_contributing_content());
1567 EXPECT_FALSE(GetRenderSurface(child)
1568 ->damage_tracker()
1569 ->has_damage_from_contributing_content());
1570
[email protected]035441d92013-03-22 23:21:391571 // CASE 3: removing the mask also damages the entire target surface.
1572 //
[email protected]94f206c12012-08-25 00:09:141573
[email protected]035441d92013-03-22 23:21:391574 // Advance one frame without damage so that we know the damage rect is not
1575 // leftover from the previous case.
jaydasikaef64f9e42016-03-12 01:08:181576 ClearDamageForAllSurfaces(root);
jaydasika16515f52016-03-01 00:28:351577 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181578 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011579 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151580 &child_damage_rect));
[email protected]035441d92013-03-22 23:21:391581 EXPECT_TRUE(child_damage_rect.IsEmpty());
[email protected]94f206c12012-08-25 00:09:141582
[email protected]035441d92013-03-22 23:21:391583 // Then test mask removal.
jaydasikaef64f9e42016-03-12 01:08:181584 ClearDamageForAllSurfaces(root);
ajuma1d4026a32016-06-14 13:18:501585 child->test_properties()->SetMaskLayer(nullptr);
jaydasika03a99c42016-02-11 21:07:081586 child->NoteLayerPropertyChanged();
[email protected]035441d92013-03-22 23:21:391587 ASSERT_TRUE(child->LayerPropertyChanged());
jaydasika16515f52016-03-01 00:28:351588 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181589 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141590
[email protected]035441d92013-03-22 23:21:391591 // Sanity check that a render surface still exists.
chrishtr7e3aaf22017-05-04 15:04:011592 ASSERT_TRUE(GetRenderSurface(child));
[email protected]94f206c12012-08-25 00:09:141593
chrishtr7e3aaf22017-05-04 15:04:011594 EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151595 &child_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181596 EXPECT_EQ(gfx::Rect(30, 30).ToString(), child_damage_rect.ToString());
wutao36850732017-07-29 20:24:071597
1598 EXPECT_TRUE(GetRenderSurface(root)
1599 ->damage_tracker()
1600 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141601}
1602
[email protected]e0341352013-04-06 05:01:201603TEST_F(DamageTrackerTest, DamageWhenAddedExternally) {
jaydasikaef64f9e42016-03-12 01:08:181604 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:221605 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:141606
[email protected]e0341352013-04-06 05:01:201607 // Case 1: This test ensures that when the tracker is given damage, that
1608 // it is included with any other partial damage.
[email protected]035441d92013-03-22 23:21:391609 //
jaydasikaef64f9e42016-03-12 01:08:181610 ClearDamageForAllSurfaces(root);
danakj19f0c9e2014-10-11 03:24:421611 child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
chrishtr7e3aaf22017-05-04 15:04:011612 GetRenderSurface(root)->damage_tracker()->AddDamageNextUpdate(
[email protected]b4ead7b2014-04-07 18:12:181613 gfx::Rect(15, 16, 32, 33));
jaydasika16515f52016-03-01 00:28:351614 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181615 EmulateDrawingOneFrame(root);
vmpstrefb8e7e2017-01-20 23:36:151616 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011617 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151618 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181619 EXPECT_EQ(gfx::UnionRects(gfx::Rect(15, 16, 32, 33),
1620 gfx::Rect(100 + 10, 100 + 11, 12, 13)).ToString(),
1621 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071622 EXPECT_TRUE(GetRenderSurface(root)
1623 ->damage_tracker()
1624 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141625
[email protected]e0341352013-04-06 05:01:201626 // Case 2: An additional sanity check that adding damage works even when
1627 // nothing on the layer tree changed.
[email protected]035441d92013-03-22 23:21:391628 //
jaydasikaef64f9e42016-03-12 01:08:181629 ClearDamageForAllSurfaces(root);
chrishtr7e3aaf22017-05-04 15:04:011630 GetRenderSurface(root)->damage_tracker()->AddDamageNextUpdate(
[email protected]b4ead7b2014-04-07 18:12:181631 gfx::Rect(30, 31, 14, 15));
jaydasika16515f52016-03-01 00:28:351632 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181633 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011634 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151635 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181636 EXPECT_EQ(gfx::Rect(30, 31, 14, 15).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071637 EXPECT_FALSE(GetRenderSurface(root)
1638 ->damage_tracker()
1639 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141640}
1641
ajuma9c92fa022017-04-18 19:53:081642TEST_F(DamageTrackerTest, VerifyDamageWithNoContributingLayers) {
danakj60bc3bc2016-04-09 00:24:481643 std::unique_ptr<LayerImpl> root =
1644 LayerImpl::Create(host_impl_.active_tree(), 1);
jaydasika6b5a32bf2016-04-22 21:56:361645 root->test_properties()->force_render_surface = true;
jaydasikabf1875a2016-06-28 03:39:591646 host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
1647 LayerImpl* root_ptr = host_impl_.active_tree()->root_layer_for_testing();
jaydasika2411692c2016-03-23 01:56:091648 root_ptr->layer_tree_impl()->property_trees()->needs_rebuild = true;
1649 EmulateDrawingOneFrame(root_ptr);
[email protected]94f206c12012-08-25 00:09:141650
chrishtr7e3aaf22017-05-04 15:04:011651 DCHECK_EQ(GetRenderSurface(root_ptr), root_ptr->render_target());
1652 RenderSurfaceImpl* target_surface = GetRenderSurface(root_ptr);
vmpstrefb8e7e2017-01-20 23:36:151653 gfx::Rect damage_rect;
1654 EXPECT_TRUE(
1655 target_surface->damage_tracker()->GetDamageRectIfValid(&damage_rect));
[email protected]035441d92013-03-22 23:21:391656 EXPECT_TRUE(damage_rect.IsEmpty());
wutao36850732017-07-29 20:24:071657 EXPECT_FALSE(GetRenderSurface(root_ptr)
1658 ->damage_tracker()
1659 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141660}
1661
[email protected]035441d92013-03-22 23:21:391662TEST_F(DamageTrackerTest, VerifyDamageAccumulatesUntilReset) {
1663 // If damage is not cleared, it should accumulate.
[email protected]94f206c12012-08-25 00:09:141664
jaydasikaef64f9e42016-03-12 01:08:181665 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:221666 LayerImpl* child = root->test_properties()->children[0];
[email protected]94f206c12012-08-25 00:09:141667
jaydasikaef64f9e42016-03-12 01:08:181668 ClearDamageForAllSurfaces(root);
[email protected]b4ead7b2014-04-07 18:12:181669 child->SetUpdateRect(gfx::Rect(10.f, 11.f, 1.f, 2.f));
jaydasika16515f52016-03-01 00:28:351670 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181671 EmulateDrawingOneFrame(root);
[email protected]94f206c12012-08-25 00:09:141672
[email protected]035441d92013-03-22 23:21:391673 // Sanity check damage after the first frame; this isnt the actual test yet.
vmpstrefb8e7e2017-01-20 23:36:151674 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011675 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151676 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181677 EXPECT_EQ(gfx::Rect(110, 111, 1, 2).ToString(), root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071678 EXPECT_TRUE(GetRenderSurface(root)
1679 ->damage_tracker()
1680 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141681
[email protected]035441d92013-03-22 23:21:391682 // New damage, without having cleared the previous damage, should be unioned
1683 // to the previous one.
danakj19f0c9e2014-10-11 03:24:421684 child->SetUpdateRect(gfx::Rect(20, 25, 1, 2));
jaydasika16515f52016-03-01 00:28:351685 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181686 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011687 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151688 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181689 EXPECT_EQ(gfx::Rect(110, 111, 11, 16).ToString(),
1690 root_damage_rect.ToString());
wutao36850732017-07-29 20:24:071691 EXPECT_TRUE(GetRenderSurface(root)
1692 ->damage_tracker()
1693 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141694
[email protected]035441d92013-03-22 23:21:391695 // If we notify the damage tracker that we drew the damaged area, then damage
1696 // should be emptied.
chrishtr7e3aaf22017-05-04 15:04:011697 GetRenderSurface(root)->damage_tracker()->DidDrawDamagedArea();
1698 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151699 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391700 EXPECT_TRUE(root_damage_rect.IsEmpty());
wutao36850732017-07-29 20:24:071701 EXPECT_FALSE(GetRenderSurface(root)
1702 ->damage_tracker()
1703 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141704
[email protected]035441d92013-03-22 23:21:391705 // Damage should remain empty even after one frame, since there's yet no new
1706 // damage.
jaydasika16515f52016-03-01 00:28:351707 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasikaef64f9e42016-03-12 01:08:181708 EmulateDrawingOneFrame(root);
chrishtr7e3aaf22017-05-04 15:04:011709 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151710 &root_damage_rect));
[email protected]035441d92013-03-22 23:21:391711 EXPECT_TRUE(root_damage_rect.IsEmpty());
wutao36850732017-07-29 20:24:071712 EXPECT_FALSE(GetRenderSurface(root)
1713 ->damage_tracker()
1714 ->has_damage_from_contributing_content());
[email protected]94f206c12012-08-25 00:09:141715}
1716
[email protected]b4ead7b2014-04-07 18:12:181717TEST_F(DamageTrackerTest, HugeDamageRect) {
1718 // This number is so large that we start losting floating point accuracy.
1719 const int kBigNumber = 900000000;
1720 // Walk over a range to find floating point inaccuracy boundaries that move
1721 // toward the wrong direction.
1722 const int kRange = 5000;
1723
1724 for (int i = 0; i < kRange; ++i) {
ajuma816002e2016-09-23 23:30:421725 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
jaydasikafc66cfb2016-06-10 04:34:221726 LayerImpl* child = root->test_properties()->children[0];
[email protected]b4ead7b2014-04-07 18:12:181727
1728 gfx::Transform transform;
1729 transform.Translate(-kBigNumber, -kBigNumber);
1730
1731 // The child layer covers (0, 0, i, i) of the viewport,
1732 // but has a huge negative position.
1733 child->SetPosition(gfx::PointF());
1734 child->SetBounds(gfx::Size(kBigNumber + i, kBigNumber + i));
jaydasika10d43fc2016-08-18 04:06:041735 child->test_properties()->transform = transform;
jaydasika16515f52016-03-01 00:28:351736 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
jaydasika5237db02016-09-20 01:34:301737 float device_scale_factor = 1.f;
1738 // Visible rects computed from combining clips in target space and root
1739 // space don't match because of the loss in floating point accuracy. So, we
1740 // skip verify_clip_tree_calculations.
jaydasika3a6b14432017-03-21 23:11:191741 EmulateDrawingOneFrame(root, device_scale_factor);
[email protected]b4ead7b2014-04-07 18:12:181742
1743 // The expected damage should cover the visible part of the child layer,
1744 // which is (0, 0, i, i) in the viewport.
vmpstrefb8e7e2017-01-20 23:36:151745 gfx::Rect root_damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011746 EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
1747 &root_damage_rect));
[email protected]b4ead7b2014-04-07 18:12:181748 gfx::Rect damage_we_care_about = gfx::Rect(i, i);
1749 EXPECT_LE(damage_we_care_about.right(), root_damage_rect.right());
1750 EXPECT_LE(damage_we_care_about.bottom(), root_damage_rect.bottom());
wutao36850732017-07-29 20:24:071751 EXPECT_TRUE(GetRenderSurface(root)
1752 ->damage_tracker()
1753 ->has_damage_from_contributing_content());
[email protected]b4ead7b2014-04-07 18:12:181754 }
1755}
1756
vmpstrefb8e7e2017-01-20 23:36:151757TEST_F(DamageTrackerTest, DamageRectTooBig) {
1758 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(2);
1759 LayerImpl* child1 = root->test_properties()->children[0];
1760 LayerImpl* child2 = root->test_properties()->children[1];
1761
1762 // Really far left.
1763 child1->SetPosition(gfx::PointF(std::numeric_limits<int>::min() + 100, 0));
1764 child1->SetBounds(gfx::Size(1, 1));
1765
1766 // Really far right.
1767 child2->SetPosition(gfx::PointF(std::numeric_limits<int>::max() - 100, 0));
1768 child2->SetBounds(gfx::Size(1, 1));
1769
1770 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1771 float device_scale_factor = 1.f;
jaydasika3a6b14432017-03-21 23:11:191772 EmulateDrawingOneFrame(root, device_scale_factor);
vmpstrefb8e7e2017-01-20 23:36:151773
1774 // The expected damage would be too large to store in a gfx::Rect, so we
1775 // should damage everything (ie, we don't have a valid rect).
1776 gfx::Rect damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011777 EXPECT_FALSE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151778 &damage_rect));
chrishtr7e3aaf22017-05-04 15:04:011779 EXPECT_EQ(GetRenderSurface(root)->content_rect(),
1780 GetRenderSurface(root)->GetDamageRect());
wutao36850732017-07-29 20:24:071781 EXPECT_TRUE(GetRenderSurface(root)
1782 ->damage_tracker()
1783 ->has_damage_from_contributing_content());
vmpstrefb8e7e2017-01-20 23:36:151784}
1785
1786TEST_F(DamageTrackerTest, DamageRectTooBigWithFilter) {
1787 LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(2);
1788 LayerImpl* child1 = root->test_properties()->children[0];
1789 LayerImpl* child2 = root->test_properties()->children[1];
1790
1791 FilterOperations filters;
1792 filters.Append(FilterOperation::CreateBlurFilter(5.f));
1793 root->SetDrawsContent(true);
1794 root->test_properties()->background_filters = filters;
1795
1796 // Really far left.
1797 child1->SetPosition(gfx::PointF(std::numeric_limits<int>::min() + 100, 0));
1798 child1->SetBounds(gfx::Size(1, 1));
1799
1800 // Really far right.
1801 child2->SetPosition(gfx::PointF(std::numeric_limits<int>::max() - 100, 0));
1802 child2->SetBounds(gfx::Size(1, 1));
1803
1804 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1805 float device_scale_factor = 1.f;
jaydasika3a6b14432017-03-21 23:11:191806 EmulateDrawingOneFrame(root, device_scale_factor);
vmpstrefb8e7e2017-01-20 23:36:151807
1808 // The expected damage would be too large to store in a gfx::Rect, so we
1809 // should damage everything (ie, we don't have a valid rect).
1810 gfx::Rect damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011811 EXPECT_FALSE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151812 &damage_rect));
chrishtr7e3aaf22017-05-04 15:04:011813 EXPECT_EQ(GetRenderSurface(root)->content_rect(),
1814 GetRenderSurface(root)->GetDamageRect());
wutao36850732017-07-29 20:24:071815 EXPECT_TRUE(GetRenderSurface(root)
1816 ->damage_tracker()
1817 ->has_damage_from_contributing_content());
vmpstrefb8e7e2017-01-20 23:36:151818}
1819
1820TEST_F(DamageTrackerTest, DamageRectTooBigInRenderSurface) {
1821 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
1822 LayerImpl* child1 = root->test_properties()->children[0];
1823 LayerImpl* grandchild1 = child1->test_properties()->children[0];
1824 LayerImpl* grandchild2 = child1->test_properties()->children[1];
1825
1826 // Really far left.
1827 grandchild1->SetPosition(
1828 gfx::PointF(std::numeric_limits<int>::min() + 500, 0));
1829 grandchild1->SetBounds(gfx::Size(1, 1));
1830 grandchild1->SetDrawsContent(true);
1831
1832 // Really far right.
1833 grandchild2->SetPosition(
1834 gfx::PointF(std::numeric_limits<int>::max() - 500, 0));
1835 grandchild2->SetBounds(gfx::Size(1, 1));
1836 grandchild2->SetDrawsContent(true);
1837
1838 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1839 float device_scale_factor = 1.f;
ajumab784ef42017-04-28 23:01:521840 RenderSurfaceList render_surface_list;
vmpstrefb8e7e2017-01-20 23:36:151841 ExecuteCalculateDrawProperties(root, device_scale_factor,
ajumab784ef42017-04-28 23:01:521842 &render_surface_list);
ajuma9c92fa022017-04-18 19:53:081843 // Avoid the descendant-only property change path that skips unioning damage
1844 // from descendant layers.
chrishtr7e3aaf22017-05-04 15:04:011845 GetRenderSurface(child1)->NoteAncestorPropertyChanged();
ajuma9c92fa022017-04-18 19:53:081846 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
ajumab784ef42017-04-28 23:01:521847 render_surface_list);
vmpstrefb8e7e2017-01-20 23:36:151848
1849 // The expected damage would be too large to store in a gfx::Rect, so we
1850 // should damage everything on child1.
1851 gfx::Rect damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011852 EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1853 &damage_rect));
1854 EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
1855 GetRenderSurface(child1)->GetDamageRect());
vmpstrefb8e7e2017-01-20 23:36:151856
1857 // However, the root should just use the child1 render surface's content rect
1858 // as damage.
chrishtr7e3aaf22017-05-04 15:04:011859 ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151860 &damage_rect));
chrishtr7e3aaf22017-05-04 15:04:011861 EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
vmpstrefb8e7e2017-01-20 23:36:151862 EXPECT_TRUE(damage_rect.Contains(
chrishtr7e3aaf22017-05-04 15:04:011863 gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
1864 EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
vmpstrefb8e7e2017-01-20 23:36:151865
wutao36850732017-07-29 20:24:071866 EXPECT_TRUE(GetRenderSurface(root)
1867 ->damage_tracker()
1868 ->has_damage_from_contributing_content());
1869 EXPECT_TRUE(GetRenderSurface(child1)
1870 ->damage_tracker()
1871 ->has_damage_from_contributing_content());
1872
vmpstrefb8e7e2017-01-20 23:36:151873 // Add new damage, without changing properties, which goes down a different
1874 // path in the damage tracker.
1875 root->layer_tree_impl()->ResetAllChangeTracking();
1876 grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1877 grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1878
1879 // Recompute all damage / properties.
ajumab784ef42017-04-28 23:01:521880 render_surface_list.clear();
vmpstrefb8e7e2017-01-20 23:36:151881 ExecuteCalculateDrawProperties(root, device_scale_factor,
ajumab784ef42017-04-28 23:01:521882 &render_surface_list);
ajuma9c92fa022017-04-18 19:53:081883 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
ajumab784ef42017-04-28 23:01:521884 render_surface_list);
vmpstrefb8e7e2017-01-20 23:36:151885
1886 // Child1 should still not have a valid rect, since the union of the damage of
1887 // its children is not representable by a single rect.
chrishtr7e3aaf22017-05-04 15:04:011888 EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1889 &damage_rect));
1890 EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
1891 GetRenderSurface(child1)->GetDamageRect());
vmpstrefb8e7e2017-01-20 23:36:151892
1893 // Root should have valid damage and contain both its content rect and the
1894 // drawable content rect of child1.
chrishtr7e3aaf22017-05-04 15:04:011895 ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151896 &damage_rect));
chrishtr7e3aaf22017-05-04 15:04:011897 EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
vmpstrefb8e7e2017-01-20 23:36:151898 EXPECT_TRUE(damage_rect.Contains(
chrishtr7e3aaf22017-05-04 15:04:011899 gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
1900 EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
wutao36850732017-07-29 20:24:071901
1902 EXPECT_TRUE(GetRenderSurface(root)
1903 ->damage_tracker()
1904 ->has_damage_from_contributing_content());
1905 EXPECT_TRUE(GetRenderSurface(child1)
1906 ->damage_tracker()
1907 ->has_damage_from_contributing_content());
vmpstrefb8e7e2017-01-20 23:36:151908}
1909
1910TEST_F(DamageTrackerTest, DamageRectTooBigInRenderSurfaceWithFilter) {
1911 LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
1912 LayerImpl* child1 = root->test_properties()->children[0];
1913 LayerImpl* grandchild1 = child1->test_properties()->children[0];
1914 LayerImpl* grandchild2 = child1->test_properties()->children[1];
1915
1916 // Set up a moving pixels filter on the child.
1917 FilterOperations filters;
1918 filters.Append(FilterOperation::CreateBlurFilter(5.f));
1919 child1->SetDrawsContent(true);
1920 child1->test_properties()->background_filters = filters;
1921
1922 // Really far left.
1923 grandchild1->SetPosition(
1924 gfx::PointF(std::numeric_limits<int>::min() + 500, 0));
1925 grandchild1->SetBounds(gfx::Size(1, 1));
1926 grandchild1->SetDrawsContent(true);
1927
1928 // Really far right.
1929 grandchild2->SetPosition(
1930 gfx::PointF(std::numeric_limits<int>::max() - 500, 0));
1931 grandchild2->SetBounds(gfx::Size(1, 1));
1932 grandchild2->SetDrawsContent(true);
1933
1934 root->layer_tree_impl()->property_trees()->needs_rebuild = true;
1935 float device_scale_factor = 1.f;
ajumab784ef42017-04-28 23:01:521936 RenderSurfaceList render_surface_list;
vmpstrefb8e7e2017-01-20 23:36:151937 ExecuteCalculateDrawProperties(root, device_scale_factor,
ajumab784ef42017-04-28 23:01:521938 &render_surface_list);
ajuma9c92fa022017-04-18 19:53:081939 // Avoid the descendant-only property change path that skips unioning damage
1940 // from descendant layers.
chrishtr7e3aaf22017-05-04 15:04:011941 GetRenderSurface(child1)->NoteAncestorPropertyChanged();
ajuma9c92fa022017-04-18 19:53:081942 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
ajumab784ef42017-04-28 23:01:521943 render_surface_list);
vmpstrefb8e7e2017-01-20 23:36:151944
1945 // The expected damage would be too large to store in a gfx::Rect, so we
1946 // should damage everything on child1.
1947 gfx::Rect damage_rect;
chrishtr7e3aaf22017-05-04 15:04:011948 EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1949 &damage_rect));
1950 EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
1951 GetRenderSurface(child1)->GetDamageRect());
vmpstrefb8e7e2017-01-20 23:36:151952
1953 // However, the root should just use the child1 render surface's content rect
1954 // as damage.
chrishtr7e3aaf22017-05-04 15:04:011955 ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151956 &damage_rect));
chrishtr7e3aaf22017-05-04 15:04:011957 EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
vmpstrefb8e7e2017-01-20 23:36:151958 EXPECT_TRUE(damage_rect.Contains(
chrishtr7e3aaf22017-05-04 15:04:011959 gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
1960 EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
vmpstrefb8e7e2017-01-20 23:36:151961
wutao36850732017-07-29 20:24:071962 EXPECT_TRUE(GetRenderSurface(root)
1963 ->damage_tracker()
1964 ->has_damage_from_contributing_content());
1965 EXPECT_TRUE(GetRenderSurface(child1)
1966 ->damage_tracker()
1967 ->has_damage_from_contributing_content());
1968
vmpstrefb8e7e2017-01-20 23:36:151969 // Add new damage, without changing properties, which goes down a different
1970 // path in the damage tracker.
1971 root->layer_tree_impl()->ResetAllChangeTracking();
1972 grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1973 grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds()));
1974
1975 // Recompute all damage / properties.
ajumab784ef42017-04-28 23:01:521976 render_surface_list.clear();
vmpstrefb8e7e2017-01-20 23:36:151977 ExecuteCalculateDrawProperties(root, device_scale_factor,
ajumab784ef42017-04-28 23:01:521978 &render_surface_list);
ajuma9c92fa022017-04-18 19:53:081979 DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
ajumab784ef42017-04-28 23:01:521980 render_surface_list);
vmpstrefb8e7e2017-01-20 23:36:151981
1982 // Child1 should still not have a valid rect, since the union of the damage of
1983 // its children is not representable by a single rect.
chrishtr7e3aaf22017-05-04 15:04:011984 EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
1985 &damage_rect));
1986 EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
1987 GetRenderSurface(child1)->GetDamageRect());
vmpstrefb8e7e2017-01-20 23:36:151988
1989 // Root should have valid damage and contain both its content rect and the
1990 // drawable content rect of child1.
chrishtr7e3aaf22017-05-04 15:04:011991 ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
vmpstrefb8e7e2017-01-20 23:36:151992 &damage_rect));
chrishtr7e3aaf22017-05-04 15:04:011993 EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
vmpstrefb8e7e2017-01-20 23:36:151994 EXPECT_TRUE(damage_rect.Contains(
chrishtr7e3aaf22017-05-04 15:04:011995 gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
1996 EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
wutao36850732017-07-29 20:24:071997
1998 EXPECT_TRUE(GetRenderSurface(root)
1999 ->damage_tracker()
2000 ->has_damage_from_contributing_content());
2001 EXPECT_TRUE(GetRenderSurface(child1)
2002 ->damage_tracker()
2003 ->has_damage_from_contributing_content());
vmpstrefb8e7e2017-01-20 23:36:152004}
2005
[email protected]ba565742012-11-10 09:29:482006} // namespace
2007} // namespace cc