| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| 11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 12 #include "cc/test/fake_content_layer.h" | 12 #include "cc/test/fake_content_layer.h" |
| 13 #include "cc/test/fake_content_layer_client.h" | 13 #include "cc/test/fake_content_layer_client.h" |
| 14 #include "cc/test/fake_painted_scrollbar_layer.h" | 14 #include "cc/test/fake_painted_scrollbar_layer.h" |
| 15 #include "cc/test/fake_picture_layer.h" | 15 #include "cc/test/fake_picture_layer.h" |
| 16 #include "cc/test/layer_tree_test.h" | 16 #include "cc/test/layer_tree_test.h" |
| 17 #include "cc/trees/damage_tracker.h" | 17 #include "cc/trees/damage_tracker.h" |
| 18 #include "cc/trees/layer_tree_impl.h" | 18 #include "cc/trees/layer_tree_impl.h" |
| 19 | 19 |
| 20 namespace cc { | 20 namespace cc { |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 // These tests deal with damage tracking. | 23 // These tests deal with damage tracking. |
| 24 class LayerTreeHostDamageTest : public LayerTreeTest {}; | 24 class LayerTreeHostDamageTest : public LayerTreeTest {}; |
| 25 | 25 |
| 26 // LayerTreeHost::SetNeedsRedraw should damage the whole viewport. | 26 // LayerTreeHost::SetNeedsRedraw should damage the whole viewport. |
| 27 class LayerTreeHostDamageTestSetNeedsRedraw | 27 class LayerTreeHostDamageTestSetNeedsRedraw |
| 28 : public LayerTreeHostDamageTest { | 28 : public LayerTreeHostDamageTest { |
| 29 virtual void SetupTree() override { | 29 void SetupTree() override { |
| 30 // Viewport is 10x10. | 30 // Viewport is 10x10. |
| 31 scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); | 31 scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); |
| 32 root->SetBounds(gfx::Size(10, 10)); | 32 root->SetBounds(gfx::Size(10, 10)); |
| 33 | 33 |
| 34 layer_tree_host()->SetRootLayer(root); | 34 layer_tree_host()->SetRootLayer(root); |
| 35 LayerTreeHostDamageTest::SetupTree(); | 35 LayerTreeHostDamageTest::SetupTree(); |
| 36 } | 36 } |
| 37 | 37 |
| 38 virtual void BeginTest() override { | 38 void BeginTest() override { |
| 39 draw_count_ = 0; | 39 draw_count_ = 0; |
| 40 PostSetNeedsCommitToMainThread(); | 40 PostSetNeedsCommitToMainThread(); |
| 41 } | 41 } |
| 42 | 42 |
| 43 virtual void DidCommitAndDrawFrame() override { | 43 void DidCommitAndDrawFrame() override { |
| 44 switch (layer_tree_host()->source_frame_number()) { | 44 switch (layer_tree_host()->source_frame_number()) { |
| 45 case 1: | 45 case 1: |
| 46 layer_tree_host()->SetNeedsRedraw(); | 46 layer_tree_host()->SetNeedsRedraw(); |
| 47 break; | 47 break; |
| 48 } | 48 } |
| 49 } | 49 } |
| 50 | 50 |
| 51 virtual DrawResult PrepareToDrawOnThread( | 51 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* impl, |
| 52 LayerTreeHostImpl* impl, | 52 LayerTreeHostImpl::FrameData* frame_data, |
| 53 LayerTreeHostImpl::FrameData* frame_data, | 53 DrawResult draw_result) override { |
| 54 DrawResult draw_result) override { | |
| 55 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 54 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 56 | 55 |
| 57 RenderSurfaceImpl* root_surface = | 56 RenderSurfaceImpl* root_surface = |
| 58 impl->active_tree()->root_layer()->render_surface(); | 57 impl->active_tree()->root_layer()->render_surface(); |
| 59 gfx::RectF root_damage = | 58 gfx::RectF root_damage = |
| 60 root_surface->damage_tracker()->current_damage_rect(); | 59 root_surface->damage_tracker()->current_damage_rect(); |
| 61 | 60 |
| 62 switch (draw_count_) { | 61 switch (draw_count_) { |
| 63 case 0: | 62 case 0: |
| 64 // The first frame has full damage. | 63 // The first frame has full damage. |
| 65 EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); | 64 EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); |
| 66 break; | 65 break; |
| 67 case 1: | 66 case 1: |
| 68 // The second frame has full damage. | 67 // The second frame has full damage. |
| 69 EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); | 68 EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); |
| 70 EndTest(); | 69 EndTest(); |
| 71 break; | 70 break; |
| 72 case 2: | 71 case 2: |
| 73 NOTREACHED(); | 72 NOTREACHED(); |
| 74 } | 73 } |
| 75 | 74 |
| 76 ++draw_count_; | 75 ++draw_count_; |
| 77 return draw_result; | 76 return draw_result; |
| 78 } | 77 } |
| 79 | 78 |
| 80 virtual void AfterTest() override {} | 79 void AfterTest() override {} |
| 81 | 80 |
| 82 int draw_count_; | 81 int draw_count_; |
| 83 FakeContentLayerClient client_; | 82 FakeContentLayerClient client_; |
| 84 }; | 83 }; |
| 85 | 84 |
| 86 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetNeedsRedraw); | 85 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetNeedsRedraw); |
| 87 | 86 |
| 88 // LayerTreeHost::SetViewportSize should damage the whole viewport. | 87 // LayerTreeHost::SetViewportSize should damage the whole viewport. |
| 89 class LayerTreeHostDamageTestSetViewportSize | 88 class LayerTreeHostDamageTestSetViewportSize |
| 90 : public LayerTreeHostDamageTest { | 89 : public LayerTreeHostDamageTest { |
| 91 virtual void SetupTree() override { | 90 void SetupTree() override { |
| 92 // Viewport is 10x10. | 91 // Viewport is 10x10. |
| 93 scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); | 92 scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); |
| 94 root->SetBounds(gfx::Size(10, 10)); | 93 root->SetBounds(gfx::Size(10, 10)); |
| 95 | 94 |
| 96 layer_tree_host()->SetRootLayer(root); | 95 layer_tree_host()->SetRootLayer(root); |
| 97 LayerTreeHostDamageTest::SetupTree(); | 96 LayerTreeHostDamageTest::SetupTree(); |
| 98 } | 97 } |
| 99 | 98 |
| 100 virtual void BeginTest() override { | 99 void BeginTest() override { |
| 101 draw_count_ = 0; | 100 draw_count_ = 0; |
| 102 PostSetNeedsCommitToMainThread(); | 101 PostSetNeedsCommitToMainThread(); |
| 103 } | 102 } |
| 104 | 103 |
| 105 virtual void DidCommitAndDrawFrame() override { | 104 void DidCommitAndDrawFrame() override { |
| 106 switch (layer_tree_host()->source_frame_number()) { | 105 switch (layer_tree_host()->source_frame_number()) { |
| 107 case 1: | 106 case 1: |
| 108 layer_tree_host()->SetViewportSize(gfx::Size(15, 15)); | 107 layer_tree_host()->SetViewportSize(gfx::Size(15, 15)); |
| 109 break; | 108 break; |
| 110 } | 109 } |
| 111 } | 110 } |
| 112 | 111 |
| 113 virtual DrawResult PrepareToDrawOnThread( | 112 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* impl, |
| 114 LayerTreeHostImpl* impl, | 113 LayerTreeHostImpl::FrameData* frame_data, |
| 115 LayerTreeHostImpl::FrameData* frame_data, | 114 DrawResult draw_result) override { |
| 116 DrawResult draw_result) override { | |
| 117 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 115 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 118 | 116 |
| 119 RenderSurfaceImpl* root_surface = | 117 RenderSurfaceImpl* root_surface = |
| 120 impl->active_tree()->root_layer()->render_surface(); | 118 impl->active_tree()->root_layer()->render_surface(); |
| 121 gfx::RectF root_damage = | 119 gfx::RectF root_damage = |
| 122 root_surface->damage_tracker()->current_damage_rect(); | 120 root_surface->damage_tracker()->current_damage_rect(); |
| 123 | 121 |
| 124 switch (draw_count_) { | 122 switch (draw_count_) { |
| 125 case 0: | 123 case 0: |
| 126 // The first frame has full damage. | 124 // The first frame has full damage. |
| 127 EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); | 125 EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); |
| 128 break; | 126 break; |
| 129 case 1: | 127 case 1: |
| 130 // The second frame has full damage. | 128 // The second frame has full damage. |
| 131 EXPECT_EQ(gfx::RectF(15.f, 15.f).ToString(), root_damage.ToString()); | 129 EXPECT_EQ(gfx::RectF(15.f, 15.f).ToString(), root_damage.ToString()); |
| 132 EndTest(); | 130 EndTest(); |
| 133 break; | 131 break; |
| 134 case 2: | 132 case 2: |
| 135 NOTREACHED(); | 133 NOTREACHED(); |
| 136 } | 134 } |
| 137 | 135 |
| 138 ++draw_count_; | 136 ++draw_count_; |
| 139 return draw_result; | 137 return draw_result; |
| 140 } | 138 } |
| 141 | 139 |
| 142 virtual void AfterTest() override {} | 140 void AfterTest() override {} |
| 143 | 141 |
| 144 int draw_count_; | 142 int draw_count_; |
| 145 FakeContentLayerClient client_; | 143 FakeContentLayerClient client_; |
| 146 }; | 144 }; |
| 147 | 145 |
| 148 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetViewportSize); | 146 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetViewportSize); |
| 149 | 147 |
| 150 class LayerTreeHostDamageTestNoDamageDoesNotSwap | 148 class LayerTreeHostDamageTestNoDamageDoesNotSwap |
| 151 : public LayerTreeHostDamageTest { | 149 : public LayerTreeHostDamageTest { |
| 152 virtual void BeginTest() override { | 150 void BeginTest() override { |
| 153 expect_swap_and_succeed_ = 0; | 151 expect_swap_and_succeed_ = 0; |
| 154 did_swaps_ = 0; | 152 did_swaps_ = 0; |
| 155 did_swap_and_succeed_ = 0; | 153 did_swap_and_succeed_ = 0; |
| 156 PostSetNeedsCommitToMainThread(); | 154 PostSetNeedsCommitToMainThread(); |
| 157 } | 155 } |
| 158 | 156 |
| 159 virtual void SetupTree() override { | 157 void SetupTree() override { |
| 160 scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); | 158 scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); |
| 161 root->SetBounds(gfx::Size(10, 10)); | 159 root->SetBounds(gfx::Size(10, 10)); |
| 162 | 160 |
| 163 // Most of the layer isn't visible. | 161 // Most of the layer isn't visible. |
| 164 content_ = FakeContentLayer::Create(&client_); | 162 content_ = FakeContentLayer::Create(&client_); |
| 165 content_->SetBounds(gfx::Size(2000, 100)); | 163 content_->SetBounds(gfx::Size(2000, 100)); |
| 166 root->AddChild(content_); | 164 root->AddChild(content_); |
| 167 | 165 |
| 168 layer_tree_host()->SetRootLayer(root); | 166 layer_tree_host()->SetRootLayer(root); |
| 169 LayerTreeHostDamageTest::SetupTree(); | 167 LayerTreeHostDamageTest::SetupTree(); |
| 170 } | 168 } |
| 171 | 169 |
| 172 virtual DrawResult PrepareToDrawOnThread( | 170 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 173 LayerTreeHostImpl* host_impl, | 171 LayerTreeHostImpl::FrameData* frame_data, |
| 174 LayerTreeHostImpl::FrameData* frame_data, | 172 DrawResult draw_result) override { |
| 175 DrawResult draw_result) override { | |
| 176 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 173 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 177 | 174 |
| 178 int source_frame = host_impl->active_tree()->source_frame_number(); | 175 int source_frame = host_impl->active_tree()->source_frame_number(); |
| 179 switch (source_frame) { | 176 switch (source_frame) { |
| 180 case 0: | 177 case 0: |
| 181 // The first frame has damage, so we should draw and swap. | 178 // The first frame has damage, so we should draw and swap. |
| 182 ++expect_swap_and_succeed_; | 179 ++expect_swap_and_succeed_; |
| 183 break; | 180 break; |
| 184 case 1: | 181 case 1: |
| 185 // The second frame has no damage, so we should not draw and swap. | 182 // The second frame has no damage, so we should not draw and swap. |
| 186 break; | 183 break; |
| 187 case 2: | 184 case 2: |
| 188 // The third frame has damage again, so we should draw and swap. | 185 // The third frame has damage again, so we should draw and swap. |
| 189 ++expect_swap_and_succeed_; | 186 ++expect_swap_and_succeed_; |
| 190 break; | 187 break; |
| 191 case 3: | 188 case 3: |
| 192 // The fourth frame has no visible damage, so we should not draw and | 189 // The fourth frame has no visible damage, so we should not draw and |
| 193 // swap. | 190 // swap. |
| 194 EndTest(); | 191 EndTest(); |
| 195 break; | 192 break; |
| 196 } | 193 } |
| 197 return draw_result; | 194 return draw_result; |
| 198 } | 195 } |
| 199 | 196 |
| 200 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, | 197 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
| 201 bool result) override { | |
| 202 ++did_swaps_; | 198 ++did_swaps_; |
| 203 if (result) | 199 if (result) |
| 204 ++did_swap_and_succeed_; | 200 ++did_swap_and_succeed_; |
| 205 EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); | 201 EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); |
| 206 } | 202 } |
| 207 | 203 |
| 208 virtual void DidCommit() override { | 204 void DidCommit() override { |
| 209 int next_frame = layer_tree_host()->source_frame_number(); | 205 int next_frame = layer_tree_host()->source_frame_number(); |
| 210 switch (next_frame) { | 206 switch (next_frame) { |
| 211 case 1: | 207 case 1: |
| 212 layer_tree_host()->SetNeedsCommit(); | 208 layer_tree_host()->SetNeedsCommit(); |
| 213 break; | 209 break; |
| 214 case 2: | 210 case 2: |
| 215 // Cause visible damage. | 211 // Cause visible damage. |
| 216 content_->SetNeedsDisplayRect( | 212 content_->SetNeedsDisplayRect( |
| 217 gfx::Rect(layer_tree_host()->device_viewport_size())); | 213 gfx::Rect(layer_tree_host()->device_viewport_size())); |
| 218 break; | 214 break; |
| 219 case 3: | 215 case 3: |
| 220 // Cause non-visible damage. | 216 // Cause non-visible damage. |
| 221 content_->SetNeedsDisplayRect(gfx::Rect(1990, 1990, 10, 10)); | 217 content_->SetNeedsDisplayRect(gfx::Rect(1990, 1990, 10, 10)); |
| 222 layer_tree_host()->SetNeedsCommit(); | 218 layer_tree_host()->SetNeedsCommit(); |
| 223 break; | 219 break; |
| 224 } | 220 } |
| 225 } | 221 } |
| 226 | 222 |
| 227 virtual void AfterTest() override { | 223 void AfterTest() override { |
| 228 EXPECT_EQ(4, did_swaps_); | 224 EXPECT_EQ(4, did_swaps_); |
| 229 EXPECT_EQ(2, expect_swap_and_succeed_); | 225 EXPECT_EQ(2, expect_swap_and_succeed_); |
| 230 EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); | 226 EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); |
| 231 } | 227 } |
| 232 | 228 |
| 233 FakeContentLayerClient client_; | 229 FakeContentLayerClient client_; |
| 234 scoped_refptr<FakeContentLayer> content_; | 230 scoped_refptr<FakeContentLayer> content_; |
| 235 int expect_swap_and_succeed_; | 231 int expect_swap_and_succeed_; |
| 236 int did_swaps_; | 232 int did_swaps_; |
| 237 int did_swap_and_succeed_; | 233 int did_swap_and_succeed_; |
| 238 }; | 234 }; |
| 239 | 235 |
| 240 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( | 236 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( |
| 241 LayerTreeHostDamageTestNoDamageDoesNotSwap); | 237 LayerTreeHostDamageTestNoDamageDoesNotSwap); |
| 242 | 238 |
| 243 class LayerTreeHostDamageTestForcedFullDamage : public LayerTreeHostDamageTest { | 239 class LayerTreeHostDamageTestForcedFullDamage : public LayerTreeHostDamageTest { |
| 244 virtual void BeginTest() override { | 240 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 245 PostSetNeedsCommitToMainThread(); | |
| 246 } | |
| 247 | 241 |
| 248 virtual void SetupTree() override { | 242 void SetupTree() override { |
| 249 root_ = FakeContentLayer::Create(&client_); | 243 root_ = FakeContentLayer::Create(&client_); |
| 250 child_ = FakeContentLayer::Create(&client_); | 244 child_ = FakeContentLayer::Create(&client_); |
| 251 | 245 |
| 252 root_->SetBounds(gfx::Size(500, 500)); | 246 root_->SetBounds(gfx::Size(500, 500)); |
| 253 child_->SetPosition(gfx::Point(100, 100)); | 247 child_->SetPosition(gfx::Point(100, 100)); |
| 254 child_->SetBounds(gfx::Size(30, 30)); | 248 child_->SetBounds(gfx::Size(30, 30)); |
| 255 | 249 |
| 256 root_->AddChild(child_); | 250 root_->AddChild(child_); |
| 257 layer_tree_host()->SetRootLayer(root_); | 251 layer_tree_host()->SetRootLayer(root_); |
| 258 LayerTreeHostDamageTest::SetupTree(); | 252 LayerTreeHostDamageTest::SetupTree(); |
| 259 } | 253 } |
| 260 | 254 |
| 261 virtual DrawResult PrepareToDrawOnThread( | 255 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 262 LayerTreeHostImpl* host_impl, | 256 LayerTreeHostImpl::FrameData* frame_data, |
| 263 LayerTreeHostImpl::FrameData* frame_data, | 257 DrawResult draw_result) override { |
| 264 DrawResult draw_result) override { | |
| 265 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 258 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 266 | 259 |
| 267 RenderSurfaceImpl* root_surface = | 260 RenderSurfaceImpl* root_surface = |
| 268 host_impl->active_tree()->root_layer()->render_surface(); | 261 host_impl->active_tree()->root_layer()->render_surface(); |
| 269 gfx::RectF root_damage = | 262 gfx::RectF root_damage = |
| 270 root_surface->damage_tracker()->current_damage_rect(); | 263 root_surface->damage_tracker()->current_damage_rect(); |
| 271 root_damage.Intersect(root_surface->content_rect()); | 264 root_damage.Intersect(root_surface->content_rect()); |
| 272 | 265 |
| 273 int source_frame = host_impl->active_tree()->source_frame_number(); | 266 int source_frame = host_impl->active_tree()->source_frame_number(); |
| 274 switch (source_frame) { | 267 switch (source_frame) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 EXPECT_EQ(gfx::RectF(root_surface->content_rect()).ToString(), | 320 EXPECT_EQ(gfx::RectF(root_surface->content_rect()).ToString(), |
| 328 root_damage.ToString()); | 321 root_damage.ToString()); |
| 329 EXPECT_FALSE(frame_data->has_no_damage); | 322 EXPECT_FALSE(frame_data->has_no_damage); |
| 330 | 323 |
| 331 EndTest(); | 324 EndTest(); |
| 332 break; | 325 break; |
| 333 } | 326 } |
| 334 return draw_result; | 327 return draw_result; |
| 335 } | 328 } |
| 336 | 329 |
| 337 virtual void DidCommitAndDrawFrame() override { | 330 void DidCommitAndDrawFrame() override { |
| 338 if (!TestEnded()) | 331 if (!TestEnded()) |
| 339 layer_tree_host()->SetNeedsCommit(); | 332 layer_tree_host()->SetNeedsCommit(); |
| 340 | 333 |
| 341 if (!child_damage_rect_.IsEmpty()) { | 334 if (!child_damage_rect_.IsEmpty()) { |
| 342 child_->SetNeedsDisplayRect(child_damage_rect_); | 335 child_->SetNeedsDisplayRect(child_damage_rect_); |
| 343 child_damage_rect_ = gfx::Rect(); | 336 child_damage_rect_ = gfx::Rect(); |
| 344 } | 337 } |
| 345 } | 338 } |
| 346 | 339 |
| 347 virtual void AfterTest() override {} | 340 void AfterTest() override {} |
| 348 | 341 |
| 349 FakeContentLayerClient client_; | 342 FakeContentLayerClient client_; |
| 350 scoped_refptr<FakeContentLayer> root_; | 343 scoped_refptr<FakeContentLayer> root_; |
| 351 scoped_refptr<FakeContentLayer> child_; | 344 scoped_refptr<FakeContentLayer> child_; |
| 352 gfx::Rect child_damage_rect_; | 345 gfx::Rect child_damage_rect_; |
| 353 }; | 346 }; |
| 354 | 347 |
| 355 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostDamageTestForcedFullDamage); | 348 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostDamageTestForcedFullDamage); |
| 356 | 349 |
| 357 class LayerTreeHostScrollbarDamageTest : public LayerTreeHostDamageTest { | 350 class LayerTreeHostScrollbarDamageTest : public LayerTreeHostDamageTest { |
| 358 virtual void SetupTree() override { | 351 void SetupTree() override { |
| 359 scoped_refptr<Layer> root_layer = Layer::Create(); | 352 scoped_refptr<Layer> root_layer = Layer::Create(); |
| 360 root_layer->SetBounds(gfx::Size(400, 400)); | 353 root_layer->SetBounds(gfx::Size(400, 400)); |
| 361 root_layer->SetMasksToBounds(true); | 354 root_layer->SetMasksToBounds(true); |
| 362 layer_tree_host()->SetRootLayer(root_layer); | 355 layer_tree_host()->SetRootLayer(root_layer); |
| 363 | 356 |
| 364 scoped_refptr<Layer> scroll_clip_layer = Layer::Create(); | 357 scoped_refptr<Layer> scroll_clip_layer = Layer::Create(); |
| 365 scoped_refptr<Layer> content_layer = FakeContentLayer::Create(&client_); | 358 scoped_refptr<Layer> content_layer = FakeContentLayer::Create(&client_); |
| 366 content_layer->SetScrollClipLayerId(scroll_clip_layer->id()); | 359 content_layer->SetScrollClipLayerId(scroll_clip_layer->id()); |
| 367 content_layer->SetScrollOffset(gfx::ScrollOffset(10, 20)); | 360 content_layer->SetScrollOffset(gfx::ScrollOffset(10, 20)); |
| 368 content_layer->SetBounds(gfx::Size(100, 200)); | 361 content_layer->SetBounds(gfx::Size(100, 200)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 388 | 381 |
| 389 LayerTreeHostDamageTest::SetupTree(); | 382 LayerTreeHostDamageTest::SetupTree(); |
| 390 } | 383 } |
| 391 | 384 |
| 392 private: | 385 private: |
| 393 FakeContentLayerClient client_; | 386 FakeContentLayerClient client_; |
| 394 }; | 387 }; |
| 395 | 388 |
| 396 class LayerTreeHostDamageTestScrollbarDoesDamage | 389 class LayerTreeHostDamageTestScrollbarDoesDamage |
| 397 : public LayerTreeHostScrollbarDamageTest { | 390 : public LayerTreeHostScrollbarDamageTest { |
| 398 virtual void BeginTest() override { | 391 void BeginTest() override { |
| 399 did_swaps_ = 0; | 392 did_swaps_ = 0; |
| 400 PostSetNeedsCommitToMainThread(); | 393 PostSetNeedsCommitToMainThread(); |
| 401 } | 394 } |
| 402 | 395 |
| 403 virtual DrawResult PrepareToDrawOnThread( | 396 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 404 LayerTreeHostImpl* host_impl, | 397 LayerTreeHostImpl::FrameData* frame_data, |
| 405 LayerTreeHostImpl::FrameData* frame_data, | 398 DrawResult draw_result) override { |
| 406 DrawResult draw_result) override { | |
| 407 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 399 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 408 RenderSurfaceImpl* root_surface = | 400 RenderSurfaceImpl* root_surface = |
| 409 host_impl->active_tree()->root_layer()->render_surface(); | 401 host_impl->active_tree()->root_layer()->render_surface(); |
| 410 gfx::RectF root_damage = | 402 gfx::RectF root_damage = |
| 411 root_surface->damage_tracker()->current_damage_rect(); | 403 root_surface->damage_tracker()->current_damage_rect(); |
| 412 root_damage.Intersect(root_surface->content_rect()); | 404 root_damage.Intersect(root_surface->content_rect()); |
| 413 switch (did_swaps_) { | 405 switch (did_swaps_) { |
| 414 case 0: | 406 case 0: |
| 415 // The first frame has damage, so we should draw and swap. | 407 // The first frame has damage, so we should draw and swap. |
| 416 break; | 408 break; |
| 417 case 1: | 409 case 1: |
| 418 // The second frame should not damage the scrollbars. | 410 // The second frame should not damage the scrollbars. |
| 419 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); | 411 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); |
| 420 break; | 412 break; |
| 421 case 2: | 413 case 2: |
| 422 // The third frame should damage the scrollbars. | 414 // The third frame should damage the scrollbars. |
| 423 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); | 415 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
| 424 break; | 416 break; |
| 425 case 3: | 417 case 3: |
| 426 // The fourth frame should damage the scrollbars. | 418 // The fourth frame should damage the scrollbars. |
| 427 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); | 419 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
| 428 EndTest(); | 420 EndTest(); |
| 429 break; | 421 break; |
| 430 } | 422 } |
| 431 return draw_result; | 423 return draw_result; |
| 432 } | 424 } |
| 433 | 425 |
| 434 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, | 426 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
| 435 bool result) override { | |
| 436 ++did_swaps_; | 427 ++did_swaps_; |
| 437 EXPECT_TRUE(result); | 428 EXPECT_TRUE(result); |
| 438 LayerImpl* root = host_impl->active_tree()->root_layer(); | 429 LayerImpl* root = host_impl->active_tree()->root_layer(); |
| 439 LayerImpl* scroll_clip_layer = root->children()[0]; | 430 LayerImpl* scroll_clip_layer = root->children()[0]; |
| 440 LayerImpl* scroll_layer = scroll_clip_layer->children()[0]; | 431 LayerImpl* scroll_layer = scroll_clip_layer->children()[0]; |
| 441 switch (did_swaps_) { | 432 switch (did_swaps_) { |
| 442 case 1: | 433 case 1: |
| 443 // Test that modifying the position of the content layer (not | 434 // Test that modifying the position of the content layer (not |
| 444 // scrolling) won't damage the scrollbar. | 435 // scrolling) won't damage the scrollbar. |
| 445 scroll_layer->SetPosition(gfx::Point(1, 1)); | 436 scroll_layer->SetPosition(gfx::Point(1, 1)); |
| 446 scroll_layer->SetScrollOffset(scroll_layer->scroll_offset()); | 437 scroll_layer->SetScrollOffset(scroll_layer->scroll_offset()); |
| 447 host_impl->SetNeedsRedraw(); | 438 host_impl->SetNeedsRedraw(); |
| 448 break; | 439 break; |
| 449 case 2: | 440 case 2: |
| 450 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); | 441 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); |
| 451 host_impl->SetNeedsRedraw(); | 442 host_impl->SetNeedsRedraw(); |
| 452 break; | 443 break; |
| 453 case 3: | 444 case 3: |
| 454 scroll_layer->SetBounds(gfx::Size(root->bounds().width() + 60, | 445 scroll_layer->SetBounds(gfx::Size(root->bounds().width() + 60, |
| 455 root->bounds().height() + 100)); | 446 root->bounds().height() + 100)); |
| 456 host_impl->SetNeedsRedraw(); | 447 host_impl->SetNeedsRedraw(); |
| 457 break; | 448 break; |
| 458 } | 449 } |
| 459 } | 450 } |
| 460 | 451 |
| 461 virtual void AfterTest() override { | 452 void AfterTest() override { EXPECT_EQ(4, did_swaps_); } |
| 462 EXPECT_EQ(4, did_swaps_); | |
| 463 } | |
| 464 | 453 |
| 465 int did_swaps_; | 454 int did_swaps_; |
| 466 }; | 455 }; |
| 467 | 456 |
| 468 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarDoesDamage); | 457 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarDoesDamage); |
| 469 | 458 |
| 470 class LayerTreeHostDamageTestScrollbarCommitDoesNoDamage | 459 class LayerTreeHostDamageTestScrollbarCommitDoesNoDamage |
| 471 : public LayerTreeHostScrollbarDamageTest { | 460 : public LayerTreeHostScrollbarDamageTest { |
| 472 virtual void BeginTest() override { | 461 void BeginTest() override { |
| 473 did_swaps_ = 0; | 462 did_swaps_ = 0; |
| 474 PostSetNeedsCommitToMainThread(); | 463 PostSetNeedsCommitToMainThread(); |
| 475 } | 464 } |
| 476 | 465 |
| 477 virtual DrawResult PrepareToDrawOnThread( | 466 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 478 LayerTreeHostImpl* host_impl, | 467 LayerTreeHostImpl::FrameData* frame_data, |
| 479 LayerTreeHostImpl::FrameData* frame_data, | 468 DrawResult draw_result) override { |
| 480 DrawResult draw_result) override { | |
| 481 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 469 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 482 RenderSurfaceImpl* root_surface = | 470 RenderSurfaceImpl* root_surface = |
| 483 host_impl->active_tree()->root_layer()->render_surface(); | 471 host_impl->active_tree()->root_layer()->render_surface(); |
| 484 gfx::RectF root_damage = | 472 gfx::RectF root_damage = |
| 485 root_surface->damage_tracker()->current_damage_rect(); | 473 root_surface->damage_tracker()->current_damage_rect(); |
| 486 root_damage.Intersect(root_surface->content_rect()); | 474 root_damage.Intersect(root_surface->content_rect()); |
| 487 int frame = host_impl->active_tree()->source_frame_number(); | 475 int frame = host_impl->active_tree()->source_frame_number(); |
| 488 switch (did_swaps_) { | 476 switch (did_swaps_) { |
| 489 case 0: | 477 case 0: |
| 490 // The first frame has damage, so we should draw and swap. | 478 // The first frame has damage, so we should draw and swap. |
| 491 EXPECT_EQ(0, frame); | 479 EXPECT_EQ(0, frame); |
| 492 break; | 480 break; |
| 493 case 1: | 481 case 1: |
| 494 // The second frame has scrolled, so the scrollbar should be damaged. | 482 // The second frame has scrolled, so the scrollbar should be damaged. |
| 495 EXPECT_EQ(0, frame); | 483 EXPECT_EQ(0, frame); |
| 496 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); | 484 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
| 497 break; | 485 break; |
| 498 case 2: | 486 case 2: |
| 499 // The third frame (after the commit) has no changes, so it shouldn't. | 487 // The third frame (after the commit) has no changes, so it shouldn't. |
| 500 EXPECT_EQ(1, frame); | 488 EXPECT_EQ(1, frame); |
| 501 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); | 489 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); |
| 502 break; | 490 break; |
| 503 default: | 491 default: |
| 504 NOTREACHED(); | 492 NOTREACHED(); |
| 505 break; | 493 break; |
| 506 } | 494 } |
| 507 return draw_result; | 495 return draw_result; |
| 508 } | 496 } |
| 509 | 497 |
| 510 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, | 498 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
| 511 bool result) override { | |
| 512 ++did_swaps_; | 499 ++did_swaps_; |
| 513 EXPECT_TRUE(result); | 500 EXPECT_TRUE(result); |
| 514 LayerImpl* root = host_impl->active_tree()->root_layer(); | 501 LayerImpl* root = host_impl->active_tree()->root_layer(); |
| 515 LayerImpl* scroll_clip_layer = root->children()[0]; | 502 LayerImpl* scroll_clip_layer = root->children()[0]; |
| 516 LayerImpl* scroll_layer = scroll_clip_layer->children()[0]; | 503 LayerImpl* scroll_layer = scroll_clip_layer->children()[0]; |
| 517 switch (did_swaps_) { | 504 switch (did_swaps_) { |
| 518 case 1: | 505 case 1: |
| 519 // Scroll on the thread. This should damage the scrollbar for the | 506 // Scroll on the thread. This should damage the scrollbar for the |
| 520 // next draw on the thread. | 507 // next draw on the thread. |
| 521 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); | 508 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); |
| 522 host_impl->SetNeedsRedraw(); | 509 host_impl->SetNeedsRedraw(); |
| 523 break; | 510 break; |
| 524 case 2: | 511 case 2: |
| 525 // Forcibly send the scroll to the main thread. | 512 // Forcibly send the scroll to the main thread. |
| 526 PostSetNeedsCommitToMainThread(); | 513 PostSetNeedsCommitToMainThread(); |
| 527 break; | 514 break; |
| 528 case 3: | 515 case 3: |
| 529 // First swap after second commit. | 516 // First swap after second commit. |
| 530 EndTest(); | 517 EndTest(); |
| 531 break; | 518 break; |
| 532 default: | 519 default: |
| 533 NOTREACHED(); | 520 NOTREACHED(); |
| 534 break; | 521 break; |
| 535 } | 522 } |
| 536 } | 523 } |
| 537 | 524 |
| 538 virtual void AfterTest() override { | 525 void AfterTest() override { EXPECT_EQ(3, did_swaps_); } |
| 539 EXPECT_EQ(3, did_swaps_); | |
| 540 } | |
| 541 | 526 |
| 542 int did_swaps_; | 527 int did_swaps_; |
| 543 }; | 528 }; |
| 544 | 529 |
| 545 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarCommitDoesNoDamage); | 530 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarCommitDoesNoDamage); |
| 546 | 531 |
| 547 class LayerTreeHostDamageTestVisibleTilesStillTriggerDraws | 532 class LayerTreeHostDamageTestVisibleTilesStillTriggerDraws |
| 548 : public LayerTreeHostDamageTest { | 533 : public LayerTreeHostDamageTest { |
| 549 | 534 void InitializeSettings(LayerTreeSettings* settings) override { |
| 550 virtual void InitializeSettings(LayerTreeSettings* settings) override { | |
| 551 settings->impl_side_painting = true; | 535 settings->impl_side_painting = true; |
| 552 } | 536 } |
| 553 | 537 |
| 554 virtual void BeginTest() override { | 538 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 555 PostSetNeedsCommitToMainThread(); | |
| 556 } | |
| 557 | 539 |
| 558 virtual void SetupTree() override { | 540 void SetupTree() override { |
| 559 scoped_refptr<FakePictureLayer> root = FakePictureLayer::Create(&client_); | 541 scoped_refptr<FakePictureLayer> root = FakePictureLayer::Create(&client_); |
| 560 root->SetBounds(gfx::Size(500, 500)); | 542 root->SetBounds(gfx::Size(500, 500)); |
| 561 layer_tree_host()->SetRootLayer(root); | 543 layer_tree_host()->SetRootLayer(root); |
| 562 LayerTreeHostDamageTest::SetupTree(); | 544 LayerTreeHostDamageTest::SetupTree(); |
| 563 | 545 |
| 564 swap_count_ = 0; | 546 swap_count_ = 0; |
| 565 prepare_to_draw_count_ = 0; | 547 prepare_to_draw_count_ = 0; |
| 566 update_visible_tile_count_ = 0; | 548 update_visible_tile_count_ = 0; |
| 567 } | 549 } |
| 568 | 550 |
| 569 virtual DrawResult PrepareToDrawOnThread( | 551 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 570 LayerTreeHostImpl* host_impl, | 552 LayerTreeHostImpl::FrameData* frame_data, |
| 571 LayerTreeHostImpl::FrameData* frame_data, | 553 DrawResult draw_result) override { |
| 572 DrawResult draw_result) override { | |
| 573 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 554 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 574 prepare_to_draw_count_++; | 555 prepare_to_draw_count_++; |
| 575 switch (prepare_to_draw_count_) { | 556 switch (prepare_to_draw_count_) { |
| 576 case 1: | 557 case 1: |
| 577 // Detect that we have an incomplete tile, during the first frame. | 558 // Detect that we have an incomplete tile, during the first frame. |
| 578 // The first frame should have damage. | 559 // The first frame should have damage. |
| 579 frame_data->contains_incomplete_tile = true; | 560 frame_data->contains_incomplete_tile = true; |
| 580 DCHECK(!frame_data->has_no_damage); | 561 DCHECK(!frame_data->has_no_damage); |
| 581 break; | 562 break; |
| 582 case 2: | 563 case 2: |
| 583 // Make a no-damage frame. We early out and can't detect | 564 // Make a no-damage frame. We early out and can't detect |
| 584 // incomplete tiles, even if they still exist. | 565 // incomplete tiles, even if they still exist. |
| 585 frame_data->contains_incomplete_tile = false; | 566 frame_data->contains_incomplete_tile = false; |
| 586 frame_data->has_no_damage = true; | 567 frame_data->has_no_damage = true; |
| 587 break; | 568 break; |
| 588 case 3: | 569 case 3: |
| 589 // Trigger the last swap for the completed tile. | 570 // Trigger the last swap for the completed tile. |
| 590 frame_data->contains_incomplete_tile = false; | 571 frame_data->contains_incomplete_tile = false; |
| 591 frame_data->has_no_damage = false; | 572 frame_data->has_no_damage = false; |
| 592 EndTest(); | 573 EndTest(); |
| 593 break; | 574 break; |
| 594 default: | 575 default: |
| 595 NOTREACHED(); | 576 NOTREACHED(); |
| 596 break; | 577 break; |
| 597 } | 578 } |
| 598 | 579 |
| 599 return draw_result; | 580 return draw_result; |
| 600 } | 581 } |
| 601 | 582 |
| 602 virtual void UpdateVisibleTilesOnThread( | 583 void UpdateVisibleTilesOnThread(LayerTreeHostImpl* host_impl) override { |
| 603 LayerTreeHostImpl* host_impl) override { | |
| 604 // Simulate creating some visible tiles (that trigger prepare-to-draws). | 584 // Simulate creating some visible tiles (that trigger prepare-to-draws). |
| 605 // The first we make into a no-damage-frame during prepare-to-draw (see | 585 // The first we make into a no-damage-frame during prepare-to-draw (see |
| 606 // above). This is to ensure we still get UpdateVisibleTiles calls after | 586 // above). This is to ensure we still get UpdateVisibleTiles calls after |
| 607 // a no-damage or aborted frame. | 587 // a no-damage or aborted frame. |
| 608 update_visible_tile_count_++; | 588 update_visible_tile_count_++; |
| 609 switch (update_visible_tile_count_) { | 589 switch (update_visible_tile_count_) { |
| 610 case 3: | 590 case 3: |
| 611 case 6: | 591 case 6: |
| 612 host_impl->DidInitializeVisibleTileForTesting(); | 592 host_impl->DidInitializeVisibleTileForTesting(); |
| 613 break; | 593 break; |
| 614 case 7: | 594 case 7: |
| 615 NOTREACHED(); | 595 NOTREACHED(); |
| 616 break; | 596 break; |
| 617 } | 597 } |
| 618 } | 598 } |
| 619 | 599 |
| 620 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, | 600 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, |
| 621 bool didSwap) override { | 601 bool didSwap) override { |
| 622 if (!didSwap) | 602 if (!didSwap) |
| 623 return; | 603 return; |
| 624 ++swap_count_; | 604 ++swap_count_; |
| 625 } | 605 } |
| 626 | 606 |
| 627 virtual void AfterTest() override { | 607 void AfterTest() override { |
| 628 // We should keep getting update-visible-tiles calls | 608 // We should keep getting update-visible-tiles calls |
| 629 // until we report there are no more incomplete-tiles. | 609 // until we report there are no more incomplete-tiles. |
| 630 EXPECT_EQ(update_visible_tile_count_, 6); | 610 EXPECT_EQ(update_visible_tile_count_, 6); |
| 631 // First frame, plus two triggered by DidInitializeVisibleTile() | 611 // First frame, plus two triggered by DidInitializeVisibleTile() |
| 632 EXPECT_EQ(prepare_to_draw_count_, 3); | 612 EXPECT_EQ(prepare_to_draw_count_, 3); |
| 633 // First swap, plus final swap (contained damage). | 613 // First swap, plus final swap (contained damage). |
| 634 EXPECT_EQ(swap_count_, 2); | 614 EXPECT_EQ(swap_count_, 2); |
| 635 } | 615 } |
| 636 | 616 |
| 637 FakeContentLayerClient client_; | 617 FakeContentLayerClient client_; |
| 638 int swap_count_; | 618 int swap_count_; |
| 639 int prepare_to_draw_count_; | 619 int prepare_to_draw_count_; |
| 640 int update_visible_tile_count_; | 620 int update_visible_tile_count_; |
| 641 }; | 621 }; |
| 642 | 622 |
| 643 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestVisibleTilesStillTriggerDraws); | 623 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestVisibleTilesStillTriggerDraws); |
| 644 | 624 |
| 645 } // namespace | 625 } // namespace |
| 646 } // namespace cc | 626 } // namespace cc |
| OLD | NEW |