summaryrefslogtreecommitdiffstats
path: root/cc/trees
diff options
context:
space:
mode:
authortobiasjs <tobiasjs@chromium.org>2015-05-15 10:52:44 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-15 17:53:37 +0000
commit93d4648413ae2c80388e667dc37257308fa9e889 (patch)
treedb7343ba3e51b39009ed93cdbd9f00bfc8da3097 /cc/trees
parent3c1f64f9c822002263d9f0aa4e5e02cebb26671f (diff)
downloadchromium_src-93d4648413ae2c80388e667dc37257308fa9e889.zip
chromium_src-93d4648413ae2c80388e667dc37257308fa9e889.tar.gz
chromium_src-93d4648413ae2c80388e667dc37257308fa9e889.tar.bz2
Move VISUAL_STATE promise to activation
Motivation is for android webview where compositor swaps is not controlled by chromium code, but activations are. Add a DidActivate to SwapPromise. This is an additional call before DidSwap. It is not meant to be the end of a SwapPromise as either DidSwap or DidNotSwap can still be called afterwards. Then modify the message queue to mark VISUAL_STATE messages as ready to deliver in DidActivate. On chrome, the messages are still delivered in swap, so there is no additional IPCs. In webview, they can be delivered in the activation callback. BUG=431166 Review URL: https://codereview.chromium.org/1126963006 Cr-Commit-Position: refs/heads/master@{#330128}
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();
}