| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 for (const auto& layer : layers) { | 87 for (const auto& layer : layers) { |
| 88 FakePictureLayerImpl* fake_layer = | 88 FakePictureLayerImpl* fake_layer = |
| 89 static_cast<FakePictureLayerImpl*>(layer); | 89 static_cast<FakePictureLayerImpl*>(layer); |
| 90 required_for_activation_count_ += | 90 required_for_activation_count_ += |
| 91 fake_layer->CountTilesRequiredForActivation(); | 91 fake_layer->CountTilesRequiredForActivation(); |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 | 94 |
| 95 void NotifyReadyToActivateOnThread(LayerTreeHostImpl* impl) override { | 95 void NotifyReadyToActivateOnThread(LayerTreeHostImpl* impl) override { |
| 96 did_notify_ready_to_activate_ = true; | 96 did_notify_ready_to_activate_ = true; |
| 97 const std::vector<PictureLayerImpl*>& layers = impl->GetPictureLayers(); | 97 all_tiles_required_for_activation_are_ready_to_draw_ = |
| 98 all_tiles_required_for_activation_are_ready_to_draw_ = true; | 98 impl->tile_manager()->IsReadyToActivate(); |
| 99 for (const auto& layer : layers) { | |
| 100 if (!layer->AllTilesRequiredForActivationAreReadyToDraw()) | |
| 101 all_tiles_required_for_activation_are_ready_to_draw_ = false; | |
| 102 } | |
| 103 EndTest(); | 99 EndTest(); |
| 104 } | 100 } |
| 105 | 101 |
| 106 void AfterTest() override { | 102 void AfterTest() override { |
| 107 EXPECT_TRUE(did_notify_ready_to_activate_); | 103 EXPECT_TRUE(did_notify_ready_to_activate_); |
| 108 EXPECT_TRUE(all_tiles_required_for_activation_are_ready_to_draw_); | 104 EXPECT_TRUE(all_tiles_required_for_activation_are_ready_to_draw_); |
| 109 EXPECT_EQ(size_t(0), required_for_activation_count_); | 105 EXPECT_EQ(size_t(0), required_for_activation_count_); |
| 110 } | 106 } |
| 111 | 107 |
| 112 protected: | 108 protected: |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 LayerTreeHostTestReadyToDrawEmpty() | 148 LayerTreeHostTestReadyToDrawEmpty() |
| 153 : did_notify_ready_to_draw_(false), | 149 : did_notify_ready_to_draw_(false), |
| 154 all_tiles_required_for_draw_are_ready_to_draw_(false), | 150 all_tiles_required_for_draw_are_ready_to_draw_(false), |
| 155 required_for_draw_count_(0) {} | 151 required_for_draw_count_(0) {} |
| 156 | 152 |
| 157 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 153 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 158 | 154 |
| 159 void NotifyReadyToDrawOnThread(LayerTreeHostImpl* impl) override { | 155 void NotifyReadyToDrawOnThread(LayerTreeHostImpl* impl) override { |
| 160 did_notify_ready_to_draw_ = true; | 156 did_notify_ready_to_draw_ = true; |
| 161 const std::vector<PictureLayerImpl*>& layers = impl->GetPictureLayers(); | 157 const std::vector<PictureLayerImpl*>& layers = impl->GetPictureLayers(); |
| 162 all_tiles_required_for_draw_are_ready_to_draw_ = true; | 158 all_tiles_required_for_draw_are_ready_to_draw_ = |
| 159 impl->tile_manager()->IsReadyToDraw(); |
| 163 for (const auto& layer : layers) { | 160 for (const auto& layer : layers) { |
| 164 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) | |
| 165 all_tiles_required_for_draw_are_ready_to_draw_ = false; | |
| 166 FakePictureLayerImpl* fake_layer = | 161 FakePictureLayerImpl* fake_layer = |
| 167 static_cast<FakePictureLayerImpl*>(layer); | 162 static_cast<FakePictureLayerImpl*>(layer); |
| 168 required_for_draw_count_ += fake_layer->CountTilesRequiredForDraw(); | 163 required_for_draw_count_ += fake_layer->CountTilesRequiredForDraw(); |
| 169 } | 164 } |
| 170 | 165 |
| 171 EndTest(); | 166 EndTest(); |
| 172 } | 167 } |
| 173 | 168 |
| 174 void AfterTest() override { | 169 void AfterTest() override { |
| 175 EXPECT_TRUE(did_notify_ready_to_draw_); | 170 EXPECT_TRUE(did_notify_ready_to_draw_); |
| (...skipping 1849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2025 scoped_refptr<Layer> layer_; | 2020 scoped_refptr<Layer> layer_; |
| 2026 int num_commit_complete_; | 2021 int num_commit_complete_; |
| 2027 int num_draw_layers_; | 2022 int num_draw_layers_; |
| 2028 }; | 2023 }; |
| 2029 | 2024 |
| 2030 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); | 2025 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); |
| 2031 | 2026 |
| 2032 class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { | 2027 class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { |
| 2033 public: | 2028 public: |
| 2034 LayerTreeHostTestDeferCommits() | 2029 LayerTreeHostTestDeferCommits() |
| 2035 : num_commits_deferred_(0), num_complete_commits_(0) {} | 2030 : num_will_begin_impl_frame_(0), |
| 2031 num_send_begin_main_frame_(0) {} |
| 2036 | 2032 |
| 2037 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 2033 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 2038 | 2034 |
| 2039 void DidDeferCommit() override { | 2035 void WillBeginImplFrame(const BeginFrameArgs& args) override { |
| 2040 num_commits_deferred_++; | 2036 num_will_begin_impl_frame_++; |
| 2041 layer_tree_host()->SetDeferCommits(false); | 2037 switch (num_will_begin_impl_frame_) { |
| 2038 case 1: |
| 2039 break; |
| 2040 case 2: |
| 2041 PostSetNeedsCommitToMainThread(); |
| 2042 break; |
| 2043 case 3: |
| 2044 PostSetDeferCommitsToMainThread(false); |
| 2045 break; |
| 2046 default: |
| 2047 // Sometimes |num_will_begin_impl_frame_| will be greater than 3 if the |
| 2048 // main thread is slow to respond. |
| 2049 break; |
| 2050 } |
| 2042 } | 2051 } |
| 2043 | 2052 |
| 2044 void DidCommit() override { | 2053 void ScheduledActionSendBeginMainFrame() override { |
| 2045 num_complete_commits_++; | 2054 num_send_begin_main_frame_++; |
| 2046 switch (num_complete_commits_) { | 2055 switch (num_send_begin_main_frame_) { |
| 2047 case 1: | 2056 case 1: |
| 2048 EXPECT_EQ(0, num_commits_deferred_); | 2057 PostSetDeferCommitsToMainThread(true); |
| 2049 layer_tree_host()->SetDeferCommits(true); | |
| 2050 PostSetNeedsCommitToMainThread(); | |
| 2051 break; | 2058 break; |
| 2052 case 2: | 2059 case 2: |
| 2053 EndTest(); | 2060 EndTest(); |
| 2054 break; | 2061 break; |
| 2055 default: | 2062 default: |
| 2056 NOTREACHED(); | 2063 NOTREACHED(); |
| 2057 break; | 2064 break; |
| 2058 } | 2065 } |
| 2059 } | 2066 } |
| 2060 | 2067 |
| 2061 void AfterTest() override { | 2068 void AfterTest() override { |
| 2062 EXPECT_EQ(1, num_commits_deferred_); | 2069 EXPECT_GE(3, num_will_begin_impl_frame_); |
| 2063 EXPECT_EQ(2, num_complete_commits_); | 2070 EXPECT_EQ(2, num_send_begin_main_frame_); |
| 2064 } | 2071 } |
| 2065 | 2072 |
| 2066 private: | 2073 private: |
| 2067 int num_commits_deferred_; | 2074 int num_will_begin_impl_frame_; |
| 2068 int num_complete_commits_; | 2075 int num_send_begin_main_frame_; |
| 2069 }; | 2076 }; |
| 2070 | 2077 |
| 2071 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); | 2078 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); |
| 2072 | 2079 |
| 2073 class LayerTreeHostWithProxy : public LayerTreeHost { | 2080 class LayerTreeHostWithProxy : public LayerTreeHost { |
| 2074 public: | 2081 public: |
| 2075 LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, | 2082 LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, |
| 2076 const LayerTreeSettings& settings, | 2083 const LayerTreeSettings& settings, |
| 2077 scoped_ptr<FakeProxy> proxy) | 2084 scoped_ptr<FakeProxy> proxy) |
| 2078 : LayerTreeHost(client, NULL, NULL, settings) { | 2085 : LayerTreeHost(client, NULL, NULL, settings) { |
| (...skipping 2693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4772 | 4779 |
| 4773 void AfterTest() override {} | 4780 void AfterTest() override {} |
| 4774 | 4781 |
| 4775 private: | 4782 private: |
| 4776 scoped_refptr<Layer> layer_; | 4783 scoped_refptr<Layer> layer_; |
| 4777 TestSwapPromiseResult swap_promise_result_; | 4784 TestSwapPromiseResult swap_promise_result_; |
| 4778 }; | 4785 }; |
| 4779 | 4786 |
| 4780 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestKeepSwapPromise); | 4787 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestKeepSwapPromise); |
| 4781 | 4788 |
| 4782 class LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit | 4789 class LayerTreeHostTestBreakSwapPromiseForVisibility |
| 4783 : public LayerTreeHostTest { | 4790 : public LayerTreeHostTest { |
| 4784 protected: | 4791 protected: |
| 4785 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 4792 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 4786 | 4793 |
| 4787 void DidCommit() override { | 4794 void SetVisibleFalseAndQueueSwapPromise() { |
| 4788 layer_tree_host()->SetDeferCommits(true); | |
| 4789 layer_tree_host()->SetNeedsCommit(); | |
| 4790 } | |
| 4791 | |
| 4792 void DidDeferCommit() override { | |
| 4793 layer_tree_host()->SetVisible(false); | 4795 layer_tree_host()->SetVisible(false); |
| 4794 scoped_ptr<SwapPromise> swap_promise( | 4796 scoped_ptr<SwapPromise> swap_promise( |
| 4795 new TestSwapPromise(&swap_promise_result_)); | 4797 new TestSwapPromise(&swap_promise_result_)); |
| 4796 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 4798 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
| 4797 layer_tree_host()->SetDeferCommits(false); | 4799 } |
| 4800 |
| 4801 void ScheduledActionWillSendBeginMainFrame() override { |
| 4802 MainThreadTaskRunner()->PostTask( |
| 4803 FROM_HERE, |
| 4804 base::Bind(&LayerTreeHostTestBreakSwapPromiseForVisibility |
| 4805 ::SetVisibleFalseAndQueueSwapPromise, |
| 4806 base::Unretained(this))); |
| 4798 } | 4807 } |
| 4799 | 4808 |
| 4800 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, | 4809 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, |
| 4801 CommitEarlyOutReason reason) override { | 4810 CommitEarlyOutReason reason) override { |
| 4802 EndTest(); | 4811 EndTest(); |
| 4803 } | 4812 } |
| 4804 | 4813 |
| 4805 void AfterTest() override { | 4814 void AfterTest() override { |
| 4806 { | 4815 { |
| 4807 base::AutoLock lock(swap_promise_result_.lock); | 4816 base::AutoLock lock(swap_promise_result_.lock); |
| 4808 EXPECT_FALSE(swap_promise_result_.did_swap_called); | 4817 EXPECT_FALSE(swap_promise_result_.did_swap_called); |
| 4809 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); | 4818 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); |
| 4810 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); | 4819 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); |
| 4811 EXPECT_TRUE(swap_promise_result_.dtor_called); | 4820 EXPECT_TRUE(swap_promise_result_.dtor_called); |
| 4812 } | 4821 } |
| 4813 } | 4822 } |
| 4814 | 4823 |
| 4815 TestSwapPromiseResult swap_promise_result_; | 4824 TestSwapPromiseResult swap_promise_result_; |
| 4816 }; | 4825 }; |
| 4817 | 4826 |
| 4818 SINGLE_AND_MULTI_THREAD_TEST_F( | 4827 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestBreakSwapPromiseForVisibility); |
| 4819 LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit); | |
| 4820 | 4828 |
| 4821 class LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit | 4829 class LayerTreeHostTestBreakSwapPromiseForContext : public LayerTreeHostTest { |
| 4822 : public LayerTreeHostTest { | |
| 4823 protected: | 4830 protected: |
| 4831 LayerTreeHostTestBreakSwapPromiseForContext() |
| 4832 : output_surface_lost_triggered_(false) { |
| 4833 } |
| 4834 |
| 4824 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 4835 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 4825 | 4836 |
| 4826 void DidCommit() override { | 4837 void LoseOutputSurfaceAndQueueSwapPromise() { |
| 4827 if (TestEnded()) | |
| 4828 return; | |
| 4829 layer_tree_host()->SetDeferCommits(true); | |
| 4830 layer_tree_host()->SetNeedsCommit(); | |
| 4831 } | |
| 4832 | |
| 4833 void DidDeferCommit() override { | |
| 4834 layer_tree_host()->DidLoseOutputSurface(); | 4838 layer_tree_host()->DidLoseOutputSurface(); |
| 4835 scoped_ptr<SwapPromise> swap_promise( | 4839 scoped_ptr<SwapPromise> swap_promise( |
| 4836 new TestSwapPromise(&swap_promise_result_)); | 4840 new TestSwapPromise(&swap_promise_result_)); |
| 4837 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 4841 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
| 4838 layer_tree_host()->SetDeferCommits(false); | 4842 } |
| 4843 |
| 4844 void ScheduledActionWillSendBeginMainFrame() override { |
| 4845 if (output_surface_lost_triggered_) |
| 4846 return; |
| 4847 output_surface_lost_triggered_ = true; |
| 4848 |
| 4849 MainThreadTaskRunner()->PostTask( |
| 4850 FROM_HERE, |
| 4851 base::Bind(&LayerTreeHostTestBreakSwapPromiseForContext |
| 4852 ::LoseOutputSurfaceAndQueueSwapPromise, |
| 4853 base::Unretained(this))); |
| 4839 } | 4854 } |
| 4840 | 4855 |
| 4841 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, | 4856 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, |
| 4842 CommitEarlyOutReason reason) override { | 4857 CommitEarlyOutReason reason) override { |
| 4843 // This is needed so that the impl-thread state matches main-thread state. | 4858 // This is needed so that the impl-thread state matches main-thread state. |
| 4844 host_impl->DidLoseOutputSurface(); | 4859 host_impl->DidLoseOutputSurface(); |
| 4845 EndTest(); | 4860 EndTest(); |
| 4846 } | 4861 } |
| 4847 | 4862 |
| 4848 void AfterTest() override { | 4863 void AfterTest() override { |
| 4849 { | 4864 { |
| 4850 base::AutoLock lock(swap_promise_result_.lock); | 4865 base::AutoLock lock(swap_promise_result_.lock); |
| 4851 EXPECT_FALSE(swap_promise_result_.did_swap_called); | 4866 EXPECT_FALSE(swap_promise_result_.did_swap_called); |
| 4852 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); | 4867 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); |
| 4853 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); | 4868 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); |
| 4854 EXPECT_TRUE(swap_promise_result_.dtor_called); | 4869 EXPECT_TRUE(swap_promise_result_.dtor_called); |
| 4855 } | 4870 } |
| 4856 } | 4871 } |
| 4857 | 4872 |
| 4873 bool output_surface_lost_triggered_; |
| 4858 TestSwapPromiseResult swap_promise_result_; | 4874 TestSwapPromiseResult swap_promise_result_; |
| 4859 }; | 4875 }; |
| 4860 | 4876 |
| 4861 SINGLE_AND_MULTI_THREAD_TEST_F( | 4877 SINGLE_AND_MULTI_THREAD_TEST_F( |
| 4862 LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit); | 4878 LayerTreeHostTestBreakSwapPromiseForContext); |
| 4863 | 4879 |
| 4864 class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { | 4880 class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { |
| 4865 public: | 4881 public: |
| 4866 SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, | 4882 SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, |
| 4867 LayerTreeHostImpl* layer_tree_host_impl, | 4883 LayerTreeHostImpl* layer_tree_host_impl, |
| 4868 int* set_needs_commit_count, | 4884 int* set_needs_commit_count, |
| 4869 int* set_needs_redraw_count) | 4885 int* set_needs_redraw_count) |
| 4870 : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), | 4886 : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), |
| 4871 set_needs_commit_count_(set_needs_commit_count) {} | 4887 set_needs_commit_count_(set_needs_commit_count) {} |
| 4872 | 4888 |
| (...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6155 | 6171 |
| 6156 void AfterTest() override { EXPECT_TRUE(did_commit_); } | 6172 void AfterTest() override { EXPECT_TRUE(did_commit_); } |
| 6157 | 6173 |
| 6158 private: | 6174 private: |
| 6159 bool did_commit_; | 6175 bool did_commit_; |
| 6160 }; | 6176 }; |
| 6161 | 6177 |
| 6162 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoTasksBetweenWillAndDidCommit); | 6178 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoTasksBetweenWillAndDidCommit); |
| 6163 | 6179 |
| 6164 } // namespace cc | 6180 } // namespace cc |
| OLD | NEW |