| 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/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 | 142 |
| 143 int draw_count_; | 143 int draw_count_; |
| 144 FakeContentLayerClient client_; | 144 FakeContentLayerClient client_; |
| 145 }; | 145 }; |
| 146 | 146 |
| 147 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetViewportSize); | 147 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetViewportSize); |
| 148 | 148 |
| 149 class LayerTreeHostDamageTestNoDamageDoesNotSwap | 149 class LayerTreeHostDamageTestNoDamageDoesNotSwap |
| 150 : public LayerTreeHostDamageTest { | 150 : public LayerTreeHostDamageTest { |
| 151 void BeginTest() override { | 151 void BeginTest() override { |
| 152 expect_swap_and_succeed_ = 0; | |
| 153 did_swaps_ = 0; | |
| 154 did_swap_and_succeed_ = 0; | |
| 155 PostSetNeedsCommitToMainThread(); | 152 PostSetNeedsCommitToMainThread(); |
| 156 } | 153 } |
| 157 | 154 |
| 158 void SetupTree() override { | 155 void SetupTree() override { |
| 159 scoped_refptr<FakePictureLayer> root = FakePictureLayer::Create(&client_); | 156 scoped_refptr<FakePictureLayer> root = FakePictureLayer::Create(&client_); |
| 160 root->SetBounds(gfx::Size(10, 10)); | 157 root->SetBounds(gfx::Size(10, 10)); |
| 161 | 158 |
| 162 // Most of the layer isn't visible. | 159 // Most of the layer isn't visible. |
| 163 content_ = FakePictureLayer::Create(&client_); | 160 content_ = FakePictureLayer::Create(&client_); |
| 164 content_->SetBounds(gfx::Size(2000, 100)); | 161 content_->SetBounds(gfx::Size(2000, 100)); |
| 165 root->AddChild(content_); | 162 root->AddChild(content_); |
| 166 | 163 |
| 167 layer_tree_host()->SetRootLayer(root); | 164 layer_tree_host()->SetRootLayer(root); |
| 168 LayerTreeHostDamageTest::SetupTree(); | 165 LayerTreeHostDamageTest::SetupTree(); |
| 169 client_.set_bounds(root->bounds()); | 166 client_.set_bounds(root->bounds()); |
| 170 } | 167 } |
| 171 | 168 |
| 172 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, | 169 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 173 LayerTreeHostImpl::FrameData* frame_data, | 170 LayerTreeHostImpl::FrameData* frame_data, |
| 174 DrawResult draw_result) override { | 171 DrawResult draw_result) override { |
| 175 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 172 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 176 | 173 |
| 177 int source_frame = host_impl->active_tree()->source_frame_number(); | 174 int source_frame = host_impl->active_tree()->source_frame_number(); |
| 178 switch (source_frame) { | 175 switch (source_frame) { |
| 179 case 0: | 176 case 0: |
| 180 // The first frame has damage, so we should draw and swap. | 177 // The first frame has damage, so we should draw and swap. |
| 181 ++expect_swap_and_succeed_; | 178 EXPECT_FALSE(frame_data->has_no_damage); |
| 179 ++expect_swap_; |
| 182 break; | 180 break; |
| 183 case 1: | 181 case 1: |
| 184 // 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. |
| 183 EXPECT_TRUE(frame_data->has_no_damage); |
| 185 break; | 184 break; |
| 186 case 2: | 185 case 2: |
| 187 // The third frame has damage again, so we should draw and swap. | 186 // The third frame has damage again, so we should draw and swap. |
| 188 ++expect_swap_and_succeed_; | 187 EXPECT_FALSE(frame_data->has_no_damage); |
| 188 ++expect_swap_; |
| 189 break; | 189 break; |
| 190 case 3: | 190 case 3: |
| 191 // The fourth frame has no visible damage, so we should not draw and | 191 // The fourth frame has no visible damage, so we should not draw and |
| 192 // swap. | 192 // swap. |
| 193 EXPECT_TRUE(frame_data->has_no_damage); |
| 193 EndTest(); | 194 EndTest(); |
| 194 break; | 195 break; |
| 195 } | 196 } |
| 196 return draw_result; | 197 return draw_result; |
| 197 } | 198 } |
| 198 | 199 |
| 199 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { | 200 void SwapBuffersCompleteOnThread() override { |
| 200 ++did_swaps_; | 201 ++did_swap_; |
| 201 if (result) | 202 EXPECT_EQ(expect_swap_, did_swap_); |
| 202 ++did_swap_and_succeed_; | |
| 203 EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); | |
| 204 } | 203 } |
| 205 | 204 |
| 206 void DidCommit() override { | 205 void DidCommit() override { |
| 207 int next_frame = layer_tree_host()->source_frame_number(); | 206 int next_frame = layer_tree_host()->source_frame_number(); |
| 208 switch (next_frame) { | 207 switch (next_frame) { |
| 209 case 1: | 208 case 1: |
| 210 layer_tree_host()->SetNeedsCommit(); | 209 layer_tree_host()->SetNeedsCommit(); |
| 211 break; | 210 break; |
| 212 case 2: | 211 case 2: |
| 213 // Cause visible damage. | 212 // Cause visible damage. |
| 214 content_->SetNeedsDisplayRect( | 213 content_->SetNeedsDisplayRect( |
| 215 gfx::Rect(layer_tree_host()->device_viewport_size())); | 214 gfx::Rect(layer_tree_host()->device_viewport_size())); |
| 216 break; | 215 break; |
| 217 case 3: | 216 case 3: |
| 218 // Cause non-visible damage. | 217 // Cause non-visible damage. |
| 219 content_->SetNeedsDisplayRect(gfx::Rect(1990, 1990, 10, 10)); | 218 content_->SetNeedsDisplayRect(gfx::Rect(1990, 1990, 10, 10)); |
| 220 layer_tree_host()->SetNeedsCommit(); | 219 layer_tree_host()->SetNeedsCommit(); |
| 221 break; | 220 break; |
| 222 } | 221 } |
| 223 } | 222 } |
| 224 | 223 |
| 225 void AfterTest() override { | 224 void AfterTest() override { |
| 226 EXPECT_EQ(4, did_swaps_); | 225 EXPECT_EQ(2, expect_swap_); |
| 227 EXPECT_EQ(2, expect_swap_and_succeed_); | 226 EXPECT_EQ(expect_swap_, did_swap_); |
| 228 EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); | |
| 229 } | 227 } |
| 230 | 228 |
| 231 FakeContentLayerClient client_; | 229 FakeContentLayerClient client_; |
| 232 scoped_refptr<FakePictureLayer> content_; | 230 scoped_refptr<FakePictureLayer> content_; |
| 233 int expect_swap_and_succeed_; | 231 int expect_swap_ = 0; |
| 234 int did_swaps_; | 232 int did_swap_ = 0; |
| 235 int did_swap_and_succeed_; | |
| 236 }; | 233 }; |
| 237 | 234 |
| 238 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestNoDamageDoesNotSwap); | 235 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestNoDamageDoesNotSwap); |
| 239 | 236 |
| 240 class LayerTreeHostDamageTestForcedFullDamage : public LayerTreeHostDamageTest { | 237 class LayerTreeHostDamageTestForcedFullDamage : public LayerTreeHostDamageTest { |
| 241 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 238 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 242 | 239 |
| 243 void SetupTree() override { | 240 void SetupTree() override { |
| 244 root_ = FakePictureLayer::Create(&client_); | 241 root_ = FakePictureLayer::Create(&client_); |
| 245 child_ = FakePictureLayer::Create(&client_); | 242 child_ = FakePictureLayer::Create(&client_); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 private: | 366 private: |
| 370 FakeContentLayerClient client_; | 367 FakeContentLayerClient client_; |
| 371 | 368 |
| 372 protected: | 369 protected: |
| 373 scoped_refptr<Layer> content_layer_; | 370 scoped_refptr<Layer> content_layer_; |
| 374 }; | 371 }; |
| 375 | 372 |
| 376 class LayerTreeHostDamageTestScrollbarDoesDamage | 373 class LayerTreeHostDamageTestScrollbarDoesDamage |
| 377 : public LayerTreeHostScrollbarDamageTest { | 374 : public LayerTreeHostScrollbarDamageTest { |
| 378 void BeginTest() override { | 375 void BeginTest() override { |
| 379 did_swaps_ = 0; | 376 num_draws_ = 0; |
| 380 PostSetNeedsCommitToMainThread(); | 377 PostSetNeedsCommitToMainThread(); |
| 381 } | 378 } |
| 382 | 379 |
| 383 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, | 380 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 384 LayerTreeHostImpl::FrameData* frame_data, | 381 LayerTreeHostImpl::FrameData* frame_data, |
| 385 DrawResult draw_result) override { | 382 DrawResult draw_result) override { |
| 386 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 383 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 387 RenderSurfaceImpl* root_surface = | 384 RenderSurfaceImpl* root_surface = |
| 388 host_impl->active_tree()->root_layer_for_testing()->render_surface(); | 385 host_impl->active_tree()->root_layer_for_testing()->render_surface(); |
| 389 gfx::Rect root_damage = | 386 gfx::Rect root_damage = |
| 390 root_surface->damage_tracker()->current_damage_rect(); | 387 root_surface->damage_tracker()->current_damage_rect(); |
| 391 root_damage.Intersect(root_surface->content_rect()); | 388 root_damage.Intersect(root_surface->content_rect()); |
| 392 switch (did_swaps_) { | 389 switch (num_draws_) { |
| 393 case 0: | 390 case 0: |
| 394 // The first frame has damage, so we should draw and swap. | 391 // The first frame has damage, so we should draw and swap. |
| 395 break; | 392 break; |
| 396 case 1: | 393 case 1: |
| 397 // The second frame should not damage the scrollbars. | 394 // The second frame should not damage the scrollbars. |
| 398 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); | 395 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); |
| 399 break; | 396 break; |
| 400 case 2: | 397 case 2: |
| 401 // The third frame should damage the scrollbars. | 398 // The third frame should damage the scrollbars. |
| 402 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); | 399 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
| 403 break; | 400 break; |
| 404 case 3: | 401 case 3: |
| 405 // The fourth frame should damage the scrollbars. | 402 // The fourth frame should damage the scrollbars. |
| 406 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); | 403 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
| 407 EndTest(); | 404 EndTest(); |
| 408 break; | 405 break; |
| 409 } | 406 } |
| 410 return draw_result; | 407 return draw_result; |
| 411 } | 408 } |
| 412 | 409 |
| 413 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { | 410 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
| 414 ++did_swaps_; | 411 ++num_draws_; |
| 415 EXPECT_TRUE(result); | |
| 416 LayerImpl* scroll_layer = | 412 LayerImpl* scroll_layer = |
| 417 host_impl->active_tree()->LayerById(content_layer_->id()); | 413 host_impl->active_tree()->LayerById(content_layer_->id()); |
| 418 switch (did_swaps_) { | 414 switch (num_draws_) { |
| 419 case 1: | 415 case 1: |
| 420 // Test that modifying the position of the content layer (not | 416 // Test that modifying the position of the content layer (not |
| 421 // scrolling) won't damage the scrollbar. | 417 // scrolling) won't damage the scrollbar. |
| 422 MainThreadTaskRunner()->PostTask( | 418 MainThreadTaskRunner()->PostTask( |
| 423 FROM_HERE, base::Bind(&LayerTreeHostDamageTestScrollbarDoesDamage:: | 419 FROM_HERE, base::Bind(&LayerTreeHostDamageTestScrollbarDoesDamage:: |
| 424 ModifyContentLayerPosition, | 420 ModifyContentLayerPosition, |
| 425 base::Unretained(this))); | 421 base::Unretained(this))); |
| 426 break; | 422 break; |
| 427 case 2: | 423 case 2: |
| 428 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); | 424 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); |
| 429 host_impl->SetNeedsRedraw(); | 425 host_impl->SetNeedsRedraw(); |
| 430 break; | 426 break; |
| 431 case 3: | 427 case 3: |
| 432 // We will resize the content layer, on the main thread. | 428 // We will resize the content layer, on the main thread. |
| 433 MainThreadTaskRunner()->PostTask( | 429 MainThreadTaskRunner()->PostTask( |
| 434 FROM_HERE, | 430 FROM_HERE, |
| 435 base::Bind( | 431 base::Bind( |
| 436 &LayerTreeHostDamageTestScrollbarDoesDamage::ResizeScrollLayer, | 432 &LayerTreeHostDamageTestScrollbarDoesDamage::ResizeScrollLayer, |
| 437 base::Unretained(this))); | 433 base::Unretained(this))); |
| 438 break; | 434 break; |
| 439 } | 435 } |
| 440 } | 436 } |
| 441 | 437 |
| 442 void ModifyContentLayerPosition() { | 438 void ModifyContentLayerPosition() { |
| 443 EXPECT_EQ(1, did_swaps_); | 439 EXPECT_EQ(1, num_draws_); |
| 444 content_layer_->SetPosition(gfx::PointF(10.f, 10.f)); | 440 content_layer_->SetPosition(gfx::PointF(10.f, 10.f)); |
| 445 } | 441 } |
| 446 | 442 |
| 447 void ResizeScrollLayer() { | 443 void ResizeScrollLayer() { |
| 448 EXPECT_EQ(3, did_swaps_); | 444 EXPECT_EQ(3, num_draws_); |
| 449 Layer* root = layer_tree_host()->root_layer(); | 445 Layer* root = layer_tree_host()->root_layer(); |
| 450 content_layer_->SetBounds( | 446 content_layer_->SetBounds( |
| 451 gfx::Size(root->bounds().width() + 60, root->bounds().height() + 100)); | 447 gfx::Size(root->bounds().width() + 60, root->bounds().height() + 100)); |
| 452 } | 448 } |
| 453 | 449 |
| 454 void AfterTest() override { EXPECT_EQ(4, did_swaps_); } | 450 void AfterTest() override { EXPECT_EQ(4, num_draws_); } |
| 455 | 451 |
| 456 int did_swaps_; | 452 int num_draws_; |
| 457 }; | 453 }; |
| 458 | 454 |
| 459 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarDoesDamage); | 455 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarDoesDamage); |
| 460 | 456 |
| 461 class LayerTreeHostDamageTestScrollbarCommitDoesNoDamage | 457 class LayerTreeHostDamageTestScrollbarCommitDoesNoDamage |
| 462 : public LayerTreeHostScrollbarDamageTest { | 458 : public LayerTreeHostScrollbarDamageTest { |
| 463 void BeginTest() override { | 459 void BeginTest() override { |
| 464 did_swaps_ = 0; | 460 num_draws_ = 0; |
| 465 PostSetNeedsCommitToMainThread(); | 461 PostSetNeedsCommitToMainThread(); |
| 466 } | 462 } |
| 467 | 463 |
| 468 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, | 464 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
| 469 LayerTreeHostImpl::FrameData* frame_data, | 465 LayerTreeHostImpl::FrameData* frame_data, |
| 470 DrawResult draw_result) override { | 466 DrawResult draw_result) override { |
| 471 EXPECT_EQ(DRAW_SUCCESS, draw_result); | 467 EXPECT_EQ(DRAW_SUCCESS, draw_result); |
| 472 RenderSurfaceImpl* root_surface = | 468 RenderSurfaceImpl* root_surface = |
| 473 host_impl->active_tree()->root_layer_for_testing()->render_surface(); | 469 host_impl->active_tree()->root_layer_for_testing()->render_surface(); |
| 474 gfx::Rect root_damage = | 470 gfx::Rect root_damage = |
| 475 root_surface->damage_tracker()->current_damage_rect(); | 471 root_surface->damage_tracker()->current_damage_rect(); |
| 476 root_damage.Intersect(root_surface->content_rect()); | 472 root_damage.Intersect(root_surface->content_rect()); |
| 477 int frame = host_impl->active_tree()->source_frame_number(); | 473 int frame = host_impl->active_tree()->source_frame_number(); |
| 478 switch (did_swaps_) { | 474 switch (num_draws_) { |
| 479 case 0: | 475 case 0: |
| 480 // The first frame has damage, so we should draw and swap. | 476 // The first frame has damage, so we should draw and swap. |
| 481 EXPECT_EQ(0, frame); | 477 EXPECT_EQ(0, frame); |
| 482 break; | 478 break; |
| 483 case 1: | 479 case 1: |
| 484 // The second frame has scrolled, so the scrollbar should be damaged. | 480 // The second frame has scrolled, so the scrollbar should be damaged. |
| 485 EXPECT_EQ(0, frame); | 481 EXPECT_EQ(0, frame); |
| 486 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); | 482 EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
| 487 break; | 483 break; |
| 488 case 2: | 484 case 2: |
| 489 // The third frame (after the commit) has no changes, so it shouldn't. | 485 // The third frame (after the commit) has no changes, so it shouldn't. |
| 490 EXPECT_EQ(1, frame); | 486 EXPECT_EQ(1, frame); |
| 491 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); | 487 EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); |
| 492 break; | 488 break; |
| 493 default: | 489 default: |
| 494 NOTREACHED(); | 490 NOTREACHED(); |
| 495 break; | 491 break; |
| 496 } | 492 } |
| 497 return draw_result; | 493 return draw_result; |
| 498 } | 494 } |
| 499 | 495 |
| 500 void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { | 496 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
| 501 ++did_swaps_; | 497 ++num_draws_; |
| 502 EXPECT_TRUE(result); | |
| 503 LayerImpl* scroll_layer = | 498 LayerImpl* scroll_layer = |
| 504 host_impl->active_tree()->LayerById(content_layer_->id()); | 499 host_impl->active_tree()->LayerById(content_layer_->id()); |
| 505 switch (did_swaps_) { | 500 switch (num_draws_) { |
| 506 case 1: | 501 case 1: |
| 507 // Scroll on the thread. This should damage the scrollbar for the | 502 // Scroll on the thread. This should damage the scrollbar for the |
| 508 // next draw on the thread. | 503 // next draw on the thread. |
| 509 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); | 504 scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); |
| 510 host_impl->SetNeedsRedraw(); | 505 host_impl->SetNeedsRedraw(); |
| 511 break; | 506 break; |
| 512 case 2: | 507 case 2: |
| 513 // Forcibly send the scroll to the main thread. | 508 // Forcibly send the scroll to the main thread. |
| 514 PostSetNeedsCommitToMainThread(); | 509 PostSetNeedsCommitToMainThread(); |
| 515 break; | 510 break; |
| 516 case 3: | 511 case 3: |
| 517 // First swap after second commit. | 512 // First swap after second commit. |
| 518 EndTest(); | 513 EndTest(); |
| 519 break; | 514 break; |
| 520 default: | 515 default: |
| 521 NOTREACHED(); | 516 NOTREACHED(); |
| 522 break; | 517 break; |
| 523 } | 518 } |
| 524 } | 519 } |
| 525 | 520 |
| 526 void AfterTest() override { EXPECT_EQ(3, did_swaps_); } | 521 void AfterTest() override { EXPECT_EQ(3, num_draws_); } |
| 527 | 522 |
| 528 int did_swaps_; | 523 int num_draws_; |
| 529 }; | 524 }; |
| 530 | 525 |
| 531 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarCommitDoesNoDamage); | 526 MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarCommitDoesNoDamage); |
| 532 | 527 |
| 533 } // namespace | 528 } // namespace |
| 534 } // namespace cc | 529 } // namespace cc |
| OLD | NEW |