diff options
Diffstat (limited to 'cc/trees')
-rw-r--r-- | cc/trees/layer_tree_host.cc | 4 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_unittest.cc | 74 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.cc | 23 |
3 files changed, 87 insertions, 14 deletions
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 45ecee4..eaedf40 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc @@ -1279,8 +1279,8 @@ void LayerTreeHost::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { } void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { - for (size_t i = 0; i < swap_promise_list_.size(); i++) - swap_promise_list_[i]->DidNotSwap(reason); + for (auto* swap_promise : swap_promise_list_) + swap_promise->DidNotSwap(reason); swap_promise_list_.clear(); } diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index 51ea3d9..98ac5a1 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc @@ -4927,11 +4927,13 @@ SINGLE_AND_MULTI_THREAD_TEST_F( struct TestSwapPromiseResult { TestSwapPromiseResult() - : did_swap_called(false), + : did_activate_called(false), + did_swap_called(false), did_not_swap_called(false), dtor_called(false), - reason(SwapPromise::DID_NOT_SWAP_UNKNOWN) {} + reason(SwapPromise::COMMIT_FAILS) {} + bool did_activate_called; bool did_swap_called; bool did_not_swap_called; bool dtor_called; @@ -4948,8 +4950,17 @@ class TestSwapPromise : public SwapPromise { result_->dtor_called = true; } + void DidActivate() override { + base::AutoLock lock(result_->lock); + EXPECT_FALSE(result_->did_activate_called); + EXPECT_FALSE(result_->did_swap_called); + EXPECT_FALSE(result_->did_not_swap_called); + result_->did_activate_called = true; + } + void DidSwap(CompositorFrameMetadata* metadata) override { base::AutoLock lock(result_->lock); + EXPECT_TRUE(result_->did_activate_called); EXPECT_FALSE(result_->did_swap_called); EXPECT_FALSE(result_->did_not_swap_called); result_->did_swap_called = true; @@ -4959,6 +4970,8 @@ class TestSwapPromise : public SwapPromise { base::AutoLock lock(result_->lock); EXPECT_FALSE(result_->did_swap_called); EXPECT_FALSE(result_->did_not_swap_called); + EXPECT_FALSE(result_->did_activate_called && + reason != DidNotSwapReason::SWAP_FAILS); result_->did_not_swap_called = true; result_->reason = reason; } @@ -4992,6 +5005,22 @@ class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { } } + void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { + if (host_impl->pending_tree()) { + int frame = host_impl->pending_tree()->source_frame_number(); + base::AutoLock lock(swap_promise_result_[frame].lock); + EXPECT_FALSE(swap_promise_result_[frame].did_activate_called); + EXPECT_FALSE(swap_promise_result_[frame].did_swap_called); + } + } + + void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { + int frame = host_impl->active_tree()->source_frame_number(); + base::AutoLock lock(swap_promise_result_[frame].lock); + EXPECT_TRUE(swap_promise_result_[frame].did_activate_called); + EXPECT_FALSE(swap_promise_result_[frame].did_swap_called); + } + void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override { commit_complete_count_++; if (commit_complete_count_ == 1) { @@ -5019,6 +5048,7 @@ class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { { // The second commit is aborted since it contains no updates. base::AutoLock lock(swap_promise_result_[1].lock); + EXPECT_FALSE(swap_promise_result_[1].did_activate_called); EXPECT_FALSE(swap_promise_result_[1].did_swap_called); EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); EXPECT_EQ(SwapPromise::COMMIT_NO_UPDATE, swap_promise_result_[1].reason); @@ -5029,6 +5059,7 @@ class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { // The last commit completes but it does not cause swap buffer because // there is no damage in the frame data. base::AutoLock lock(swap_promise_result_[2].lock); + EXPECT_TRUE(swap_promise_result_[2].did_activate_called); EXPECT_FALSE(swap_promise_result_[2].did_swap_called); EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); @@ -5078,6 +5109,41 @@ class LayerTreeHostTestKeepSwapPromise : public LayerTreeTest { } } + void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { + if (host_impl->pending_tree()) { + if (host_impl->pending_tree()->source_frame_number() == 1) { + base::AutoLock lock(swap_promise_result_.lock); + EXPECT_FALSE(swap_promise_result_.did_activate_called); + EXPECT_FALSE(swap_promise_result_.did_swap_called); + SetCallback(true); + } else { + SetCallback(false); + } + } + } + + void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { + if (host_impl->active_tree()->source_frame_number() == 1) { + base::AutoLock lock(swap_promise_result_.lock); + EXPECT_TRUE(swap_promise_result_.did_activate_called); + EXPECT_FALSE(swap_promise_result_.did_swap_called); + } + } + + void ActivationCallback() { + // DidActivate needs to happen before the tree activation callback. + base::AutoLock lock(swap_promise_result_.lock); + EXPECT_TRUE(swap_promise_result_.did_activate_called); + } + + void SetCallback(bool enable) { + output_surface()->SetTreeActivationCallback( + enable + ? base::Bind(&LayerTreeHostTestKeepSwapPromise::ActivationCallback, + base::Unretained(this)) + : base::Closure()); + } + void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { EXPECT_TRUE(result); if (host_impl->active_tree()->source_frame_number() >= 1) { @@ -5127,6 +5193,7 @@ class LayerTreeHostTestBreakSwapPromiseForVisibility void AfterTest() override { { base::AutoLock lock(swap_promise_result_.lock); + EXPECT_FALSE(swap_promise_result_.did_activate_called); EXPECT_FALSE(swap_promise_result_.did_swap_called); EXPECT_TRUE(swap_promise_result_.did_not_swap_called); EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); @@ -5176,6 +5243,7 @@ class LayerTreeHostTestBreakSwapPromiseForContext : public LayerTreeHostTest { void AfterTest() override { { base::AutoLock lock(swap_promise_result_.lock); + EXPECT_FALSE(swap_promise_result_.did_activate_called); EXPECT_FALSE(swap_promise_result_.did_swap_called); EXPECT_TRUE(swap_promise_result_.did_not_swap_called); EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); @@ -5829,6 +5897,7 @@ class LayerTreeHostTestSynchronousCompositeSwapPromise // Second swap promise fails to swap. { base::AutoLock lock(swap_promise_result_[1].lock); + EXPECT_TRUE(swap_promise_result_[1].did_activate_called); EXPECT_FALSE(swap_promise_result_[1].did_swap_called); EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); @@ -5838,6 +5907,7 @@ class LayerTreeHostTestSynchronousCompositeSwapPromise // Third swap promises also fails to swap (and draw). { base::AutoLock lock(swap_promise_result_[2].lock); + EXPECT_TRUE(swap_promise_result_[2].did_activate_called); EXPECT_FALSE(swap_promise_result_[2].did_swap_called); EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 2768859..01a4cfd 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc @@ -70,7 +70,8 @@ LayerTreeImpl::LayerTreeImpl( } LayerTreeImpl::~LayerTreeImpl() { - BreakSwapPromises(SwapPromise::SWAP_FAILS); + BreakSwapPromises(IsActiveTree() ? SwapPromise::SWAP_FAILS + : SwapPromise::ACTIVATION_FAILS); // Need to explicitly clear the tree prior to destroying this so that // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. @@ -744,6 +745,8 @@ void LayerTreeImpl::DidBecomeActive() { root_layer(), [](LayerImpl* layer) { layer->DidBecomeActive(); }); } + for (auto* swap_promise : swap_promise_list_) + swap_promise->DidActivate(); devtools_instrumentation::DidActivateLayerTree(layer_tree_host_impl_->id(), source_frame_number_); } @@ -990,8 +993,8 @@ void LayerTreeImpl::AsValueInto(base::trace_event::TracedValue* state) const { state->EndArray(); state->BeginArray("swap_promise_trace_ids"); - for (size_t i = 0; i < swap_promise_list_.size(); i++) - state->AppendDouble(swap_promise_list_[i]->TraceId()); + for (auto* swap_promise : swap_promise_list_) + state->AppendDouble(swap_promise->TraceId()); state->EndArray(); } @@ -1072,20 +1075,20 @@ void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { void LayerTreeImpl::PassSwapPromises( ScopedPtrVector<SwapPromise>* new_swap_promise) { - swap_promise_list_.insert_and_take(swap_promise_list_.end(), - new_swap_promise); - new_swap_promise->clear(); + // Any left over promises have failed to swap before the next frame. + BreakSwapPromises(SwapPromise::SWAP_FAILS); + swap_promise_list_.swap(*new_swap_promise); } void LayerTreeImpl::FinishSwapPromises(CompositorFrameMetadata* metadata) { - for (size_t i = 0; i < swap_promise_list_.size(); i++) - swap_promise_list_[i]->DidSwap(metadata); + for (auto* swap_promise : swap_promise_list_) + swap_promise->DidSwap(metadata); swap_promise_list_.clear(); } void LayerTreeImpl::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { - for (size_t i = 0; i < swap_promise_list_.size(); i++) - swap_promise_list_[i]->DidNotSwap(reason); + for (auto* swap_promise : swap_promise_list_) + swap_promise->DidNotSwap(reason); swap_promise_list_.clear(); } |