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