Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Side by Side Diff: cc/trees/layer_tree_host_unittest.cc

Issue 337693005: cc: Control defer_commits logic by Scheduler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698