| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "cc/blimp/layer_tree_host_remote.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/run_loop.h" | |
| 9 #include "base/threading/thread_task_runner_handle.h" | |
| 10 #include "cc/animation/animation_host.h" | |
| 11 #include "cc/layers/layer.h" | |
| 12 #include "cc/output/begin_frame_args.h" | |
| 13 #include "cc/test/fake_remote_compositor_bridge.h" | |
| 14 #include "cc/test/stub_layer_tree_host_client.h" | |
| 15 #include "cc/trees/layer_tree_settings.h" | |
| 16 #include "testing/gmock/include/gmock/gmock.h" | |
| 17 #include "testing/gtest/include/gtest/gtest.h" | |
| 18 | |
| 19 using ::testing::_; | |
| 20 using testing::InSequence; | |
| 21 using testing::Mock; | |
| 22 using testing::StrictMock; | |
| 23 | |
| 24 #define EXPECT_BEGIN_MAIN_FRAME(client, num) \ | |
| 25 EXPECT_CALL(client, WillBeginMainFrame()).Times(num); \ | |
| 26 EXPECT_CALL(client, BeginMainFrame(_)).Times(num); \ | |
| 27 EXPECT_CALL(client, DidUpdateLayerTreeHost()).Times(num); \ | |
| 28 EXPECT_CALL(client, WillCommit()).Times(num); \ | |
| 29 EXPECT_CALL(client, DidCommit()).Times(num); \ | |
| 30 EXPECT_CALL(client, DidBeginMainFrame()).Times(num); | |
| 31 | |
| 32 #define EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(client, num) \ | |
| 33 EXPECT_BEGIN_MAIN_FRAME(client, num) \ | |
| 34 EXPECT_CALL(client, DidCommitAndDrawFrame()).Times(num); \ | |
| 35 EXPECT_CALL(client, DidCompleteSwapBuffers()).Times(num); | |
| 36 | |
| 37 namespace cc { | |
| 38 namespace { | |
| 39 | |
| 40 class UpdateTrackingRemoteCompositorBridge : public FakeRemoteCompositorBridge { | |
| 41 public: | |
| 42 UpdateTrackingRemoteCompositorBridge( | |
| 43 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner) | |
| 44 : FakeRemoteCompositorBridge(std::move(compositor_main_task_runner)) {} | |
| 45 | |
| 46 ~UpdateTrackingRemoteCompositorBridge() override = default; | |
| 47 | |
| 48 void ProcessCompositorStateUpdate( | |
| 49 std::unique_ptr<CompositorProtoState> compositor_proto_state) override { | |
| 50 num_updates_received_++; | |
| 51 }; | |
| 52 | |
| 53 int num_updates_received() const { return num_updates_received_; } | |
| 54 | |
| 55 private: | |
| 56 int num_updates_received_ = 0; | |
| 57 }; | |
| 58 | |
| 59 class MockLayerTreeHostClient : public StubLayerTreeHostClient { | |
| 60 public: | |
| 61 MockLayerTreeHostClient() = default; | |
| 62 ~MockLayerTreeHostClient() override = default; | |
| 63 | |
| 64 void set_update_host_callback(base::Closure callback) { | |
| 65 update_host_callback_ = callback; | |
| 66 } | |
| 67 | |
| 68 void UpdateLayerTreeHost() override { | |
| 69 update_host_callback_.Run(); | |
| 70 DidUpdateLayerTreeHost(); | |
| 71 } | |
| 72 | |
| 73 // LayerTreeHostClient implementation. | |
| 74 MOCK_METHOD0(WillBeginMainFrame, void()); | |
| 75 MOCK_METHOD1(BeginMainFrame, void(const BeginFrameArgs& args)); | |
| 76 MOCK_METHOD0(DidBeginMainFrame, void()); | |
| 77 MOCK_METHOD0(DidUpdateLayerTreeHost, void()); | |
| 78 MOCK_METHOD0(WillCommit, void()); | |
| 79 MOCK_METHOD0(DidCommit, void()); | |
| 80 MOCK_METHOD0(DidCommitAndDrawFrame, void()); | |
| 81 MOCK_METHOD0(DidCompleteSwapBuffers, void()); | |
| 82 | |
| 83 private: | |
| 84 base::Closure update_host_callback_; | |
| 85 }; | |
| 86 | |
| 87 class MockLayer : public Layer { | |
| 88 public: | |
| 89 explicit MockLayer(bool update) : update_(update) {} | |
| 90 | |
| 91 bool Update() override { | |
| 92 did_update_ = true; | |
| 93 return update_; | |
| 94 } | |
| 95 | |
| 96 bool did_update() const { return did_update_; } | |
| 97 | |
| 98 private: | |
| 99 ~MockLayer() override {} | |
| 100 | |
| 101 bool update_; | |
| 102 bool did_update_ = false; | |
| 103 }; | |
| 104 | |
| 105 class MockLayerTree : public LayerTree { | |
| 106 public: | |
| 107 MockLayerTree(std::unique_ptr<AnimationHost> animation_host, | |
| 108 LayerTreeHost* layer_tree_host) | |
| 109 : LayerTree(std::move(animation_host), layer_tree_host) {} | |
| 110 ~MockLayerTree() override {} | |
| 111 | |
| 112 // We don't want tree sync requests to trigger commits. | |
| 113 void SetNeedsFullTreeSync() override {} | |
| 114 }; | |
| 115 | |
| 116 class LayerTreeHostRemoteForTesting : public LayerTreeHostRemote { | |
| 117 public: | |
| 118 explicit LayerTreeHostRemoteForTesting(InitParams* params) | |
| 119 : LayerTreeHostRemote( | |
| 120 params, | |
| 121 base::MakeUnique<MockLayerTree>(AnimationHost::CreateMainInstance(), | |
| 122 this)) {} | |
| 123 ~LayerTreeHostRemoteForTesting() override {} | |
| 124 }; | |
| 125 | |
| 126 class LayerTreeHostRemoteTest : public testing::Test { | |
| 127 public: | |
| 128 LayerTreeHostRemoteTest() { | |
| 129 mock_layer_tree_host_client_.set_update_host_callback(base::Bind( | |
| 130 &LayerTreeHostRemoteTest::UpdateLayerTreeHost, base::Unretained(this))); | |
| 131 } | |
| 132 ~LayerTreeHostRemoteTest() override {} | |
| 133 | |
| 134 void SetUp() override { | |
| 135 LayerTreeHostRemote::InitParams params; | |
| 136 params.client = &mock_layer_tree_host_client_; | |
| 137 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner = | |
| 138 base::ThreadTaskRunnerHandle::Get(); | |
| 139 params.main_task_runner = main_task_runner; | |
| 140 std::unique_ptr<UpdateTrackingRemoteCompositorBridge> | |
| 141 remote_compositor_bridge = | |
| 142 base::MakeUnique<UpdateTrackingRemoteCompositorBridge>( | |
| 143 main_task_runner); | |
| 144 remote_compositor_bridge_ = remote_compositor_bridge.get(); | |
| 145 params.remote_compositor_bridge = std::move(remote_compositor_bridge); | |
| 146 LayerTreeSettings settings; | |
| 147 params.settings = &settings; | |
| 148 | |
| 149 layer_tree_host_ = base::MakeUnique<LayerTreeHostRemoteForTesting>(¶ms); | |
| 150 root_layer_ = make_scoped_refptr(new MockLayer(false)); | |
| 151 layer_tree_host_->GetLayerTree()->SetRootLayer(root_layer_); | |
| 152 } | |
| 153 | |
| 154 void TearDown() override { | |
| 155 Mock::VerifyAndClearExpectations(&mock_layer_tree_host_client_); | |
| 156 layer_tree_host_ = nullptr; | |
| 157 root_layer_ = nullptr; | |
| 158 remote_compositor_bridge_ = nullptr; | |
| 159 } | |
| 160 | |
| 161 void UpdateLayerTreeHost() { | |
| 162 if (needs_animate_during_main_frame_) { | |
| 163 layer_tree_host_->SetNeedsAnimate(); | |
| 164 needs_animate_during_main_frame_ = false; | |
| 165 } | |
| 166 | |
| 167 if (needs_commit_during_main_frame_) { | |
| 168 layer_tree_host_->SetNeedsCommit(); | |
| 169 needs_commit_during_main_frame_ = false; | |
| 170 } | |
| 171 } | |
| 172 | |
| 173 void set_needs_animate_during_main_frame(bool needs) { | |
| 174 needs_animate_during_main_frame_ = needs; | |
| 175 } | |
| 176 | |
| 177 void set_needs_commit_during_main_frame(bool needs) { | |
| 178 needs_commit_during_main_frame_ = needs; | |
| 179 } | |
| 180 | |
| 181 protected: | |
| 182 std::unique_ptr<LayerTreeHostRemote> layer_tree_host_; | |
| 183 StrictMock<MockLayerTreeHostClient> mock_layer_tree_host_client_; | |
| 184 UpdateTrackingRemoteCompositorBridge* remote_compositor_bridge_ = nullptr; | |
| 185 scoped_refptr<MockLayer> root_layer_; | |
| 186 | |
| 187 bool needs_animate_during_main_frame_ = false; | |
| 188 bool needs_commit_during_main_frame_ = false; | |
| 189 | |
| 190 private: | |
| 191 DISALLOW_COPY_AND_ASSIGN(LayerTreeHostRemoteTest); | |
| 192 }; | |
| 193 | |
| 194 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameAnimateOnly) { | |
| 195 // The main frame should run until the animate step only. | |
| 196 InSequence s; | |
| 197 int num_of_frames = 1; | |
| 198 EXPECT_BEGIN_MAIN_FRAME(mock_layer_tree_host_client_, num_of_frames); | |
| 199 | |
| 200 int previous_source_frame = layer_tree_host_->SourceFrameNumber(); | |
| 201 layer_tree_host_->SetNeedsAnimate(); | |
| 202 | |
| 203 base::RunLoop().RunUntilIdle(); | |
| 204 EXPECT_FALSE(root_layer_->did_update()); | |
| 205 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received()); | |
| 206 EXPECT_EQ(++previous_source_frame, layer_tree_host_->SourceFrameNumber()); | |
| 207 } | |
| 208 | |
| 209 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameUpdateLayers) { | |
| 210 // The main frame should run until the update layers step only. | |
| 211 InSequence s; | |
| 212 int num_of_frames = 1; | |
| 213 EXPECT_BEGIN_MAIN_FRAME(mock_layer_tree_host_client_, num_of_frames); | |
| 214 | |
| 215 int previous_source_frame = layer_tree_host_->SourceFrameNumber(); | |
| 216 layer_tree_host_->SetNeedsUpdateLayers(); | |
| 217 | |
| 218 base::RunLoop().RunUntilIdle(); | |
| 219 EXPECT_TRUE(root_layer_->did_update()); | |
| 220 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received()); | |
| 221 EXPECT_EQ(++previous_source_frame, layer_tree_host_->SourceFrameNumber()); | |
| 222 } | |
| 223 | |
| 224 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameCommit) { | |
| 225 // The main frame should run until the commit step. | |
| 226 InSequence s; | |
| 227 int num_of_frames = 1; | |
| 228 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, | |
| 229 num_of_frames); | |
| 230 | |
| 231 int previous_source_frame = layer_tree_host_->SourceFrameNumber(); | |
| 232 layer_tree_host_->SetNeedsCommit(); | |
| 233 | |
| 234 base::RunLoop().RunUntilIdle(); | |
| 235 EXPECT_TRUE(root_layer_->did_update()); | |
| 236 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); | |
| 237 EXPECT_EQ(++previous_source_frame, layer_tree_host_->SourceFrameNumber()); | |
| 238 } | |
| 239 | |
| 240 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameMultipleRequests) { | |
| 241 // Multiple BeginMainFrame requests should result in a single main frame | |
| 242 // update. | |
| 243 InSequence s; | |
| 244 int num_of_frames = 1; | |
| 245 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, | |
| 246 num_of_frames); | |
| 247 | |
| 248 layer_tree_host_->SetNeedsAnimate(); | |
| 249 layer_tree_host_->SetNeedsUpdateLayers(); | |
| 250 layer_tree_host_->SetNeedsCommit(); | |
| 251 | |
| 252 base::RunLoop().RunUntilIdle(); | |
| 253 EXPECT_TRUE(root_layer_->did_update()); | |
| 254 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); | |
| 255 } | |
| 256 | |
| 257 TEST_F(LayerTreeHostRemoteTest, CommitRequestThenDeferCommits) { | |
| 258 // Make a commit request, followed by a request to defer commits. | |
| 259 layer_tree_host_->SetNeedsCommit(); | |
| 260 layer_tree_host_->SetDeferCommits(true); | |
| 261 | |
| 262 // We should not have seen any BeginMainFrames. | |
| 263 base::RunLoop().RunUntilIdle(); | |
| 264 Mock::VerifyAndClearExpectations(&mock_layer_tree_host_client_); | |
| 265 EXPECT_FALSE(root_layer_->did_update()); | |
| 266 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received()); | |
| 267 | |
| 268 // Now enable commits and ensure we see a BeginMainFrame. | |
| 269 layer_tree_host_->SetDeferCommits(false); | |
| 270 InSequence s; | |
| 271 int num_of_frames = 1; | |
| 272 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, | |
| 273 num_of_frames); | |
| 274 base::RunLoop().RunUntilIdle(); | |
| 275 EXPECT_TRUE(root_layer_->did_update()); | |
| 276 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); | |
| 277 } | |
| 278 | |
| 279 TEST_F(LayerTreeHostRemoteTest, DeferCommitsThenCommitRequest) { | |
| 280 // Defer commits followed by a commit request. | |
| 281 layer_tree_host_->SetDeferCommits(true); | |
| 282 layer_tree_host_->SetNeedsCommit(); | |
| 283 | |
| 284 // We should not have seen any BeginMainFrames. | |
| 285 base::RunLoop().RunUntilIdle(); | |
| 286 Mock::VerifyAndClearExpectations(&mock_layer_tree_host_client_); | |
| 287 EXPECT_FALSE(root_layer_->did_update()); | |
| 288 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received()); | |
| 289 | |
| 290 // Now enable commits and ensure we see a BeginMainFrame. | |
| 291 layer_tree_host_->SetDeferCommits(false); | |
| 292 InSequence s; | |
| 293 int num_of_frames = 1; | |
| 294 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, | |
| 295 num_of_frames); | |
| 296 base::RunLoop().RunUntilIdle(); | |
| 297 EXPECT_TRUE(root_layer_->did_update()); | |
| 298 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); | |
| 299 } | |
| 300 | |
| 301 TEST_F(LayerTreeHostRemoteTest, RequestAnimateDuringMainFrame) { | |
| 302 // An animate request during BeginMainFrame should result in a second main | |
| 303 // frame being scheduled. | |
| 304 set_needs_animate_during_main_frame(true); | |
| 305 int num_of_frames = 2; | |
| 306 EXPECT_BEGIN_MAIN_FRAME(mock_layer_tree_host_client_, num_of_frames); | |
| 307 | |
| 308 layer_tree_host_->SetNeedsAnimate(); | |
| 309 | |
| 310 base::RunLoop().RunUntilIdle(); | |
| 311 EXPECT_FALSE(root_layer_->did_update()); | |
| 312 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received()); | |
| 313 } | |
| 314 | |
| 315 TEST_F(LayerTreeHostRemoteTest, RequestCommitDuringMainFrame) { | |
| 316 // A commit request during a BeginMainFrame scheduled for an animate request | |
| 317 // should go till the commit stage. | |
| 318 set_needs_commit_during_main_frame(true); | |
| 319 int num_of_frames = 1; | |
| 320 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, | |
| 321 num_of_frames); | |
| 322 | |
| 323 layer_tree_host_->SetNeedsAnimate(); | |
| 324 | |
| 325 base::RunLoop().RunUntilIdle(); | |
| 326 EXPECT_TRUE(root_layer_->did_update()); | |
| 327 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); | |
| 328 } | |
| 329 | |
| 330 TEST_F(LayerTreeHostRemoteTest, RequestCommitDuringLayerUpdates) { | |
| 331 // A layer update during a main frame should result in a commit. | |
| 332 scoped_refptr<Layer> child_layer = make_scoped_refptr(new MockLayer(true)); | |
| 333 root_layer_->AddChild(child_layer); | |
| 334 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, 1); | |
| 335 | |
| 336 layer_tree_host_->SetNeedsUpdateLayers(); | |
| 337 | |
| 338 base::RunLoop().RunUntilIdle(); | |
| 339 EXPECT_TRUE(root_layer_->did_update()); | |
| 340 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); | |
| 341 } | |
| 342 | |
| 343 } // namespace | |
| 344 } // namespace cc | |
| OLD | NEW |