OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/test/layer_tree_test.h" | 5 #include "cc/test/layer_tree_test.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "cc/animation/animation.h" | 8 #include "cc/animation/animation.h" |
9 #include "cc/animation/animation_registrar.h" | 9 #include "cc/animation/animation_registrar.h" |
10 #include "cc/animation/layer_animation_controller.h" | 10 #include "cc/animation/layer_animation_controller.h" |
11 #include "cc/animation/timing_function.h" | 11 #include "cc/animation/timing_function.h" |
12 #include "cc/base/switches.h" | 12 #include "cc/base/switches.h" |
13 #include "cc/base/thread_impl.h" | |
14 #include "cc/input/input_handler.h" | 13 #include "cc/input/input_handler.h" |
15 #include "cc/layers/content_layer.h" | 14 #include "cc/layers/content_layer.h" |
16 #include "cc/layers/layer.h" | 15 #include "cc/layers/layer.h" |
17 #include "cc/layers/layer_impl.h" | 16 #include "cc/layers/layer_impl.h" |
18 #include "cc/test/animation_test_common.h" | 17 #include "cc/test/animation_test_common.h" |
19 #include "cc/test/fake_context_provider.h" | 18 #include "cc/test/fake_context_provider.h" |
20 #include "cc/test/fake_layer_tree_host_client.h" | 19 #include "cc/test/fake_layer_tree_host_client.h" |
21 #include "cc/test/fake_output_surface.h" | 20 #include "cc/test/fake_output_surface.h" |
22 #include "cc/test/occlusion_tracker_test_common.h" | 21 #include "cc/test/occlusion_tracker_test_common.h" |
23 #include "cc/test/tiled_layer_test_common.h" | 22 #include "cc/test/tiled_layer_test_common.h" |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 TestHooks* test_hooks_; | 171 TestHooks* test_hooks_; |
173 }; | 172 }; |
174 | 173 |
175 // Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting. | 174 // Adapts LayerTreeHost for test. Injects LayerTreeHostImplForTesting. |
176 class LayerTreeHostForTesting : public cc::LayerTreeHost { | 175 class LayerTreeHostForTesting : public cc::LayerTreeHost { |
177 public: | 176 public: |
178 static scoped_ptr<LayerTreeHostForTesting> Create( | 177 static scoped_ptr<LayerTreeHostForTesting> Create( |
179 TestHooks* test_hooks, | 178 TestHooks* test_hooks, |
180 cc::LayerTreeHostClient* host_client, | 179 cc::LayerTreeHostClient* host_client, |
181 const cc::LayerTreeSettings& settings, | 180 const cc::LayerTreeSettings& settings, |
182 scoped_ptr<cc::Thread> impl_thread) { | 181 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { |
183 scoped_ptr<LayerTreeHostForTesting> layer_tree_host( | 182 scoped_ptr<LayerTreeHostForTesting> layer_tree_host( |
184 new LayerTreeHostForTesting(test_hooks, host_client, settings)); | 183 new LayerTreeHostForTesting(test_hooks, host_client, settings)); |
185 bool success = layer_tree_host->Initialize(impl_thread.Pass()); | 184 bool success = layer_tree_host->Initialize(impl_task_runner); |
186 EXPECT_TRUE(success); | 185 EXPECT_TRUE(success); |
187 return layer_tree_host.Pass(); | 186 return layer_tree_host.Pass(); |
188 } | 187 } |
189 | 188 |
190 virtual scoped_ptr<cc::LayerTreeHostImpl> CreateLayerTreeHostImpl( | 189 virtual scoped_ptr<cc::LayerTreeHostImpl> CreateLayerTreeHostImpl( |
191 cc::LayerTreeHostImplClient* host_impl_client) OVERRIDE { | 190 cc::LayerTreeHostImplClient* host_impl_client) OVERRIDE { |
192 return LayerTreeHostImplForTesting::Create( | 191 return LayerTreeHostImplForTesting::Create( |
193 test_hooks_, | 192 test_hooks_, |
194 settings(), | 193 settings(), |
195 host_impl_client, | 194 host_impl_client, |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 LayerTreeTest::~LayerTreeTest() {} | 317 LayerTreeTest::~LayerTreeTest() {} |
319 | 318 |
320 void LayerTreeTest::EndTest() { | 319 void LayerTreeTest::EndTest() { |
321 // For the case where we EndTest during BeginTest(), set a flag to indicate | 320 // For the case where we EndTest during BeginTest(), set a flag to indicate |
322 // that the test should end the second BeginTest regains control. | 321 // that the test should end the second BeginTest regains control. |
323 if (beginning_) { | 322 if (beginning_) { |
324 end_when_begin_returns_ = true; | 323 end_when_begin_returns_ = true; |
325 } else if (proxy()) { | 324 } else if (proxy()) { |
326 // Racy timeouts and explicit EndTest calls might have cleaned up | 325 // Racy timeouts and explicit EndTest calls might have cleaned up |
327 // the tree host. Should check proxy first. | 326 // the tree host. Should check proxy first. |
328 proxy()->MainThread()->PostTask( | 327 proxy()->MainThreadTaskRunner()->PostTask( |
| 328 FROM_HERE, |
329 base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); | 329 base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); |
330 } | 330 } |
331 } | 331 } |
332 | 332 |
333 void LayerTreeTest::EndTestAfterDelay(int delay_milliseconds) { | 333 void LayerTreeTest::EndTestAfterDelay(int delay_milliseconds) { |
334 proxy()->MainThread()->PostTask( | 334 proxy()->MainThreadTaskRunner()->PostTask( |
| 335 FROM_HERE, |
335 base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_)); | 336 base::Bind(&LayerTreeTest::EndTest, main_thread_weak_ptr_)); |
336 } | 337 } |
337 | 338 |
338 void LayerTreeTest::PostAddAnimationToMainThread( | 339 void LayerTreeTest::PostAddAnimationToMainThread( |
339 Layer* layer_to_receive_animation) { | 340 Layer* layer_to_receive_animation) { |
340 proxy()->MainThread()->PostTask( | 341 proxy()->MainThreadTaskRunner()->PostTask( |
| 342 FROM_HERE, |
341 base::Bind(&LayerTreeTest::DispatchAddAnimation, | 343 base::Bind(&LayerTreeTest::DispatchAddAnimation, |
342 main_thread_weak_ptr_, | 344 main_thread_weak_ptr_, |
343 base::Unretained(layer_to_receive_animation))); | 345 base::Unretained(layer_to_receive_animation))); |
344 } | 346 } |
345 | 347 |
346 void LayerTreeTest::PostAddInstantAnimationToMainThread( | 348 void LayerTreeTest::PostAddInstantAnimationToMainThread( |
347 Layer* layer_to_receive_animation) { | 349 Layer* layer_to_receive_animation) { |
348 proxy()->MainThread()->PostTask( | 350 proxy()->MainThreadTaskRunner()->PostTask( |
| 351 FROM_HERE, |
349 base::Bind(&LayerTreeTest::DispatchAddInstantAnimation, | 352 base::Bind(&LayerTreeTest::DispatchAddInstantAnimation, |
350 main_thread_weak_ptr_, | 353 main_thread_weak_ptr_, |
351 base::Unretained(layer_to_receive_animation))); | 354 base::Unretained(layer_to_receive_animation))); |
352 } | 355 } |
353 | 356 |
354 void LayerTreeTest::PostSetNeedsCommitToMainThread() { | 357 void LayerTreeTest::PostSetNeedsCommitToMainThread() { |
355 proxy()->MainThread()->PostTask( | 358 proxy()->MainThreadTaskRunner()->PostTask( |
| 359 FROM_HERE, |
356 base::Bind(&LayerTreeTest::DispatchSetNeedsCommit, | 360 base::Bind(&LayerTreeTest::DispatchSetNeedsCommit, |
357 main_thread_weak_ptr_)); | 361 main_thread_weak_ptr_)); |
358 } | 362 } |
359 | 363 |
360 void LayerTreeTest::PostAcquireLayerTextures() { | 364 void LayerTreeTest::PostAcquireLayerTextures() { |
361 proxy()->MainThread()->PostTask( | 365 proxy()->MainThreadTaskRunner()->PostTask( |
| 366 FROM_HERE, |
362 base::Bind(&LayerTreeTest::DispatchAcquireLayerTextures, | 367 base::Bind(&LayerTreeTest::DispatchAcquireLayerTextures, |
363 main_thread_weak_ptr_)); | 368 main_thread_weak_ptr_)); |
364 } | 369 } |
365 | 370 |
366 void LayerTreeTest::PostSetNeedsRedrawToMainThread() { | 371 void LayerTreeTest::PostSetNeedsRedrawToMainThread() { |
367 proxy()->MainThread()->PostTask( | 372 proxy()->MainThreadTaskRunner()->PostTask( |
| 373 FROM_HERE, |
368 base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw, | 374 base::Bind(&LayerTreeTest::DispatchSetNeedsRedraw, |
369 main_thread_weak_ptr_)); | 375 main_thread_weak_ptr_)); |
370 } | 376 } |
371 | 377 |
372 void LayerTreeTest::PostSetNeedsRedrawRectToMainThread(gfx::Rect damage_rect) { | 378 void LayerTreeTest::PostSetNeedsRedrawRectToMainThread(gfx::Rect damage_rect) { |
373 proxy()->MainThread()->PostTask( | 379 proxy()->MainThreadTaskRunner()->PostTask( |
| 380 FROM_HERE, |
374 base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect, | 381 base::Bind(&LayerTreeTest::DispatchSetNeedsRedrawRect, |
375 main_thread_weak_ptr_, damage_rect)); | 382 main_thread_weak_ptr_, damage_rect)); |
376 } | 383 } |
377 | 384 |
378 void LayerTreeTest::PostSetVisibleToMainThread(bool visible) { | 385 void LayerTreeTest::PostSetVisibleToMainThread(bool visible) { |
379 proxy()->MainThread()->PostTask( | 386 proxy()->MainThreadTaskRunner()->PostTask( |
| 387 FROM_HERE, |
380 base::Bind(&LayerTreeTest::DispatchSetVisible, | 388 base::Bind(&LayerTreeTest::DispatchSetVisible, |
381 main_thread_weak_ptr_, | 389 main_thread_weak_ptr_, |
382 visible)); | 390 visible)); |
383 } | 391 } |
384 | 392 |
385 void LayerTreeTest::DoBeginTest() { | 393 void LayerTreeTest::DoBeginTest() { |
386 client_ = LayerTreeHostClientForTesting::Create(this); | 394 client_ = LayerTreeHostClientForTesting::Create(this); |
387 | 395 |
388 scoped_ptr<cc::Thread> impl_ccthread; | 396 DCHECK(!impl_thread_ || impl_thread_->message_loop_proxy()); |
389 if (impl_thread_) { | 397 layer_tree_host_ = LayerTreeHostForTesting::Create( |
390 impl_ccthread = cc::ThreadImpl::CreateForDifferentThread( | 398 this, |
391 impl_thread_->message_loop_proxy()); | 399 client_.get(), |
392 } | 400 settings_, |
393 layer_tree_host_ = LayerTreeHostForTesting::Create(this, | 401 impl_thread_ ? impl_thread_->message_loop_proxy() : NULL); |
394 client_.get(), | |
395 settings_, | |
396 impl_ccthread.Pass()); | |
397 ASSERT_TRUE(layer_tree_host_); | 402 ASSERT_TRUE(layer_tree_host_); |
398 | 403 |
399 started_ = true; | 404 started_ = true; |
400 beginning_ = true; | 405 beginning_ = true; |
401 SetupTree(); | 406 SetupTree(); |
402 layer_tree_host_->SetLayerTreeHostClientReady(); | 407 layer_tree_host_->SetLayerTreeHostClientReady(); |
403 BeginTest(); | 408 BeginTest(); |
404 beginning_ = false; | 409 beginning_ = false; |
405 if (end_when_begin_returns_) | 410 if (end_when_begin_returns_) |
406 RealEndTest(); | 411 RealEndTest(); |
(...skipping 25 matching lines...) Expand all Loading... |
432 | 437 |
433 void LayerTreeTest::Timeout() { | 438 void LayerTreeTest::Timeout() { |
434 timed_out_ = true; | 439 timed_out_ = true; |
435 EndTest(); | 440 EndTest(); |
436 } | 441 } |
437 | 442 |
438 void LayerTreeTest::ScheduleComposite() { | 443 void LayerTreeTest::ScheduleComposite() { |
439 if (!started_ || scheduled_) | 444 if (!started_ || scheduled_) |
440 return; | 445 return; |
441 scheduled_ = true; | 446 scheduled_ = true; |
442 proxy()->MainThread()->PostTask( | 447 proxy()->MainThreadTaskRunner()->PostTask( |
| 448 FROM_HERE, |
443 base::Bind(&LayerTreeTest::DispatchComposite, main_thread_weak_ptr_)); | 449 base::Bind(&LayerTreeTest::DispatchComposite, main_thread_weak_ptr_)); |
444 } | 450 } |
445 | 451 |
446 void LayerTreeTest::RealEndTest() { | 452 void LayerTreeTest::RealEndTest() { |
447 ended_ = true; | 453 ended_ = true; |
448 | 454 |
449 if (layer_tree_host_ && proxy()->CommitPendingForTesting()) { | 455 if (layer_tree_host_ && proxy()->CommitPendingForTesting()) { |
450 proxy()->MainThread()->PostTask( | 456 proxy()->MainThreadTaskRunner()->PostTask( |
| 457 FROM_HERE, |
451 base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); | 458 base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_)); |
452 return; | 459 return; |
453 } | 460 } |
454 | 461 |
455 base::MessageLoop::current()->Quit(); | 462 base::MessageLoop::current()->Quit(); |
456 } | 463 } |
457 | 464 |
458 void LayerTreeTest::DispatchAddInstantAnimation( | 465 void LayerTreeTest::DispatchAddInstantAnimation( |
459 Layer* layer_to_receive_animation) { | 466 Layer* layer_to_receive_animation) { |
460 DCHECK(!proxy() || proxy()->IsMainThread()); | 467 DCHECK(!proxy() || proxy()->IsMainThread()); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 } | 548 } |
542 | 549 |
543 void LayerTreeTest::RunTest(bool threaded, | 550 void LayerTreeTest::RunTest(bool threaded, |
544 bool delegating_renderer, | 551 bool delegating_renderer, |
545 bool impl_side_painting) { | 552 bool impl_side_painting) { |
546 if (threaded) { | 553 if (threaded) { |
547 impl_thread_.reset(new base::Thread("Compositor")); | 554 impl_thread_.reset(new base::Thread("Compositor")); |
548 ASSERT_TRUE(impl_thread_->Start()); | 555 ASSERT_TRUE(impl_thread_->Start()); |
549 } | 556 } |
550 | 557 |
551 main_ccthread_ = cc::ThreadImpl::CreateForCurrentThread(); | 558 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_ = |
| 559 base::MessageLoopProxy::current(); |
552 | 560 |
553 delegating_renderer_ = delegating_renderer; | 561 delegating_renderer_ = delegating_renderer; |
554 | 562 |
555 // Spend less time waiting for BeginFrame because the output is | 563 // Spend less time waiting for BeginFrame because the output is |
556 // mocked out. | 564 // mocked out. |
557 settings_.refresh_rate = 200.0; | 565 settings_.refresh_rate = 200.0; |
558 if (impl_side_painting) { | 566 if (impl_side_painting) { |
559 DCHECK(threaded) << | 567 DCHECK(threaded) << |
560 "Don't run single thread + impl side painting, it doesn't exist."; | 568 "Don't run single thread + impl side painting, it doesn't exist."; |
561 settings_.impl_side_painting = true; | 569 settings_.impl_side_painting = true; |
562 } | 570 } |
563 InitializeSettings(&settings_); | 571 InitializeSettings(&settings_); |
564 | 572 |
565 main_ccthread_->PostTask( | 573 main_task_runner_->PostTask( |
| 574 FROM_HERE, |
566 base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this))); | 575 base::Bind(&LayerTreeTest::DoBeginTest, base::Unretained(this))); |
567 | 576 |
568 if (timeout_seconds_) { | 577 if (timeout_seconds_) { |
569 timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this))); | 578 timeout_.Reset(base::Bind(&LayerTreeTest::Timeout, base::Unretained(this))); |
570 main_ccthread_->PostDelayedTask( | 579 main_task_runner_->PostDelayedTask( |
| 580 FROM_HERE, |
571 timeout_.callback(), | 581 timeout_.callback(), |
572 base::TimeDelta::FromSeconds(timeout_seconds_)); | 582 base::TimeDelta::FromSeconds(timeout_seconds_)); |
573 } | 583 } |
574 | 584 |
575 base::MessageLoop::current()->Run(); | 585 base::MessageLoop::current()->Run(); |
576 if (layer_tree_host_ && layer_tree_host_->root_layer()) | 586 if (layer_tree_host_ && layer_tree_host_->root_layer()) |
577 layer_tree_host_->root_layer()->SetLayerTreeHost(NULL); | 587 layer_tree_host_->root_layer()->SetLayerTreeHost(NULL); |
578 layer_tree_host_.reset(); | 588 layer_tree_host_.reset(); |
579 | 589 |
580 timeout_.Cancel(); | 590 timeout_.Cancel(); |
(...skipping 30 matching lines...) Expand all Loading... |
611 | 621 |
612 scoped_refptr<cc::ContextProvider> LayerTreeTest:: | 622 scoped_refptr<cc::ContextProvider> LayerTreeTest:: |
613 OffscreenContextProviderForCompositorThread() { | 623 OffscreenContextProviderForCompositorThread() { |
614 if (!compositor_thread_contexts_.get() || | 624 if (!compositor_thread_contexts_.get() || |
615 compositor_thread_contexts_->DestroyedOnMainThread()) | 625 compositor_thread_contexts_->DestroyedOnMainThread()) |
616 compositor_thread_contexts_ = FakeContextProvider::Create(); | 626 compositor_thread_contexts_ = FakeContextProvider::Create(); |
617 return compositor_thread_contexts_; | 627 return compositor_thread_contexts_; |
618 } | 628 } |
619 | 629 |
620 } // namespace cc | 630 } // namespace cc |
OLD | NEW |