summaryrefslogtreecommitdiffstats
path: root/cc/trees
diff options
context:
space:
mode:
Diffstat (limited to 'cc/trees')
-rw-r--r--cc/trees/layer_tree_host.cc4
-rw-r--r--cc/trees/layer_tree_host_unittest.cc74
-rw-r--r--cc/trees/layer_tree_impl.cc23
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();
}