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/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 2911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2922 class OnDrawCompositorFrameSink : public TestCompositorFrameSink { | 2922 class OnDrawCompositorFrameSink : public TestCompositorFrameSink { |
2923 public: | 2923 public: |
2924 explicit OnDrawCompositorFrameSink( | 2924 explicit OnDrawCompositorFrameSink( |
2925 scoped_refptr<ContextProvider> compositor_context_provider, | 2925 scoped_refptr<ContextProvider> compositor_context_provider, |
2926 scoped_refptr<ContextProvider> worker_context_provider, | 2926 scoped_refptr<ContextProvider> worker_context_provider, |
2927 SharedBitmapManager* shared_bitmap_manager, | 2927 SharedBitmapManager* shared_bitmap_manager, |
2928 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 2928 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
2929 const RendererSettings& renderer_settings, | 2929 const RendererSettings& renderer_settings, |
2930 base::SingleThreadTaskRunner* task_runner, | 2930 base::SingleThreadTaskRunner* task_runner, |
2931 bool synchronous_composite, | 2931 bool synchronous_composite, |
| 2932 bool force_disable_reclaim_resources, |
2932 base::Closure invalidate_callback) | 2933 base::Closure invalidate_callback) |
2933 : TestCompositorFrameSink(std::move(compositor_context_provider), | 2934 : TestCompositorFrameSink(std::move(compositor_context_provider), |
2934 std::move(worker_context_provider), | 2935 std::move(worker_context_provider), |
2935 shared_bitmap_manager, | 2936 shared_bitmap_manager, |
2936 gpu_memory_buffer_manager, | 2937 gpu_memory_buffer_manager, |
2937 renderer_settings, | 2938 renderer_settings, |
2938 task_runner, | 2939 task_runner, |
2939 synchronous_composite), | 2940 synchronous_composite, |
| 2941 force_disable_reclaim_resources), |
2940 invalidate_callback_(std::move(invalidate_callback)) {} | 2942 invalidate_callback_(std::move(invalidate_callback)) {} |
2941 | 2943 |
2942 // TestCompositorFrameSink overrides. | 2944 // TestCompositorFrameSink overrides. |
2943 void Invalidate() override { invalidate_callback_.Run(); } | 2945 void Invalidate() override { invalidate_callback_.Run(); } |
2944 | 2946 |
2945 void OnDraw(bool resourceless_software_draw) { | 2947 void OnDraw(bool resourceless_software_draw) { |
2946 gfx::Transform identity; | 2948 gfx::Transform identity; |
2947 gfx::Rect empty_rect; | 2949 gfx::Rect empty_rect; |
2948 client_->OnDraw(identity, empty_rect, resourceless_software_draw); | 2950 client_->OnDraw(identity, empty_rect, resourceless_software_draw); |
2949 } | 2951 } |
(...skipping 15 matching lines...) Expand all Loading... |
2965 scoped_refptr<ContextProvider> worker_context_provider) override { | 2967 scoped_refptr<ContextProvider> worker_context_provider) override { |
2966 auto on_draw_callback = base::Bind( | 2968 auto on_draw_callback = base::Bind( |
2967 &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor:: | 2969 &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor:: |
2968 CallOnDraw, | 2970 CallOnDraw, |
2969 base::Unretained(this)); | 2971 base::Unretained(this)); |
2970 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( | 2972 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( |
2971 compositor_context_provider, std::move(worker_context_provider), | 2973 compositor_context_provider, std::move(worker_context_provider), |
2972 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 2974 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
2973 layer_tree_host()->GetSettings().renderer_settings, | 2975 layer_tree_host()->GetSettings().renderer_settings, |
2974 ImplThreadTaskRunner(), false /* synchronous_composite */, | 2976 ImplThreadTaskRunner(), false /* synchronous_composite */, |
| 2977 false /* force_disable_reclaim_resources */, |
2975 std::move(on_draw_callback)); | 2978 std::move(on_draw_callback)); |
2976 compositor_frame_sink_ = frame_sink.get(); | 2979 compositor_frame_sink_ = frame_sink.get(); |
2977 return std::move(frame_sink); | 2980 return std::move(frame_sink); |
2978 } | 2981 } |
2979 | 2982 |
2980 void CallOnDraw() { | 2983 void CallOnDraw() { |
2981 if (!TestEnded()) { | 2984 if (!TestEnded()) { |
2982 // Synchronous compositor does not draw unless told to do so by the output | 2985 // Synchronous compositor does not draw unless told to do so by the output |
2983 // surface. But it needs to be done on a new stack frame. | 2986 // surface. But it needs to be done on a new stack frame. |
2984 bool resourceless_software_draw = false; | 2987 bool resourceless_software_draw = false; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3104 scoped_refptr<ContextProvider> compositor_context_provider, | 3107 scoped_refptr<ContextProvider> compositor_context_provider, |
3105 scoped_refptr<ContextProvider> worker_context_provider) override { | 3108 scoped_refptr<ContextProvider> worker_context_provider) override { |
3106 auto on_draw_callback = | 3109 auto on_draw_callback = |
3107 base::Bind(&LayerTreeHostTestResourcelessSoftwareDraw::CallOnDraw, | 3110 base::Bind(&LayerTreeHostTestResourcelessSoftwareDraw::CallOnDraw, |
3108 base::Unretained(this)); | 3111 base::Unretained(this)); |
3109 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( | 3112 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( |
3110 compositor_context_provider, std::move(worker_context_provider), | 3113 compositor_context_provider, std::move(worker_context_provider), |
3111 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 3114 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
3112 layer_tree_host()->GetSettings().renderer_settings, | 3115 layer_tree_host()->GetSettings().renderer_settings, |
3113 ImplThreadTaskRunner(), false /* synchronous_composite */, | 3116 ImplThreadTaskRunner(), false /* synchronous_composite */, |
| 3117 false /* force_disable_reclaim_resources */, |
3114 std::move(on_draw_callback)); | 3118 std::move(on_draw_callback)); |
3115 compositor_frame_sink_ = frame_sink.get(); | 3119 compositor_frame_sink_ = frame_sink.get(); |
3116 return std::move(frame_sink); | 3120 return std::move(frame_sink); |
3117 } | 3121 } |
3118 | 3122 |
3119 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 3123 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
3120 | 3124 |
3121 void CallOnDraw() { | 3125 void CallOnDraw() { |
3122 if (!TestEnded()) { | 3126 if (!TestEnded()) { |
3123 // Synchronous compositor does not draw unless told to do so by the output | 3127 // Synchronous compositor does not draw unless told to do so by the output |
(...skipping 2498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5622 settings->single_thread_proxy_scheduler = false; | 5626 settings->single_thread_proxy_scheduler = false; |
5623 settings->use_zero_copy = true; | 5627 settings->use_zero_copy = true; |
5624 } | 5628 } |
5625 | 5629 |
5626 std::unique_ptr<TestCompositorFrameSink> CreateCompositorFrameSink( | 5630 std::unique_ptr<TestCompositorFrameSink> CreateCompositorFrameSink( |
5627 scoped_refptr<ContextProvider> compositor_context_provider, | 5631 scoped_refptr<ContextProvider> compositor_context_provider, |
5628 scoped_refptr<ContextProvider> worker_context_provider) override { | 5632 scoped_refptr<ContextProvider> worker_context_provider) override { |
5629 bool synchronous_composite = | 5633 bool synchronous_composite = |
5630 !HasImplThread() && | 5634 !HasImplThread() && |
5631 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler; | 5635 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler; |
| 5636 // Relaiming resources is parameterized for this test. |
| 5637 bool force_disable_reclaim_resources = !reclaim_resources_; |
5632 return base::MakeUnique<TestCompositorFrameSink>( | 5638 return base::MakeUnique<TestCompositorFrameSink>( |
5633 compositor_context_provider, std::move(worker_context_provider), | 5639 compositor_context_provider, std::move(worker_context_provider), |
5634 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 5640 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
5635 layer_tree_host()->GetSettings().renderer_settings, | 5641 layer_tree_host()->GetSettings().renderer_settings, |
5636 ImplThreadTaskRunner(), synchronous_composite); | 5642 ImplThreadTaskRunner(), synchronous_composite, |
| 5643 force_disable_reclaim_resources); |
5637 } | 5644 } |
5638 | 5645 |
5639 void BeginTest() override { | 5646 void BeginTest() override { |
5640 // Successful composite. | 5647 // Successful composite. |
5641 std::unique_ptr<SwapPromise> swap_promise0( | 5648 std::unique_ptr<SwapPromise> swap_promise0( |
5642 new TestSwapPromise(&swap_promise_result_[0])); | 5649 new TestSwapPromise(&swap_promise_result_[0])); |
5643 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( | 5650 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
5644 std::move(swap_promise0)); | 5651 std::move(swap_promise0)); |
5645 layer_tree_host()->Composite(base::TimeTicks::Now()); | 5652 layer_tree_host()->Composite(base::TimeTicks::Now()); |
5646 | 5653 |
5647 // Fail to swap (no damage). | 5654 // Fail to swap (no damage) if not reclaiming resources from the Display. |
5648 std::unique_ptr<SwapPromise> swap_promise1( | 5655 std::unique_ptr<SwapPromise> swap_promise1( |
5649 new TestSwapPromise(&swap_promise_result_[1])); | 5656 new TestSwapPromise(&swap_promise_result_[1])); |
5650 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( | 5657 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
5651 std::move(swap_promise1)); | 5658 std::move(swap_promise1)); |
5652 layer_tree_host()->SetNeedsCommit(); | 5659 layer_tree_host()->SetNeedsCommit(); |
5653 layer_tree_host()->Composite(base::TimeTicks::Now()); | 5660 layer_tree_host()->Composite(base::TimeTicks::Now()); |
5654 | 5661 |
5655 // Fail to draw (not visible). | 5662 // Fail to draw (not visible). |
5656 std::unique_ptr<SwapPromise> swap_promise2( | 5663 std::unique_ptr<SwapPromise> swap_promise2( |
5657 new TestSwapPromise(&swap_promise_result_[2])); | 5664 new TestSwapPromise(&swap_promise_result_[2])); |
(...skipping 15 matching lines...) Expand all Loading... |
5673 EXPECT_EQ(3, commit_count_); | 5680 EXPECT_EQ(3, commit_count_); |
5674 | 5681 |
5675 // Initial swap promise should have succeded. | 5682 // Initial swap promise should have succeded. |
5676 { | 5683 { |
5677 base::AutoLock lock(swap_promise_result_[0].lock); | 5684 base::AutoLock lock(swap_promise_result_[0].lock); |
5678 EXPECT_TRUE(swap_promise_result_[0].did_swap_called); | 5685 EXPECT_TRUE(swap_promise_result_[0].did_swap_called); |
5679 EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); | 5686 EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); |
5680 EXPECT_TRUE(swap_promise_result_[0].dtor_called); | 5687 EXPECT_TRUE(swap_promise_result_[0].dtor_called); |
5681 } | 5688 } |
5682 | 5689 |
5683 // Second swap promise fails to swap. | 5690 // Second swap promise fails to swap if not reclaiming resources from the |
| 5691 // Display. |
5684 { | 5692 { |
5685 base::AutoLock lock(swap_promise_result_[1].lock); | 5693 base::AutoLock lock(swap_promise_result_[1].lock); |
5686 EXPECT_TRUE(swap_promise_result_[1].did_activate_called); | 5694 EXPECT_TRUE(swap_promise_result_[1].did_activate_called); |
5687 EXPECT_FALSE(swap_promise_result_[1].did_swap_called); | 5695 if (!reclaim_resources_) { |
5688 EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); | 5696 EXPECT_FALSE(swap_promise_result_[1].did_swap_called); |
5689 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); | 5697 EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); |
| 5698 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); |
| 5699 } else { |
| 5700 EXPECT_TRUE(swap_promise_result_[1].did_swap_called); |
| 5701 EXPECT_FALSE(swap_promise_result_[1].did_not_swap_called); |
| 5702 } |
5690 EXPECT_TRUE(swap_promise_result_[1].dtor_called); | 5703 EXPECT_TRUE(swap_promise_result_[1].dtor_called); |
5691 } | 5704 } |
5692 | 5705 |
5693 // Third swap promises also fails to swap (and draw). | 5706 // Third swap promises also fails to swap (and draw). |
5694 { | 5707 { |
5695 base::AutoLock lock(swap_promise_result_[2].lock); | 5708 base::AutoLock lock(swap_promise_result_[2].lock); |
5696 EXPECT_TRUE(swap_promise_result_[2].did_activate_called); | 5709 EXPECT_TRUE(swap_promise_result_[2].did_activate_called); |
5697 EXPECT_FALSE(swap_promise_result_[2].did_swap_called); | 5710 EXPECT_FALSE(swap_promise_result_[2].did_swap_called); |
5698 EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); | 5711 EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); |
5699 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); | 5712 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); |
5700 EXPECT_TRUE(swap_promise_result_[2].dtor_called); | 5713 EXPECT_TRUE(swap_promise_result_[2].dtor_called); |
5701 } | 5714 } |
5702 } | 5715 } |
5703 | 5716 |
| 5717 bool reclaim_resources_; |
5704 int commit_count_ = 0; | 5718 int commit_count_ = 0; |
5705 TestSwapPromiseResult swap_promise_result_[3]; | 5719 TestSwapPromiseResult swap_promise_result_[3]; |
5706 }; | 5720 }; |
5707 | 5721 |
5708 // Synchronous composite is a single-threaded only feature. | 5722 TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise, NoReclaim) { |
5709 SINGLE_THREAD_TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise); | 5723 reclaim_resources_ = false; |
| 5724 RunTest(CompositorMode::SINGLE_THREADED); |
| 5725 } |
| 5726 |
| 5727 TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise, Reclaim) { |
| 5728 reclaim_resources_ = true; |
| 5729 RunTest(CompositorMode::SINGLE_THREADED); |
| 5730 } |
5710 | 5731 |
5711 // Make sure page scale and top control deltas are applied to the client even | 5732 // Make sure page scale and top control deltas are applied to the client even |
5712 // when the LayerTreeHost doesn't have a root layer. | 5733 // when the LayerTreeHost doesn't have a root layer. |
5713 class LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer | 5734 class LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer |
5714 : public LayerTreeHostTest { | 5735 : public LayerTreeHostTest { |
5715 public: | 5736 public: |
5716 LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() | 5737 LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() |
5717 : deltas_sent_to_client_(false) {} | 5738 : deltas_sent_to_client_(false) {} |
5718 | 5739 |
5719 void BeginTest() override { | 5740 void BeginTest() override { |
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6977 EndTest(); | 6998 EndTest(); |
6978 } | 6999 } |
6979 | 7000 |
6980 void AfterTest() override {} | 7001 void AfterTest() override {} |
6981 }; | 7002 }; |
6982 | 7003 |
6983 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSubmitFrameResources); | 7004 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSubmitFrameResources); |
6984 | 7005 |
6985 } // namespace | 7006 } // namespace |
6986 } // namespace cc | 7007 } // namespace cc |
OLD | NEW |