| 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 3067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3078 class OnDrawCompositorFrameSink : public TestCompositorFrameSink { | 3078 class OnDrawCompositorFrameSink : public TestCompositorFrameSink { |
| 3079 public: | 3079 public: |
| 3080 explicit OnDrawCompositorFrameSink( | 3080 explicit OnDrawCompositorFrameSink( |
| 3081 scoped_refptr<ContextProvider> compositor_context_provider, | 3081 scoped_refptr<ContextProvider> compositor_context_provider, |
| 3082 scoped_refptr<ContextProvider> worker_context_provider, | 3082 scoped_refptr<ContextProvider> worker_context_provider, |
| 3083 SharedBitmapManager* shared_bitmap_manager, | 3083 SharedBitmapManager* shared_bitmap_manager, |
| 3084 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 3084 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 3085 const RendererSettings& renderer_settings, | 3085 const RendererSettings& renderer_settings, |
| 3086 base::SingleThreadTaskRunner* task_runner, | 3086 base::SingleThreadTaskRunner* task_runner, |
| 3087 bool synchronous_composite, | 3087 bool synchronous_composite, |
| 3088 bool force_disable_reclaim_resources, | |
| 3089 base::Closure invalidate_callback) | 3088 base::Closure invalidate_callback) |
| 3090 : TestCompositorFrameSink(std::move(compositor_context_provider), | 3089 : TestCompositorFrameSink(std::move(compositor_context_provider), |
| 3091 std::move(worker_context_provider), | 3090 std::move(worker_context_provider), |
| 3092 shared_bitmap_manager, | 3091 shared_bitmap_manager, |
| 3093 gpu_memory_buffer_manager, | 3092 gpu_memory_buffer_manager, |
| 3094 renderer_settings, | 3093 renderer_settings, |
| 3095 task_runner, | 3094 task_runner, |
| 3096 synchronous_composite, | 3095 synchronous_composite), |
| 3097 force_disable_reclaim_resources), | |
| 3098 invalidate_callback_(std::move(invalidate_callback)) {} | 3096 invalidate_callback_(std::move(invalidate_callback)) {} |
| 3099 | 3097 |
| 3100 // TestCompositorFrameSink overrides. | 3098 // TestCompositorFrameSink overrides. |
| 3101 void Invalidate() override { invalidate_callback_.Run(); } | 3099 void Invalidate() override { invalidate_callback_.Run(); } |
| 3102 | 3100 |
| 3103 void OnDraw(bool resourceless_software_draw) { | 3101 void OnDraw(bool resourceless_software_draw) { |
| 3104 gfx::Transform identity; | 3102 gfx::Transform identity; |
| 3105 gfx::Rect empty_rect; | 3103 gfx::Rect empty_rect; |
| 3106 client_->OnDraw(identity, empty_rect, resourceless_software_draw); | 3104 client_->OnDraw(identity, empty_rect, resourceless_software_draw); |
| 3107 } | 3105 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3123 scoped_refptr<ContextProvider> worker_context_provider) override { | 3121 scoped_refptr<ContextProvider> worker_context_provider) override { |
| 3124 auto on_draw_callback = base::Bind( | 3122 auto on_draw_callback = base::Bind( |
| 3125 &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor:: | 3123 &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor:: |
| 3126 CallOnDraw, | 3124 CallOnDraw, |
| 3127 base::Unretained(this)); | 3125 base::Unretained(this)); |
| 3128 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( | 3126 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( |
| 3129 compositor_context_provider, std::move(worker_context_provider), | 3127 compositor_context_provider, std::move(worker_context_provider), |
| 3130 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 3128 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
| 3131 layer_tree_host()->GetSettings().renderer_settings, | 3129 layer_tree_host()->GetSettings().renderer_settings, |
| 3132 ImplThreadTaskRunner(), false /* synchronous_composite */, | 3130 ImplThreadTaskRunner(), false /* synchronous_composite */, |
| 3133 false /* force_disable_reclaim_resources */, | |
| 3134 std::move(on_draw_callback)); | 3131 std::move(on_draw_callback)); |
| 3135 compositor_frame_sink_ = frame_sink.get(); | 3132 compositor_frame_sink_ = frame_sink.get(); |
| 3136 return std::move(frame_sink); | 3133 return std::move(frame_sink); |
| 3137 } | 3134 } |
| 3138 | 3135 |
| 3139 void CallOnDraw() { | 3136 void CallOnDraw() { |
| 3140 if (!TestEnded()) { | 3137 if (!TestEnded()) { |
| 3141 // Synchronous compositor does not draw unless told to do so by the output | 3138 // Synchronous compositor does not draw unless told to do so by the output |
| 3142 // surface. But it needs to be done on a new stack frame. | 3139 // surface. But it needs to be done on a new stack frame. |
| 3143 bool resourceless_software_draw = false; | 3140 bool resourceless_software_draw = false; |
| (...skipping 2596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5740 settings->single_thread_proxy_scheduler = false; | 5737 settings->single_thread_proxy_scheduler = false; |
| 5741 settings->use_zero_copy = true; | 5738 settings->use_zero_copy = true; |
| 5742 } | 5739 } |
| 5743 | 5740 |
| 5744 std::unique_ptr<TestCompositorFrameSink> CreateCompositorFrameSink( | 5741 std::unique_ptr<TestCompositorFrameSink> CreateCompositorFrameSink( |
| 5745 scoped_refptr<ContextProvider> compositor_context_provider, | 5742 scoped_refptr<ContextProvider> compositor_context_provider, |
| 5746 scoped_refptr<ContextProvider> worker_context_provider) override { | 5743 scoped_refptr<ContextProvider> worker_context_provider) override { |
| 5747 bool synchronous_composite = | 5744 bool synchronous_composite = |
| 5748 !HasImplThread() && | 5745 !HasImplThread() && |
| 5749 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler; | 5746 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler; |
| 5750 // Relaiming resources is parameterized for this test. | |
| 5751 bool force_disable_reclaim_resources = !reclaim_resources_; | |
| 5752 return base::MakeUnique<TestCompositorFrameSink>( | 5747 return base::MakeUnique<TestCompositorFrameSink>( |
| 5753 compositor_context_provider, std::move(worker_context_provider), | 5748 compositor_context_provider, std::move(worker_context_provider), |
| 5754 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 5749 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
| 5755 layer_tree_host()->GetSettings().renderer_settings, | 5750 layer_tree_host()->GetSettings().renderer_settings, |
| 5756 ImplThreadTaskRunner(), synchronous_composite, | 5751 ImplThreadTaskRunner(), synchronous_composite); |
| 5757 force_disable_reclaim_resources); | |
| 5758 } | 5752 } |
| 5759 | 5753 |
| 5760 void BeginTest() override { | 5754 void BeginTest() override { |
| 5761 // Successful composite. | 5755 // Successful composite. |
| 5762 std::unique_ptr<SwapPromise> swap_promise0( | 5756 std::unique_ptr<SwapPromise> swap_promise0( |
| 5763 new TestSwapPromise(&swap_promise_result_[0])); | 5757 new TestSwapPromise(&swap_promise_result_[0])); |
| 5764 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( | 5758 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
| 5765 std::move(swap_promise0)); | 5759 std::move(swap_promise0)); |
| 5766 layer_tree_host()->Composite(base::TimeTicks::Now()); | 5760 layer_tree_host()->Composite(base::TimeTicks::Now()); |
| 5767 | 5761 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 5794 EXPECT_EQ(3, commit_count_); | 5788 EXPECT_EQ(3, commit_count_); |
| 5795 | 5789 |
| 5796 // Initial swap promise should have succeded. | 5790 // Initial swap promise should have succeded. |
| 5797 { | 5791 { |
| 5798 base::AutoLock lock(swap_promise_result_[0].lock); | 5792 base::AutoLock lock(swap_promise_result_[0].lock); |
| 5799 EXPECT_TRUE(swap_promise_result_[0].did_swap_called); | 5793 EXPECT_TRUE(swap_promise_result_[0].did_swap_called); |
| 5800 EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); | 5794 EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); |
| 5801 EXPECT_TRUE(swap_promise_result_[0].dtor_called); | 5795 EXPECT_TRUE(swap_promise_result_[0].dtor_called); |
| 5802 } | 5796 } |
| 5803 | 5797 |
| 5804 // Second swap promise fails to swap if not reclaiming resources from the | 5798 // Second swap promise fails to swap. |
| 5805 // Display. | |
| 5806 { | 5799 { |
| 5807 base::AutoLock lock(swap_promise_result_[1].lock); | 5800 base::AutoLock lock(swap_promise_result_[1].lock); |
| 5808 EXPECT_TRUE(swap_promise_result_[1].did_activate_called); | 5801 EXPECT_TRUE(swap_promise_result_[1].did_activate_called); |
| 5809 if (!reclaim_resources_) { | 5802 EXPECT_FALSE(swap_promise_result_[1].did_swap_called); |
| 5810 EXPECT_FALSE(swap_promise_result_[1].did_swap_called); | 5803 EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); |
| 5811 EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); | 5804 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); |
| 5812 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); | |
| 5813 } else { | |
| 5814 EXPECT_TRUE(swap_promise_result_[1].did_swap_called); | |
| 5815 EXPECT_FALSE(swap_promise_result_[1].did_not_swap_called); | |
| 5816 } | |
| 5817 EXPECT_TRUE(swap_promise_result_[1].dtor_called); | 5805 EXPECT_TRUE(swap_promise_result_[1].dtor_called); |
| 5818 } | 5806 } |
| 5819 | 5807 |
| 5820 // Third swap promises also fails to swap (and draw). | 5808 // Third swap promises also fails to swap (and draw). |
| 5821 { | 5809 { |
| 5822 base::AutoLock lock(swap_promise_result_[2].lock); | 5810 base::AutoLock lock(swap_promise_result_[2].lock); |
| 5823 EXPECT_TRUE(swap_promise_result_[2].did_activate_called); | 5811 EXPECT_TRUE(swap_promise_result_[2].did_activate_called); |
| 5824 EXPECT_FALSE(swap_promise_result_[2].did_swap_called); | 5812 EXPECT_FALSE(swap_promise_result_[2].did_swap_called); |
| 5825 EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); | 5813 EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); |
| 5826 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); | 5814 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); |
| 5827 EXPECT_TRUE(swap_promise_result_[2].dtor_called); | 5815 EXPECT_TRUE(swap_promise_result_[2].dtor_called); |
| 5828 } | 5816 } |
| 5829 } | 5817 } |
| 5830 | 5818 |
| 5831 bool reclaim_resources_; | |
| 5832 int commit_count_ = 0; | 5819 int commit_count_ = 0; |
| 5833 TestSwapPromiseResult swap_promise_result_[3]; | 5820 TestSwapPromiseResult swap_promise_result_[3]; |
| 5834 }; | 5821 }; |
| 5835 | 5822 |
| 5836 TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise, NoReclaim) { | 5823 // Synchronous composite is a single-threaded only feature. |
| 5837 reclaim_resources_ = false; | 5824 SINGLE_THREAD_TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise); |
| 5838 RunTest(CompositorMode::SINGLE_THREADED); | |
| 5839 } | |
| 5840 | |
| 5841 TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise, Reclaim) { | |
| 5842 reclaim_resources_ = true; | |
| 5843 RunTest(CompositorMode::SINGLE_THREADED); | |
| 5844 } | |
| 5845 | 5825 |
| 5846 // Make sure page scale and top control deltas are applied to the client even | 5826 // Make sure page scale and top control deltas are applied to the client even |
| 5847 // when the LayerTreeHost doesn't have a root layer. | 5827 // when the LayerTreeHost doesn't have a root layer. |
| 5848 class LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer | 5828 class LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer |
| 5849 : public LayerTreeHostTest { | 5829 : public LayerTreeHostTest { |
| 5850 public: | 5830 public: |
| 5851 LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() | 5831 LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() |
| 5852 : deltas_sent_to_client_(false) {} | 5832 : deltas_sent_to_client_(false) {} |
| 5853 | 5833 |
| 5854 void BeginTest() override { | 5834 void BeginTest() override { |
| (...skipping 1740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7595 void AfterTest() override {} | 7575 void AfterTest() override {} |
| 7596 | 7576 |
| 7597 private: | 7577 private: |
| 7598 bool received_ack_ = false; | 7578 bool received_ack_ = false; |
| 7599 }; | 7579 }; |
| 7600 | 7580 |
| 7601 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDiscardAckAfterRelease); | 7581 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDiscardAckAfterRelease); |
| 7602 | 7582 |
| 7603 } // namespace | 7583 } // namespace |
| 7604 } // namespace cc | 7584 } // namespace cc |
| OLD | NEW |