Index: blimp/client/core/compositor/blimp_compositor.cc |
diff --git a/blimp/client/core/compositor/blimp_compositor.cc b/blimp/client/core/compositor/blimp_compositor.cc |
index 4b94dbcfab23b67609f7b84d2dd4466f1e8ebbe5..9159663e20681493d86250020a5bc62b65cea886 100644 |
--- a/blimp/client/core/compositor/blimp_compositor.cc |
+++ b/blimp/client/core/compositor/blimp_compositor.cc |
@@ -138,6 +138,7 @@ BlimpCompositor::BlimpCompositor( |
frame_sink_id_(compositor_dependencies_->GetEmbedderDependencies() |
->AllocateFrameSinkId()), |
proxy_client_(nullptr), |
+ bound_to_proxy_(false), |
compositor_frame_sink_request_pending_(false), |
layer_(cc::Layer::Create()), |
remote_proto_channel_receiver_(nullptr), |
@@ -149,6 +150,9 @@ BlimpCompositor::BlimpCompositor( |
void BlimpCompositor::Initialize() { |
surface_id_allocator_ = base::MakeUnique<cc::SurfaceIdAllocator>(); |
GetEmbedderDeps()->GetSurfaceManager()->RegisterFrameSinkId(frame_sink_id_); |
+ surface_factory_ = base::MakeUnique<cc::SurfaceFactory>( |
+ frame_sink_id_, GetEmbedderDeps()->GetSurfaceManager(), this); |
+ animation_host_ = cc::AnimationHost::CreateMainInstance(); |
host_ = CreateLayerTreeHost(); |
if (use_threaded_layer_tree_host_) { |
@@ -184,7 +188,7 @@ void BlimpCompositor::RequestCopyOfOutput( |
std::unique_ptr<cc::CopyOutputRequest> copy_request, |
bool flush_pending_update) { |
// If we don't have a FrameSink, fail right away. |
- if (!surface_factory_) |
+ if (!bound_to_proxy_) |
return; |
if (!use_threaded_layer_tree_host_) { |
@@ -255,7 +259,7 @@ void BlimpCompositor::ApplyViewportDeltas( |
} |
void BlimpCompositor::RequestNewCompositorFrameSink() { |
- DCHECK(!surface_factory_); |
+ DCHECK(!bound_to_proxy_); |
DCHECK(!compositor_frame_sink_request_pending_); |
compositor_frame_sink_request_pending_ = true; |
@@ -278,9 +282,10 @@ void BlimpCompositor::DidCommitAndDrawFrame() { |
for (auto it = pending_commit_trackers_.begin(); |
it != pending_commit_trackers_.end();) { |
if (--it->first == 0) { |
- if (surface_factory_) |
+ if (bound_to_proxy_) { |
surface_factory_->RequestCopyOfSurface(local_frame_id_, |
std::move(it->second)); |
+ } |
it = pending_commit_trackers_.erase(it); |
} else { |
++it; |
@@ -371,8 +376,8 @@ const base::WeakPtr<cc::InputHandler>& BlimpCompositor::GetInputHandler() { |
void BlimpCompositor::OnContextProvidersCreated( |
const scoped_refptr<cc::ContextProvider>& compositor_context_provider, |
const scoped_refptr<cc::ContextProvider>& worker_context_provider) { |
- DCHECK(!surface_factory_) << "Any connection to the old CompositorFrameSink " |
- "should have been destroyed"; |
+ DCHECK(!bound_to_proxy_) << "Any connection to the old CompositorFrameSink " |
+ "should have been destroyed"; |
// Make sure we still have a host and we're still expecting a |
// CompositorFrameSink. This can happen if the host dies while the request is |
@@ -400,16 +405,15 @@ void BlimpCompositor::OnContextProvidersCreated( |
void BlimpCompositor::BindToProxyClient( |
base::WeakPtr<BlimpCompositorFrameSinkProxyClient> proxy_client) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(!surface_factory_); |
+ DCHECK(!bound_to_proxy_); |
+ bound_to_proxy_ = true; |
proxy_client_ = proxy_client; |
- surface_factory_ = base::MakeUnique<cc::SurfaceFactory>( |
- frame_sink_id_, GetEmbedderDeps()->GetSurfaceManager(), this); |
} |
void BlimpCompositor::SubmitCompositorFrame(cc::CompositorFrame frame) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(surface_factory_); |
+ DCHECK(bound_to_proxy_); |
cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
gfx::Size surface_size = root_pass->output_rect.size(); |
@@ -451,7 +455,6 @@ void BlimpCompositor::SubmitCompositorFrame(cc::CompositorFrame frame) { |
} |
void BlimpCompositor::SubmitCompositorFrameAck() { |
- DCHECK(surface_factory_); |
compositor_dependencies_->GetCompositorTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&BlimpCompositorFrameSinkProxyClient::SubmitCompositorFrameAck, |
@@ -465,16 +468,17 @@ void BlimpCompositor::MakeCopyRequestOnNextSwap( |
void BlimpCompositor::UnbindProxyClient() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(surface_factory_); |
+ DCHECK(bound_to_proxy_); |
DestroyDelegatedContent(); |
- surface_factory_.reset(); |
+ surface_factory_->Reset(); |
+ bound_to_proxy_ = false; |
proxy_client_ = nullptr; |
} |
void BlimpCompositor::ReturnResources( |
const cc::ReturnedResourceArray& resources) { |
- DCHECK(surface_factory_); |
+ DCHECK(bound_to_proxy_); |
compositor_dependencies_->GetCompositorTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind( |
@@ -523,6 +527,7 @@ void BlimpCompositor::DestroyDelegatedContent() { |
std::unique_ptr<cc::LayerTreeHostInProcess> |
BlimpCompositor::CreateLayerTreeHost() { |
+ DCHECK(animation_host_); |
std::unique_ptr<cc::LayerTreeHostInProcess> host; |
cc::LayerTreeHostInProcess::InitParams params; |
@@ -537,8 +542,7 @@ BlimpCompositor::CreateLayerTreeHost() { |
cc::LayerTreeSettings* settings = |
compositor_dependencies_->GetLayerTreeSettings(); |
params.settings = settings; |
- |
- params.animation_host = cc::AnimationHost::CreateMainInstance(); |
+ params.mutator_host = animation_host_.get(); |
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner = |
compositor_dependencies_->GetCompositorTaskRunner(); |
@@ -560,7 +564,6 @@ void BlimpCompositor::DestroyLayerTreeHost() { |
// Tear down the output surface connection with the old LayerTreeHost |
// instance. |
DestroyDelegatedContent(); |
- surface_factory_.reset(); |
// Destroy the old LayerTreeHost state. |
host_.reset(); |