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 |