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 3025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3036 class OnDrawCompositorFrameSink : public TestCompositorFrameSink { | 3036 class OnDrawCompositorFrameSink : public TestCompositorFrameSink { |
3037 public: | 3037 public: |
3038 explicit OnDrawCompositorFrameSink( | 3038 explicit OnDrawCompositorFrameSink( |
3039 scoped_refptr<ContextProvider> compositor_context_provider, | 3039 scoped_refptr<ContextProvider> compositor_context_provider, |
3040 scoped_refptr<ContextProvider> worker_context_provider, | 3040 scoped_refptr<ContextProvider> worker_context_provider, |
3041 SharedBitmapManager* shared_bitmap_manager, | 3041 SharedBitmapManager* shared_bitmap_manager, |
3042 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 3042 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
3043 const RendererSettings& renderer_settings, | 3043 const RendererSettings& renderer_settings, |
3044 base::SingleThreadTaskRunner* task_runner, | 3044 base::SingleThreadTaskRunner* task_runner, |
3045 bool synchronous_composite, | 3045 bool synchronous_composite, |
3046 bool force_disable_reclaim_resources, | |
3047 base::Closure invalidate_callback) | 3046 base::Closure invalidate_callback) |
3048 : TestCompositorFrameSink(std::move(compositor_context_provider), | 3047 : TestCompositorFrameSink(std::move(compositor_context_provider), |
3049 std::move(worker_context_provider), | 3048 std::move(worker_context_provider), |
3050 shared_bitmap_manager, | 3049 shared_bitmap_manager, |
3051 gpu_memory_buffer_manager, | 3050 gpu_memory_buffer_manager, |
3052 renderer_settings, | 3051 renderer_settings, |
3053 task_runner, | 3052 task_runner, |
3054 synchronous_composite, | 3053 synchronous_composite), |
3055 force_disable_reclaim_resources), | |
3056 invalidate_callback_(std::move(invalidate_callback)) {} | 3054 invalidate_callback_(std::move(invalidate_callback)) {} |
3057 | 3055 |
3058 // TestCompositorFrameSink overrides. | 3056 // TestCompositorFrameSink overrides. |
3059 void Invalidate() override { invalidate_callback_.Run(); } | 3057 void Invalidate() override { invalidate_callback_.Run(); } |
3060 | 3058 |
3061 void OnDraw(bool resourceless_software_draw) { | 3059 void OnDraw(bool resourceless_software_draw) { |
3062 gfx::Transform identity; | 3060 gfx::Transform identity; |
3063 gfx::Rect empty_rect; | 3061 gfx::Rect empty_rect; |
3064 client_->OnDraw(identity, empty_rect, resourceless_software_draw); | 3062 client_->OnDraw(identity, empty_rect, resourceless_software_draw); |
3065 } | 3063 } |
(...skipping 15 matching lines...) Expand all Loading... |
3081 scoped_refptr<ContextProvider> worker_context_provider) override { | 3079 scoped_refptr<ContextProvider> worker_context_provider) override { |
3082 auto on_draw_callback = base::Bind( | 3080 auto on_draw_callback = base::Bind( |
3083 &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor:: | 3081 &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor:: |
3084 CallOnDraw, | 3082 CallOnDraw, |
3085 base::Unretained(this)); | 3083 base::Unretained(this)); |
3086 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( | 3084 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( |
3087 compositor_context_provider, std::move(worker_context_provider), | 3085 compositor_context_provider, std::move(worker_context_provider), |
3088 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 3086 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
3089 layer_tree_host()->GetSettings().renderer_settings, | 3087 layer_tree_host()->GetSettings().renderer_settings, |
3090 ImplThreadTaskRunner(), false /* synchronous_composite */, | 3088 ImplThreadTaskRunner(), false /* synchronous_composite */, |
3091 false /* force_disable_reclaim_resources */, | |
3092 std::move(on_draw_callback)); | 3089 std::move(on_draw_callback)); |
3093 compositor_frame_sink_ = frame_sink.get(); | 3090 compositor_frame_sink_ = frame_sink.get(); |
3094 return std::move(frame_sink); | 3091 return std::move(frame_sink); |
3095 } | 3092 } |
3096 | 3093 |
3097 void CallOnDraw() { | 3094 void CallOnDraw() { |
3098 if (!TestEnded()) { | 3095 if (!TestEnded()) { |
3099 // Synchronous compositor does not draw unless told to do so by the output | 3096 // Synchronous compositor does not draw unless told to do so by the output |
3100 // surface. But it needs to be done on a new stack frame. | 3097 // surface. But it needs to be done on a new stack frame. |
3101 bool resourceless_software_draw = false; | 3098 bool resourceless_software_draw = false; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3221 scoped_refptr<ContextProvider> compositor_context_provider, | 3218 scoped_refptr<ContextProvider> compositor_context_provider, |
3222 scoped_refptr<ContextProvider> worker_context_provider) override { | 3219 scoped_refptr<ContextProvider> worker_context_provider) override { |
3223 auto on_draw_callback = | 3220 auto on_draw_callback = |
3224 base::Bind(&LayerTreeHostTestResourcelessSoftwareDraw::CallOnDraw, | 3221 base::Bind(&LayerTreeHostTestResourcelessSoftwareDraw::CallOnDraw, |
3225 base::Unretained(this)); | 3222 base::Unretained(this)); |
3226 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( | 3223 auto frame_sink = base::MakeUnique<OnDrawCompositorFrameSink>( |
3227 compositor_context_provider, std::move(worker_context_provider), | 3224 compositor_context_provider, std::move(worker_context_provider), |
3228 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 3225 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
3229 layer_tree_host()->GetSettings().renderer_settings, | 3226 layer_tree_host()->GetSettings().renderer_settings, |
3230 ImplThreadTaskRunner(), false /* synchronous_composite */, | 3227 ImplThreadTaskRunner(), false /* synchronous_composite */, |
3231 false /* force_disable_reclaim_resources */, | |
3232 std::move(on_draw_callback)); | 3228 std::move(on_draw_callback)); |
3233 compositor_frame_sink_ = frame_sink.get(); | 3229 compositor_frame_sink_ = frame_sink.get(); |
3234 return std::move(frame_sink); | 3230 return std::move(frame_sink); |
3235 } | 3231 } |
3236 | 3232 |
3237 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 3233 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
3238 | 3234 |
3239 void CallOnDraw() { | 3235 void CallOnDraw() { |
3240 if (!TestEnded()) { | 3236 if (!TestEnded()) { |
3241 // Synchronous compositor does not draw unless told to do so by the output | 3237 // Synchronous compositor does not draw unless told to do so by the output |
(...skipping 2574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5816 settings->single_thread_proxy_scheduler = false; | 5812 settings->single_thread_proxy_scheduler = false; |
5817 settings->use_zero_copy = true; | 5813 settings->use_zero_copy = true; |
5818 } | 5814 } |
5819 | 5815 |
5820 std::unique_ptr<TestCompositorFrameSink> CreateCompositorFrameSink( | 5816 std::unique_ptr<TestCompositorFrameSink> CreateCompositorFrameSink( |
5821 scoped_refptr<ContextProvider> compositor_context_provider, | 5817 scoped_refptr<ContextProvider> compositor_context_provider, |
5822 scoped_refptr<ContextProvider> worker_context_provider) override { | 5818 scoped_refptr<ContextProvider> worker_context_provider) override { |
5823 bool synchronous_composite = | 5819 bool synchronous_composite = |
5824 !HasImplThread() && | 5820 !HasImplThread() && |
5825 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler; | 5821 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler; |
5826 // Relaiming resources is parameterized for this test. | |
5827 bool force_disable_reclaim_resources = !reclaim_resources_; | |
5828 return base::MakeUnique<TestCompositorFrameSink>( | 5822 return base::MakeUnique<TestCompositorFrameSink>( |
5829 compositor_context_provider, std::move(worker_context_provider), | 5823 compositor_context_provider, std::move(worker_context_provider), |
5830 shared_bitmap_manager(), gpu_memory_buffer_manager(), | 5824 shared_bitmap_manager(), gpu_memory_buffer_manager(), |
5831 layer_tree_host()->GetSettings().renderer_settings, | 5825 layer_tree_host()->GetSettings().renderer_settings, |
5832 ImplThreadTaskRunner(), synchronous_composite, | 5826 ImplThreadTaskRunner(), synchronous_composite); |
5833 force_disable_reclaim_resources); | |
5834 } | 5827 } |
5835 | 5828 |
5836 void BeginTest() override { | 5829 void BeginTest() override { |
5837 // Successful composite. | 5830 // Successful composite. |
5838 std::unique_ptr<SwapPromise> swap_promise0( | 5831 std::unique_ptr<SwapPromise> swap_promise0( |
5839 new TestSwapPromise(&swap_promise_result_[0])); | 5832 new TestSwapPromise(&swap_promise_result_[0])); |
5840 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( | 5833 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
5841 std::move(swap_promise0)); | 5834 std::move(swap_promise0)); |
5842 layer_tree_host()->Composite(base::TimeTicks::Now()); | 5835 layer_tree_host()->Composite(base::TimeTicks::Now()); |
5843 | 5836 |
5844 // Fail to swap (no damage) if not reclaiming resources from the Display. | 5837 // Fail to swap (no damage). |
5845 std::unique_ptr<SwapPromise> swap_promise1( | 5838 std::unique_ptr<SwapPromise> swap_promise1( |
5846 new TestSwapPromise(&swap_promise_result_[1])); | 5839 new TestSwapPromise(&swap_promise_result_[1])); |
5847 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( | 5840 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
5848 std::move(swap_promise1)); | 5841 std::move(swap_promise1)); |
5849 layer_tree_host()->SetNeedsCommit(); | 5842 layer_tree_host()->SetNeedsCommit(); |
5850 layer_tree_host()->Composite(base::TimeTicks::Now()); | 5843 layer_tree_host()->Composite(base::TimeTicks::Now()); |
5851 | 5844 |
5852 // Fail to draw (not visible). | 5845 // Fail to draw (not visible). |
5853 std::unique_ptr<SwapPromise> swap_promise2( | 5846 std::unique_ptr<SwapPromise> swap_promise2( |
5854 new TestSwapPromise(&swap_promise_result_[2])); | 5847 new TestSwapPromise(&swap_promise_result_[2])); |
(...skipping 15 matching lines...) Expand all Loading... |
5870 EXPECT_EQ(3, commit_count_); | 5863 EXPECT_EQ(3, commit_count_); |
5871 | 5864 |
5872 // Initial swap promise should have succeded. | 5865 // Initial swap promise should have succeded. |
5873 { | 5866 { |
5874 base::AutoLock lock(swap_promise_result_[0].lock); | 5867 base::AutoLock lock(swap_promise_result_[0].lock); |
5875 EXPECT_TRUE(swap_promise_result_[0].did_swap_called); | 5868 EXPECT_TRUE(swap_promise_result_[0].did_swap_called); |
5876 EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); | 5869 EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called); |
5877 EXPECT_TRUE(swap_promise_result_[0].dtor_called); | 5870 EXPECT_TRUE(swap_promise_result_[0].dtor_called); |
5878 } | 5871 } |
5879 | 5872 |
5880 // Second swap promise fails to swap if not reclaiming resources from the | 5873 // Second swap promise fails to swap. |
5881 // Display. | |
5882 { | 5874 { |
5883 base::AutoLock lock(swap_promise_result_[1].lock); | 5875 base::AutoLock lock(swap_promise_result_[1].lock); |
5884 EXPECT_TRUE(swap_promise_result_[1].did_activate_called); | 5876 EXPECT_TRUE(swap_promise_result_[1].did_activate_called); |
5885 if (!reclaim_resources_) { | 5877 EXPECT_FALSE(swap_promise_result_[1].did_swap_called); |
5886 EXPECT_FALSE(swap_promise_result_[1].did_swap_called); | 5878 EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); |
5887 EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); | 5879 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); |
5888 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); | |
5889 } else { | |
5890 EXPECT_TRUE(swap_promise_result_[1].did_swap_called); | |
5891 EXPECT_FALSE(swap_promise_result_[1].did_not_swap_called); | |
5892 } | |
5893 EXPECT_TRUE(swap_promise_result_[1].dtor_called); | 5880 EXPECT_TRUE(swap_promise_result_[1].dtor_called); |
5894 } | 5881 } |
5895 | 5882 |
5896 // Third swap promises also fails to swap (and draw). | 5883 // Third swap promises also fails to swap (and draw). |
5897 { | 5884 { |
5898 base::AutoLock lock(swap_promise_result_[2].lock); | 5885 base::AutoLock lock(swap_promise_result_[2].lock); |
5899 EXPECT_TRUE(swap_promise_result_[2].did_activate_called); | 5886 EXPECT_TRUE(swap_promise_result_[2].did_activate_called); |
5900 EXPECT_FALSE(swap_promise_result_[2].did_swap_called); | 5887 EXPECT_FALSE(swap_promise_result_[2].did_swap_called); |
5901 EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); | 5888 EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); |
5902 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); | 5889 EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); |
5903 EXPECT_TRUE(swap_promise_result_[2].dtor_called); | 5890 EXPECT_TRUE(swap_promise_result_[2].dtor_called); |
5904 } | 5891 } |
5905 } | 5892 } |
5906 | 5893 |
5907 bool reclaim_resources_; | |
5908 int commit_count_ = 0; | 5894 int commit_count_ = 0; |
5909 TestSwapPromiseResult swap_promise_result_[3]; | 5895 TestSwapPromiseResult swap_promise_result_[3]; |
5910 }; | 5896 }; |
5911 | 5897 |
5912 TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise, NoReclaim) { | 5898 // Synchronous composite is a single-threaded only feature. |
5913 reclaim_resources_ = false; | 5899 SINGLE_THREAD_TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise); |
5914 RunTest(CompositorMode::SINGLE_THREADED); | |
5915 } | |
5916 | |
5917 TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise, Reclaim) { | |
5918 reclaim_resources_ = true; | |
5919 RunTest(CompositorMode::SINGLE_THREADED); | |
5920 } | |
5921 | 5900 |
5922 // Make sure page scale and top control deltas are applied to the client even | 5901 // Make sure page scale and top control deltas are applied to the client even |
5923 // when the LayerTreeHost doesn't have a root layer. | 5902 // when the LayerTreeHost doesn't have a root layer. |
5924 class LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer | 5903 class LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer |
5925 : public LayerTreeHostTest { | 5904 : public LayerTreeHostTest { |
5926 public: | 5905 public: |
5927 LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() | 5906 LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer() |
5928 : deltas_sent_to_client_(false) {} | 5907 : deltas_sent_to_client_(false) {} |
5929 | 5908 |
5930 void BeginTest() override { | 5909 void BeginTest() override { |
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7188 EndTest(); | 7167 EndTest(); |
7189 } | 7168 } |
7190 | 7169 |
7191 void AfterTest() override {} | 7170 void AfterTest() override {} |
7192 }; | 7171 }; |
7193 | 7172 |
7194 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSubmitFrameResources); | 7173 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSubmitFrameResources); |
7195 | 7174 |
7196 } // namespace | 7175 } // namespace |
7197 } // namespace cc | 7176 } // namespace cc |
OLD | NEW |