| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "content/renderer/android/synchronous_compositor_proxy.h" |
| 6 |
| 7 #include "base/auto_reset.h" |
| 8 #include "content/common/android/sync_compositor_messages.h" |
| 9 #include "content/common/cc_messages.h" |
| 10 #include "ipc/ipc_message.h" |
| 11 #include "ipc/ipc_sender.h" |
| 12 #include "ui/events/latency_info.h" |
| 13 |
| 14 namespace content { |
| 15 |
| 16 SynchronousCompositorProxy::SynchronousCompositorProxy( |
| 17 int routing_id, |
| 18 IPC::Sender* sender, |
| 19 SynchronousCompositorOutputSurface* output_surface, |
| 20 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, |
| 21 SynchronousInputHandlerProxy* input_handler_proxy, |
| 22 InputHandlerManagerClient::Handler* handler) |
| 23 : routing_id_(routing_id), |
| 24 sender_(sender), |
| 25 output_surface_(output_surface), |
| 26 begin_frame_source_(begin_frame_source), |
| 27 input_handler_proxy_(input_handler_proxy), |
| 28 input_handler_(handler), |
| 29 inside_receive_(false), |
| 30 bytes_limit_(0u), |
| 31 version_(0u), |
| 32 page_scale_factor_(0.f), |
| 33 min_page_scale_factor_(0.f), |
| 34 max_page_scale_factor_(0.f), |
| 35 need_animate_scroll_(false), |
| 36 need_invalidate_(false), |
| 37 need_begin_frame_(false), |
| 38 did_activate_pending_tree_(false) { |
| 39 DCHECK(output_surface_); |
| 40 DCHECK(begin_frame_source_); |
| 41 DCHECK(input_handler_proxy_); |
| 42 DCHECK(input_handler_); |
| 43 output_surface_->SetSyncClient(this); |
| 44 output_surface_->SetTreeActivationCallback( |
| 45 base::Bind(&SynchronousCompositorProxy::DidActivatePendingTree, |
| 46 base::Unretained(this))); |
| 47 begin_frame_source_->SetClient(this); |
| 48 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); |
| 49 } |
| 50 |
| 51 SynchronousCompositorProxy::~SynchronousCompositorProxy() { |
| 52 output_surface_->SetSyncClient(nullptr); |
| 53 output_surface_->SetTreeActivationCallback(base::Closure()); |
| 54 begin_frame_source_->SetClient(nullptr); |
| 55 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr); |
| 56 } |
| 57 |
| 58 void SynchronousCompositorProxy::SetNeedsSynchronousAnimateInput() { |
| 59 need_animate_scroll_ = true; |
| 60 Invalidate(); |
| 61 } |
| 62 |
| 63 void SynchronousCompositorProxy::UpdateRootLayerState( |
| 64 const gfx::ScrollOffset& total_scroll_offset, |
| 65 const gfx::ScrollOffset& max_scroll_offset, |
| 66 const gfx::SizeF& scrollable_size, |
| 67 float page_scale_factor, |
| 68 float min_page_scale_factor, |
| 69 float max_page_scale_factor) { |
| 70 if (total_scroll_offset_ != total_scroll_offset || |
| 71 max_scroll_offset_ != max_scroll_offset || |
| 72 scrollable_size_ != scrollable_size || |
| 73 page_scale_factor_ != page_scale_factor || |
| 74 min_page_scale_factor_ != min_page_scale_factor || |
| 75 max_page_scale_factor_ != max_page_scale_factor) { |
| 76 total_scroll_offset_ = total_scroll_offset; |
| 77 max_scroll_offset_ = max_scroll_offset; |
| 78 scrollable_size_ = scrollable_size; |
| 79 page_scale_factor_ = page_scale_factor; |
| 80 min_page_scale_factor_ = min_page_scale_factor; |
| 81 max_page_scale_factor_ = max_page_scale_factor; |
| 82 |
| 83 SendAsyncRendererStateIfNeeded(); |
| 84 } |
| 85 } |
| 86 |
| 87 void SynchronousCompositorProxy::OnNeedsBeginFramesChange( |
| 88 bool needs_begin_frames) { |
| 89 if (need_begin_frame_ == needs_begin_frames) |
| 90 return; |
| 91 need_begin_frame_ = needs_begin_frames; |
| 92 SendAsyncRendererStateIfNeeded(); |
| 93 } |
| 94 |
| 95 void SynchronousCompositorProxy::Invalidate() { |
| 96 need_invalidate_ = true; |
| 97 SendAsyncRendererStateIfNeeded(); |
| 98 } |
| 99 |
| 100 void SynchronousCompositorProxy::DidActivatePendingTree() { |
| 101 did_activate_pending_tree_ = true; |
| 102 SendAsyncRendererStateIfNeeded(); |
| 103 DeliverMessages(); |
| 104 } |
| 105 |
| 106 void SynchronousCompositorProxy::DeliverMessages() { |
| 107 ScopedVector<IPC::Message> messages; |
| 108 output_surface_->GetMessagesToDeliver(&messages); |
| 109 for (auto* message : messages) { |
| 110 Send(message); |
| 111 } |
| 112 messages.weak_clear(); // Don't double delete. |
| 113 } |
| 114 |
| 115 void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() { |
| 116 if (inside_receive_) |
| 117 return; |
| 118 SyncCompositorCommonRendererParams params; |
| 119 PopulateCommonParams(¶ms); |
| 120 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); |
| 121 } |
| 122 |
| 123 void SynchronousCompositorProxy::PopulateCommonParams( |
| 124 SyncCompositorCommonRendererParams* params) { |
| 125 params->version = ++version_; |
| 126 params->total_scroll_offset = total_scroll_offset_; |
| 127 params->max_scroll_offset = max_scroll_offset_; |
| 128 params->scrollable_size = scrollable_size_; |
| 129 params->page_scale_factor = page_scale_factor_; |
| 130 params->min_page_scale_factor = min_page_scale_factor_; |
| 131 params->max_page_scale_factor = max_page_scale_factor_; |
| 132 params->need_animate_scroll = need_animate_scroll_; |
| 133 params->need_invalidate = need_invalidate_; |
| 134 params->need_begin_frame = need_begin_frame_; |
| 135 params->did_activate_pending_tree = did_activate_pending_tree_; |
| 136 |
| 137 need_invalidate_ = false; |
| 138 did_activate_pending_tree_ = false; |
| 139 } |
| 140 |
| 141 void SynchronousCompositorProxy::OnMessageReceived( |
| 142 const IPC::Message& message) { |
| 143 DCHECK(!inside_receive_); |
| 144 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
| 145 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) |
| 146 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) |
| 147 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
| 148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
| 149 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
| 150 IPC_END_MESSAGE_MAP() |
| 151 } |
| 152 |
| 153 bool SynchronousCompositorProxy::Send(IPC::Message* message) { |
| 154 return sender_->Send(message); |
| 155 } |
| 156 |
| 157 void SynchronousCompositorProxy::HandleInputEvent( |
| 158 const SyncCompositorCommonBrowserParams& common_params, |
| 159 const blink::WebInputEvent* event, |
| 160 SyncCompositorCommonRendererParams* common_renderer_params, |
| 161 InputEventAckState* ack) { |
| 162 ProcessCommonParams(common_params); |
| 163 DCHECK(!input_handler_->is_null()); |
| 164 ui::LatencyInfo latency; |
| 165 *ack = input_handler_->Run(routing_id_, event, &latency); |
| 166 PopulateCommonParams(common_renderer_params); |
| 167 } |
| 168 |
| 169 void SynchronousCompositorProxy::BeginFrame( |
| 170 const SyncCompositorCommonBrowserParams& common_params, |
| 171 const cc::BeginFrameArgs& args, |
| 172 SyncCompositorCommonRendererParams* common_renderer_params) { |
| 173 ProcessCommonParams(common_params); |
| 174 if (need_begin_frame_) { |
| 175 begin_frame_source_->BeginFrame(args); |
| 176 } |
| 177 PopulateCommonParams(common_renderer_params); |
| 178 } |
| 179 |
| 180 void SynchronousCompositorProxy::DemandDrawHw( |
| 181 const SyncCompositorCommonBrowserParams& common_params, |
| 182 const SyncCompositorDemandDrawHwParams& params, |
| 183 SyncCompositorCommonRendererParams* common_renderer_params, |
| 184 cc::CompositorFrame* frame) { |
| 185 DCHECK(frame); |
| 186 ProcessCommonParams(common_params); |
| 187 scoped_ptr<cc::CompositorFrame> frame_ptr = output_surface_->DemandDrawHw( |
| 188 params.surface_size, params.transform, params.viewport, params.clip, |
| 189 params.viewport_rect_for_tile_priority, |
| 190 params.transform_for_tile_priority); |
| 191 if (frame_ptr) { |
| 192 frame_ptr->AssignTo(frame); |
| 193 DeliverMessages(); |
| 194 } |
| 195 PopulateCommonParams(common_renderer_params); |
| 196 } |
| 197 |
| 198 void SynchronousCompositorProxy::OnComputeScroll( |
| 199 const SyncCompositorCommonBrowserParams& common_params, |
| 200 base::TimeTicks animation_time, |
| 201 SyncCompositorCommonRendererParams* common_renderer_params) { |
| 202 ProcessCommonParams(common_params); |
| 203 if (need_animate_scroll_) { |
| 204 need_animate_scroll_ = false; |
| 205 input_handler_proxy_->SynchronouslyAnimate(animation_time); |
| 206 } |
| 207 PopulateCommonParams(common_renderer_params); |
| 208 } |
| 209 |
| 210 void SynchronousCompositorProxy::ProcessCommonParams( |
| 211 const SyncCompositorCommonBrowserParams& common_params) { |
| 212 if (bytes_limit_ != common_params.bytes_limit) { |
| 213 bytes_limit_ = common_params.bytes_limit; |
| 214 output_surface_->SetMemoryPolicy(bytes_limit_); |
| 215 } |
| 216 if (total_scroll_offset_ != common_params.root_scroll_offset) { |
| 217 total_scroll_offset_ = common_params.root_scroll_offset; |
| 218 input_handler_proxy_->SynchronouslySetRootScrollOffset( |
| 219 total_scroll_offset_); |
| 220 } |
| 221 if (!common_params.ack.resources.empty()) { |
| 222 output_surface_->ReturnResources(common_params.ack); |
| 223 } |
| 224 } |
| 225 |
| 226 } // namespace content |
| OLD | NEW |