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 2011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2022 scoped_refptr<Layer> layer_; | 2022 scoped_refptr<Layer> layer_; |
2023 int num_commit_complete_; | 2023 int num_commit_complete_; |
2024 int num_draw_layers_; | 2024 int num_draw_layers_; |
2025 }; | 2025 }; |
2026 | 2026 |
2027 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); | 2027 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); |
2028 | 2028 |
2029 class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { | 2029 class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { |
2030 public: | 2030 public: |
2031 LayerTreeHostTestDeferCommits() | 2031 LayerTreeHostTestDeferCommits() |
2032 : num_will_begin_impl_frame_(0), | 2032 : num_commits_deferred_(0), num_complete_commits_(0) {} |
2033 num_send_begin_main_frame_(0) {} | |
2034 | 2033 |
2035 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 2034 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
2036 | 2035 |
2037 void WillBeginImplFrame(const BeginFrameArgs& args) override { | 2036 void DidDeferCommit() override { |
2038 num_will_begin_impl_frame_++; | 2037 num_commits_deferred_++; |
2039 switch (num_will_begin_impl_frame_) { | 2038 layer_tree_host()->SetDeferCommits(false); |
| 2039 } |
| 2040 |
| 2041 void DidCommit() override { |
| 2042 num_complete_commits_++; |
| 2043 switch (num_complete_commits_) { |
2040 case 1: | 2044 case 1: |
| 2045 EXPECT_EQ(0, num_commits_deferred_); |
| 2046 layer_tree_host()->SetDeferCommits(true); |
| 2047 PostSetNeedsCommitToMainThread(); |
2041 break; | 2048 break; |
2042 case 2: | 2049 case 2: |
2043 PostSetNeedsCommitToMainThread(); | 2050 EndTest(); |
2044 break; | |
2045 case 3: | |
2046 PostSetDeferCommitsToMainThread(false); | |
2047 break; | 2051 break; |
2048 default: | 2052 default: |
2049 NOTREACHED(); | 2053 NOTREACHED(); |
2050 break; | 2054 break; |
2051 } | 2055 } |
2052 } | 2056 } |
2053 | 2057 |
2054 void ScheduledActionSendBeginMainFrame() override { | |
2055 num_send_begin_main_frame_++; | |
2056 switch (num_send_begin_main_frame_) { | |
2057 case 1: | |
2058 PostSetDeferCommitsToMainThread(true); | |
2059 break; | |
2060 case 2: | |
2061 EndTest(); | |
2062 break; | |
2063 default: | |
2064 NOTREACHED(); | |
2065 break; | |
2066 } | |
2067 } | |
2068 | |
2069 void AfterTest() override { | 2058 void AfterTest() override { |
2070 EXPECT_GE(3, num_will_begin_impl_frame_); | 2059 EXPECT_EQ(1, num_commits_deferred_); |
2071 EXPECT_EQ(2, num_send_begin_main_frame_); | 2060 EXPECT_EQ(2, num_complete_commits_); |
2072 } | 2061 } |
2073 | 2062 |
2074 private: | 2063 private: |
2075 int num_will_begin_impl_frame_; | 2064 int num_commits_deferred_; |
2076 int num_send_begin_main_frame_; | 2065 int num_complete_commits_; |
2077 }; | 2066 }; |
2078 | 2067 |
2079 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); | 2068 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); |
2080 | 2069 |
2081 class LayerTreeHostWithProxy : public LayerTreeHost { | 2070 class LayerTreeHostWithProxy : public LayerTreeHost { |
2082 public: | 2071 public: |
2083 LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, | 2072 LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, |
2084 const LayerTreeSettings& settings, | 2073 const LayerTreeSettings& settings, |
2085 scoped_ptr<FakeProxy> proxy) | 2074 scoped_ptr<FakeProxy> proxy) |
2086 : LayerTreeHost(client, NULL, NULL, settings) { | 2075 : LayerTreeHost(client, NULL, NULL, settings) { |
(...skipping 2715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4802 | 4791 |
4803 void AfterTest() override {} | 4792 void AfterTest() override {} |
4804 | 4793 |
4805 private: | 4794 private: |
4806 scoped_refptr<Layer> layer_; | 4795 scoped_refptr<Layer> layer_; |
4807 TestSwapPromiseResult swap_promise_result_; | 4796 TestSwapPromiseResult swap_promise_result_; |
4808 }; | 4797 }; |
4809 | 4798 |
4810 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestKeepSwapPromise); | 4799 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestKeepSwapPromise); |
4811 | 4800 |
4812 class LayerTreeHostTestBreakSwapPromiseForVisibility | 4801 class LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit |
4813 : public LayerTreeHostTest { | 4802 : public LayerTreeHostTest { |
4814 protected: | 4803 protected: |
4815 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 4804 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
4816 | 4805 |
4817 void SetVisibleFalseAndQueueSwapPromise() { | 4806 void DidCommit() override { |
| 4807 layer_tree_host()->SetDeferCommits(true); |
| 4808 layer_tree_host()->SetNeedsCommit(); |
| 4809 } |
| 4810 |
| 4811 void DidDeferCommit() override { |
4818 layer_tree_host()->SetVisible(false); | 4812 layer_tree_host()->SetVisible(false); |
4819 scoped_ptr<SwapPromise> swap_promise( | 4813 scoped_ptr<SwapPromise> swap_promise( |
4820 new TestSwapPromise(&swap_promise_result_)); | 4814 new TestSwapPromise(&swap_promise_result_)); |
4821 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 4815 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
4822 } | 4816 layer_tree_host()->SetDeferCommits(false); |
4823 | |
4824 void ScheduledActionWillSendBeginMainFrame() override { | |
4825 MainThreadTaskRunner()->PostTask( | |
4826 FROM_HERE, | |
4827 base::Bind(&LayerTreeHostTestBreakSwapPromiseForVisibility | |
4828 ::SetVisibleFalseAndQueueSwapPromise, | |
4829 base::Unretained(this))); | |
4830 } | 4817 } |
4831 | 4818 |
4832 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, | 4819 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, |
4833 CommitEarlyOutReason reason) override { | 4820 CommitEarlyOutReason reason) override { |
4834 EndTest(); | 4821 EndTest(); |
4835 } | 4822 } |
4836 | 4823 |
4837 void AfterTest() override { | 4824 void AfterTest() override { |
4838 { | 4825 { |
4839 base::AutoLock lock(swap_promise_result_.lock); | 4826 base::AutoLock lock(swap_promise_result_.lock); |
4840 EXPECT_FALSE(swap_promise_result_.did_swap_called); | 4827 EXPECT_FALSE(swap_promise_result_.did_swap_called); |
4841 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); | 4828 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); |
4842 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); | 4829 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); |
4843 EXPECT_TRUE(swap_promise_result_.dtor_called); | 4830 EXPECT_TRUE(swap_promise_result_.dtor_called); |
4844 } | 4831 } |
4845 } | 4832 } |
4846 | 4833 |
4847 TestSwapPromiseResult swap_promise_result_; | 4834 TestSwapPromiseResult swap_promise_result_; |
4848 }; | 4835 }; |
4849 | 4836 |
4850 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestBreakSwapPromiseForVisibility); | 4837 SINGLE_AND_MULTI_THREAD_TEST_F( |
| 4838 LayerTreeHostTestBreakSwapPromiseForVisibilityAbortedCommit); |
4851 | 4839 |
4852 class LayerTreeHostTestBreakSwapPromiseForContext : public LayerTreeHostTest { | 4840 class LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit |
| 4841 : public LayerTreeHostTest { |
4853 protected: | 4842 protected: |
4854 LayerTreeHostTestBreakSwapPromiseForContext() | 4843 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
4855 : output_surface_lost_triggered_(false) { | 4844 |
| 4845 void DidCommit() override { |
| 4846 if (TestEnded()) |
| 4847 return; |
| 4848 layer_tree_host()->SetDeferCommits(true); |
| 4849 layer_tree_host()->SetNeedsCommit(); |
4856 } | 4850 } |
4857 | 4851 |
4858 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 4852 void DidDeferCommit() override { |
4859 | |
4860 void LoseOutputSurfaceAndQueueSwapPromise() { | |
4861 layer_tree_host()->DidLoseOutputSurface(); | 4853 layer_tree_host()->DidLoseOutputSurface(); |
4862 scoped_ptr<SwapPromise> swap_promise( | 4854 scoped_ptr<SwapPromise> swap_promise( |
4863 new TestSwapPromise(&swap_promise_result_)); | 4855 new TestSwapPromise(&swap_promise_result_)); |
4864 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 4856 layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
4865 } | 4857 layer_tree_host()->SetDeferCommits(false); |
4866 | |
4867 void ScheduledActionWillSendBeginMainFrame() override { | |
4868 if (output_surface_lost_triggered_) | |
4869 return; | |
4870 output_surface_lost_triggered_ = true; | |
4871 | |
4872 MainThreadTaskRunner()->PostTask( | |
4873 FROM_HERE, | |
4874 base::Bind(&LayerTreeHostTestBreakSwapPromiseForContext | |
4875 ::LoseOutputSurfaceAndQueueSwapPromise, | |
4876 base::Unretained(this))); | |
4877 } | 4858 } |
4878 | 4859 |
4879 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, | 4860 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* host_impl, |
4880 CommitEarlyOutReason reason) override { | 4861 CommitEarlyOutReason reason) override { |
4881 // This is needed so that the impl-thread state matches main-thread state. | 4862 // This is needed so that the impl-thread state matches main-thread state. |
4882 host_impl->DidLoseOutputSurface(); | 4863 host_impl->DidLoseOutputSurface(); |
4883 EndTest(); | 4864 EndTest(); |
4884 } | 4865 } |
4885 | 4866 |
4886 void AfterTest() override { | 4867 void AfterTest() override { |
4887 { | 4868 { |
4888 base::AutoLock lock(swap_promise_result_.lock); | 4869 base::AutoLock lock(swap_promise_result_.lock); |
4889 EXPECT_FALSE(swap_promise_result_.did_swap_called); | 4870 EXPECT_FALSE(swap_promise_result_.did_swap_called); |
4890 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); | 4871 EXPECT_TRUE(swap_promise_result_.did_not_swap_called); |
4891 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); | 4872 EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); |
4892 EXPECT_TRUE(swap_promise_result_.dtor_called); | 4873 EXPECT_TRUE(swap_promise_result_.dtor_called); |
4893 } | 4874 } |
4894 } | 4875 } |
4895 | 4876 |
4896 bool output_surface_lost_triggered_; | |
4897 TestSwapPromiseResult swap_promise_result_; | 4877 TestSwapPromiseResult swap_promise_result_; |
4898 }; | 4878 }; |
4899 | 4879 |
4900 SINGLE_AND_MULTI_THREAD_TEST_F( | 4880 SINGLE_AND_MULTI_THREAD_TEST_F( |
4901 LayerTreeHostTestBreakSwapPromiseForContext); | 4881 LayerTreeHostTestBreakSwapPromiseForContextAbortedCommit); |
4902 | 4882 |
4903 class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { | 4883 class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { |
4904 public: | 4884 public: |
4905 SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, | 4885 SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, |
4906 LayerTreeHostImpl* layer_tree_host_impl, | 4886 LayerTreeHostImpl* layer_tree_host_impl, |
4907 int* set_needs_commit_count, | 4887 int* set_needs_commit_count, |
4908 int* set_needs_redraw_count) | 4888 int* set_needs_redraw_count) |
4909 : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), | 4889 : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), |
4910 set_needs_commit_count_(set_needs_commit_count) {} | 4890 set_needs_commit_count_(set_needs_commit_count) {} |
4911 | 4891 |
(...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6194 | 6174 |
6195 void AfterTest() override { EXPECT_TRUE(did_commit_); } | 6175 void AfterTest() override { EXPECT_TRUE(did_commit_); } |
6196 | 6176 |
6197 private: | 6177 private: |
6198 bool did_commit_; | 6178 bool did_commit_; |
6199 }; | 6179 }; |
6200 | 6180 |
6201 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoTasksBetweenWillAndDidCommit); | 6181 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoTasksBetweenWillAndDidCommit); |
6202 | 6182 |
6203 } // namespace cc | 6183 } // namespace cc |
OLD | NEW |