| 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 |