Chromium Code Reviews| Index: content/renderer/android/synchronous_compositor_proxy.cc |
| diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc |
| index 820b577cf0448036d65fe554a9df45063fc4c936..4ecfdff1028a4e37565653883432c04887277cf1 100644 |
| --- a/content/renderer/android/synchronous_compositor_proxy.cc |
| +++ b/content/renderer/android/synchronous_compositor_proxy.cc |
| @@ -24,19 +24,18 @@ namespace content { |
| SynchronousCompositorProxy::SynchronousCompositorProxy( |
| int routing_id, |
| IPC::Sender* sender, |
| - SynchronousCompositorOutputSurface* output_surface, |
| SynchronousCompositorExternalBeginFrameSource* begin_frame_source, |
| ui::SynchronousInputHandlerProxy* input_handler_proxy, |
| InputHandlerManagerClient::Handler* handler) |
| : routing_id_(routing_id), |
| sender_(sender), |
| - output_surface_(output_surface), |
| begin_frame_source_(begin_frame_source), |
| input_handler_proxy_(input_handler_proxy), |
| input_handler_(handler), |
| use_in_process_zero_copy_software_draw_( |
| base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kSingleProcess)), |
| + output_surface_(nullptr), |
| inside_receive_(false), |
| hardware_draw_reply_(nullptr), |
| software_draw_reply_(nullptr), |
| @@ -49,25 +48,36 @@ SynchronousCompositorProxy::SynchronousCompositorProxy( |
| need_invalidate_count_(0u), |
| need_begin_frame_(false), |
| did_activate_pending_tree_count_(0u) { |
| - DCHECK(output_surface_); |
| DCHECK(begin_frame_source_); |
| DCHECK(input_handler_proxy_); |
| DCHECK(input_handler_); |
| - output_surface_->SetSyncClient(this); |
| - output_surface_->SetTreeActivationCallback( |
| - base::Bind(&SynchronousCompositorProxy::DidActivatePendingTree, |
| - base::Unretained(this))); |
| begin_frame_source_->SetClient(this); |
| input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); |
| } |
| SynchronousCompositorProxy::~SynchronousCompositorProxy() { |
| - output_surface_->SetSyncClient(nullptr); |
| - output_surface_->SetTreeActivationCallback(base::Closure()); |
| + SetOutputSurface(nullptr); |
| begin_frame_source_->SetClient(nullptr); |
| input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr); |
| } |
| +void SynchronousCompositorProxy::SetOutputSurface( |
| + SynchronousCompositorOutputSurface* output_surface) { |
| + DCHECK_NE(output_surface_, output_surface); |
| + if (output_surface_) { |
| + output_surface_->SetSyncClient(nullptr); |
| + output_surface_->SetTreeActivationCallback(base::Closure()); |
| + } |
| + output_surface_ = output_surface; |
| + if (output_surface_) { |
| + output_surface_->SetSyncClient(this); |
| + output_surface_->SetTreeActivationCallback( |
| + base::Bind(&SynchronousCompositorProxy::DidActivatePendingTree, |
| + base::Unretained(this))); |
| + output_surface_->SetMemoryPolicy(bytes_limit_); |
|
Tobias Sargeant
2016/03/23 10:10:55
I guess previously we would never have called SetM
boliu
2016/03/23 15:52:53
Same behavior either way.
|
| + } |
| +} |
| + |
| void SynchronousCompositorProxy::SetNeedsSynchronousAnimateInput() { |
| need_animate_scroll_ = true; |
| Invalidate(); |
| @@ -117,6 +127,7 @@ void SynchronousCompositorProxy::DidActivatePendingTree() { |
| } |
| void SynchronousCompositorProxy::DeliverMessages() { |
| + DCHECK(output_surface_); |
| std::vector<scoped_ptr<IPC::Message>> messages; |
| output_surface_->GetMessagesToDeliver(&messages); |
| for (auto& msg : messages) { |
| @@ -206,7 +217,7 @@ void SynchronousCompositorProxy::DemandDrawHw( |
| inside_receive_ = true; |
| ProcessCommonParams(common_params); |
| - { |
| + if (output_surface_) { |
| base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( |
| &hardware_draw_reply_, reply_message); |
| output_surface_->DemandDrawHw(params.surface_size, params.transform, |
| @@ -302,7 +313,7 @@ void SynchronousCompositorProxy::DemandDrawSw( |
| DCHECK(!inside_receive_); |
| inside_receive_ = true; |
| ProcessCommonParams(common_params); |
| - { |
| + if (output_surface_) { |
| base::AutoReset<IPC::Message*> scoped_software_draw_reply( |
| &software_draw_reply_, reply_message); |
| if (use_in_process_zero_copy_software_draw_) { |
| @@ -325,6 +336,7 @@ void SynchronousCompositorProxy::DemandDrawSw( |
| void SynchronousCompositorProxy::DoDemandDrawSw( |
| const SyncCompositorDemandDrawSwParams& params) { |
| + DCHECK(output_surface_); |
| DCHECK(software_draw_shm_->zeroed); |
| software_draw_shm_->zeroed = false; |
| @@ -396,7 +408,8 @@ void SynchronousCompositorProxy::ProcessCommonParams( |
| const SyncCompositorCommonBrowserParams& common_params) { |
| if (bytes_limit_ != common_params.bytes_limit) { |
| bytes_limit_ = common_params.bytes_limit; |
| - output_surface_->SetMemoryPolicy(bytes_limit_); |
| + if (output_surface_) |
| + output_surface_->SetMemoryPolicy(bytes_limit_); |
| } |
| if (common_params.update_root_scroll_offset && |
| total_scroll_offset_ != common_params.root_scroll_offset) { |
| @@ -406,7 +419,7 @@ void SynchronousCompositorProxy::ProcessCommonParams( |
| } |
| begin_frame_source_->SetBeginFrameSourcePaused( |
| common_params.begin_frame_source_paused); |
| - if (!common_params.ack.resources.empty()) { |
| + if (output_surface_ && !common_params.ack.resources.empty()) { |
| output_surface_->ReturnResources( |
| common_params.output_surface_id_for_returned_resources, |
| common_params.ack); |