Index: cc/trees/layer_tree_host.cc |
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc |
index df82093bd91fe977a23dbef3f69241721ea482fe..ac471c395aea52fc303b0de0fa3d523e89421248 100644 |
--- a/cc/trees/layer_tree_host.cc |
+++ b/cc/trees/layer_tree_host.cc |
@@ -385,6 +385,8 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { |
sync_tree->SetLatencyInfo(latency_info_); |
latency_info_.Clear(); |
+ sync_tree->PassSwapPromises(&swap_promise_list_); |
+ |
host_impl->SetViewportSize(device_viewport_size_); |
host_impl->SetOverdrawBottomHeight(overdraw_bottom_height_); |
host_impl->SetDeviceScaleFactor(device_scale_factor_); |
@@ -1268,4 +1270,20 @@ bool LayerTreeHost::ScheduleMicroBenchmark( |
benchmark_name, value.Pass(), callback); |
} |
+void LayerTreeHost::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { |
+ if (proxy_->HasImplThread()) { |
+ DCHECK(proxy_->CommitRequested() || proxy_->BeginMainFrameRequested()); |
+ } |
+ DCHECK(swap_promise); |
+ if (swap_promise_list_.size() > kMaxQueuedSwapPromiseNumber) |
+ BreakSwapPromises(SwapPromise::SWAP_PROMISE_LIST_OVERFLOW); |
+ swap_promise_list_.push_back(swap_promise.Pass()); |
+} |
+ |
+void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { |
+ for (size_t i = 0; i < swap_promise_list_.size(); i++) |
+ swap_promise_list_[i]->DidNotSwap(reason); |
+ swap_promise_list_.clear(); |
+} |
+ |
} // namespace cc |