| Index: cc/trees/single_thread_proxy.cc
|
| diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
|
| index 0386145c7c55fea08e4f34362dd5f3536b1b1a02..668ba9190cd9503a5ddbd131ca574c17f3ed57a0 100644
|
| --- a/cc/trees/single_thread_proxy.cc
|
| +++ b/cc/trees/single_thread_proxy.cc
|
| @@ -52,6 +52,7 @@ SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layer_tree_host,
|
| inside_synchronous_composite_(false),
|
| compositor_frame_sink_creation_requested_(false),
|
| compositor_frame_sink_lost_(true),
|
| + compositor_frame_sink_weak_factory_(this),
|
| weak_factory_(this) {
|
| TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
|
| DCHECK(task_runner_provider_);
|
| @@ -123,6 +124,7 @@ void SingleThreadProxy::RequestNewCompositorFrameSink() {
|
|
|
| void SingleThreadProxy::ReleaseCompositorFrameSink() {
|
| compositor_frame_sink_lost_ = true;
|
| + compositor_frame_sink_weak_factory_.InvalidateWeakPtrs();
|
| if (scheduler_on_impl_thread_)
|
| scheduler_on_impl_thread_->DidLoseCompositorFrameSink();
|
| return layer_tree_host_impl_->ReleaseCompositorFrameSink();
|
| @@ -403,6 +405,7 @@ void SingleThreadProxy::DidCompletePageScaleAnimationOnImplThread() {
|
| void SingleThreadProxy::DidLoseCompositorFrameSinkOnImplThread() {
|
| TRACE_EVENT0("cc",
|
| "SingleThreadProxy::DidLoseCompositorFrameSinkOnImplThread");
|
| + compositor_frame_sink_weak_factory_.InvalidateWeakPtrs();
|
| {
|
| DebugScopedSetMainThread main(task_runner_provider_);
|
| // This must happen before we notify the scheduler as it may try to recreate
|
| @@ -425,7 +428,12 @@ void SingleThreadProxy::DidReceiveCompositorFrameAckOnImplThread() {
|
| "SingleThreadProxy::DidReceiveCompositorFrameAckOnImplThread");
|
| if (scheduler_on_impl_thread_)
|
| scheduler_on_impl_thread_->DidReceiveCompositorFrameAck();
|
| - layer_tree_host_->DidReceiveCompositorFrameAck();
|
| + // We do a PostTask here because freeing resources in some cases (such as in
|
| + // TextureLayer) is PostTasked and we want to make sure ack is received after
|
| + // resources are returned.
|
| + task_runner_provider_->MainThreadTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(&SingleThreadProxy::DidReceiveCompositorFrameAck,
|
| + compositor_frame_sink_weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| void SingleThreadProxy::OnDrawForCompositorFrameSink(
|
| @@ -794,4 +802,8 @@ void SingleThreadProxy::DidFinishImplFrame() {
|
| #endif
|
| }
|
|
|
| +void SingleThreadProxy::DidReceiveCompositorFrameAck() {
|
| + layer_tree_host_->DidReceiveCompositorFrameAck();
|
| +}
|
| +
|
| } // namespace cc
|
|
|