Chromium Code Reviews| 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 "content/common/android/sync_compositor_messages.h" | |
| 8 #include "content/common/cc_messages.h" | |
| 9 #include "ipc/ipc_message.h" | |
| 10 #include "ipc/ipc_sender.h" | |
| 11 #include "ui/events/latency_info.h" | |
| 12 | |
| 13 namespace content { | |
| 14 | |
| 15 class SynchronousCompositorProxy::ScopedInsideReceive { | |
|
no sievers
2015/10/29 01:37:01
nit:: base::AutoReset<bool> scoped_inside_receive(
boliu
2015/10/29 04:24:44
Done
Can't remember why I didn't go with AutoRese
| |
| 16 public: | |
| 17 ScopedInsideReceive(SynchronousCompositorProxy* compositor) | |
| 18 : compositor_(compositor) { | |
| 19 DCHECK(!compositor_->inside_receive_); | |
| 20 compositor_->inside_receive_ = true; | |
| 21 } | |
| 22 ~ScopedInsideReceive() { | |
| 23 DCHECK(compositor_->inside_receive_); | |
| 24 compositor_->inside_receive_ = false; | |
| 25 } | |
| 26 | |
| 27 private: | |
| 28 SynchronousCompositorProxy* compositor_; | |
| 29 }; | |
| 30 | |
| 31 SynchronousCompositorProxy::SynchronousCompositorProxy( | |
| 32 int routing_id, | |
| 33 IPC::Sender* sender, | |
| 34 SynchronousCompositorOutputSurface* output_surface, | |
| 35 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, | |
| 36 SynchronousInputHandlerProxy* input_handler_proxy, | |
| 37 InputHandlerManagerClient::Handler* handler) | |
| 38 : routing_id_(routing_id), | |
| 39 sender_(sender), | |
| 40 output_surface_(output_surface), | |
| 41 begin_frame_source_(begin_frame_source), | |
| 42 input_handler_proxy_(input_handler_proxy), | |
| 43 input_handler_(handler), | |
| 44 inside_receive_(false), | |
| 45 bytes_limit_(0u), | |
| 46 version_(0u), | |
| 47 page_scale_factor_(0.f), | |
| 48 min_page_scale_factor_(0.f), | |
| 49 max_page_scale_factor_(0.f), | |
| 50 need_animate_scroll_(false), | |
| 51 need_invalidate_(false), | |
| 52 need_begin_frame_(false), | |
| 53 did_activate_pending_tree_(false) { | |
| 54 DCHECK(output_surface_); | |
| 55 DCHECK(begin_frame_source_); | |
| 56 DCHECK(input_handler_proxy_); | |
| 57 DCHECK(input_handler_); | |
| 58 output_surface_->SetSyncClient(this); | |
| 59 output_surface_->SetTreeActivationCallback( | |
| 60 base::Bind(&SynchronousCompositorProxy::DidActivatePendingTree, | |
| 61 base::Unretained(this))); | |
| 62 begin_frame_source_->SetClient(this); | |
| 63 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); | |
| 64 } | |
| 65 | |
| 66 SynchronousCompositorProxy::~SynchronousCompositorProxy() { | |
| 67 output_surface_->SetSyncClient(nullptr); | |
| 68 output_surface_->SetTreeActivationCallback(base::Closure()); | |
| 69 begin_frame_source_->SetClient(nullptr); | |
| 70 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr); | |
| 71 } | |
| 72 | |
| 73 void SynchronousCompositorProxy::SetNeedsSynchronousAnimateInput() { | |
| 74 need_animate_scroll_ = true; | |
| 75 Invalidate(); | |
| 76 } | |
| 77 | |
| 78 void SynchronousCompositorProxy::UpdateRootLayerState( | |
| 79 const gfx::ScrollOffset& total_scroll_offset, | |
| 80 const gfx::ScrollOffset& max_scroll_offset, | |
| 81 const gfx::SizeF& scrollable_size, | |
| 82 float page_scale_factor, | |
| 83 float min_page_scale_factor, | |
| 84 float max_page_scale_factor) { | |
| 85 if (total_scroll_offset_ != total_scroll_offset || | |
| 86 max_scroll_offset_ != max_scroll_offset || | |
| 87 scrollable_size_ != scrollable_size || | |
| 88 page_scale_factor_ != page_scale_factor || | |
| 89 min_page_scale_factor_ != min_page_scale_factor || | |
| 90 max_page_scale_factor_ != max_page_scale_factor) { | |
| 91 total_scroll_offset_ = total_scroll_offset; | |
| 92 max_scroll_offset_ = max_scroll_offset; | |
| 93 scrollable_size_ = scrollable_size; | |
| 94 page_scale_factor_ = page_scale_factor; | |
| 95 min_page_scale_factor_ = min_page_scale_factor; | |
| 96 max_page_scale_factor_ = max_page_scale_factor; | |
| 97 | |
| 98 if (!inside_receive_) { | |
| 99 CommonRendererParams params; | |
| 100 ConstructCommonParams(¶ms); | |
| 101 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); | |
| 102 } | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 void SynchronousCompositorProxy::OnNeedsBeginFramesChange( | |
| 107 bool needs_begin_frames) { | |
| 108 if (need_begin_frame_ == needs_begin_frames) | |
| 109 return; | |
| 110 need_begin_frame_ = needs_begin_frames; | |
| 111 if (!inside_receive_) { | |
|
no sievers
2015/10/29 01:37:01
can this all be one helper function?
boliu
2015/10/29 04:24:44
Done. I think I had a TODO for this :)
| |
| 112 CommonRendererParams params; | |
| 113 ConstructCommonParams(¶ms); | |
| 114 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 void SynchronousCompositorProxy::Invalidate() { | |
| 119 need_invalidate_ = true; | |
| 120 if (!inside_receive_) { | |
| 121 CommonRendererParams params; | |
| 122 ConstructCommonParams(¶ms); | |
| 123 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); | |
| 124 } | |
| 125 } | |
| 126 | |
| 127 void SynchronousCompositorProxy::DidActivatePendingTree() { | |
| 128 did_activate_pending_tree_ = true; | |
| 129 if (!inside_receive_) { | |
| 130 CommonRendererParams params; | |
| 131 ConstructCommonParams(¶ms); | |
| 132 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); | |
| 133 } | |
| 134 DeliverMessages(); | |
| 135 } | |
| 136 | |
| 137 void SynchronousCompositorProxy::DeliverMessages() { | |
| 138 ScopedVector<IPC::Message> messages; | |
| 139 output_surface_->GetMessagesToDeliver(&messages); | |
| 140 std::vector<IPC::Message*> released_messages; | |
| 141 messages.release(&released_messages); | |
| 142 for (size_t i = 0; i < released_messages.size(); ++i) { | |
| 143 Send(released_messages[i]); | |
| 144 released_messages[i] = nullptr; | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 void SynchronousCompositorProxy::ConstructCommonParams( | |
| 149 CommonRendererParams* params) { | |
| 150 *params = CommonRendererParams( | |
| 151 ++version_, total_scroll_offset_, max_scroll_offset_, scrollable_size_, | |
| 152 page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_, | |
| 153 need_animate_scroll_, need_invalidate_, need_begin_frame_, | |
| 154 did_activate_pending_tree_); | |
| 155 need_invalidate_ = false; | |
| 156 did_activate_pending_tree_ = false; | |
| 157 // TODO(boliu): double check begin frame? | |
| 158 } | |
| 159 | |
| 160 void SynchronousCompositorProxy::OnMessageReceived( | |
| 161 const IPC::Message& message) { | |
| 162 ScopedInsideReceive inside(this); | |
| 163 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) | |
| 164 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) | |
| 165 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) | |
| 166 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) | |
| 167 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) | |
| 168 IPC_END_MESSAGE_MAP() | |
| 169 } | |
| 170 | |
| 171 bool SynchronousCompositorProxy::Send(IPC::Message* message) { | |
| 172 return sender_->Send(message); | |
| 173 } | |
| 174 | |
| 175 void SynchronousCompositorProxy::HandleInputEvent( | |
| 176 const CommonBrowserParams& common_params, | |
| 177 const blink::WebInputEvent* event, | |
| 178 CommonRendererParams* common_renderer_params, | |
| 179 InputEventAckState* ack) { | |
| 180 ProcessCommonParams(common_params); | |
| 181 DCHECK(!input_handler_->is_null()); | |
| 182 ui::LatencyInfo latency; | |
| 183 *ack = input_handler_->Run(routing_id_, event, &latency); | |
| 184 ConstructCommonParams(common_renderer_params); | |
| 185 } | |
| 186 | |
| 187 void SynchronousCompositorProxy::BeginFrame( | |
| 188 const CommonBrowserParams& common_params, | |
| 189 const cc::BeginFrameArgs& args, | |
| 190 CommonRendererParams* common_renderer_params) { | |
| 191 ProcessCommonParams(common_params); | |
| 192 if (need_begin_frame_) { | |
| 193 begin_frame_source_->BeginFrame(args); | |
| 194 } | |
| 195 ConstructCommonParams(common_renderer_params); | |
| 196 } | |
| 197 | |
| 198 void SynchronousCompositorProxy::DemandDrawHw( | |
| 199 const CommonBrowserParams& common_params, | |
| 200 const DemandDrawHwParams& params, | |
| 201 CommonRendererParams* common_renderer_params, | |
| 202 cc::CompositorFrame* frame) { | |
| 203 DCHECK(frame); | |
| 204 ProcessCommonParams(common_params); | |
| 205 scoped_ptr<cc::CompositorFrame> frame_ptr = output_surface_->DemandDrawHw( | |
| 206 params.surface_size, params.transform, params.viewport, params.clip, | |
| 207 params.viewport_rect_for_tile_priority, | |
| 208 params.transform_for_tile_priority); | |
| 209 if (frame_ptr.get()) { | |
| 210 frame_ptr->AssignTo(frame); | |
| 211 DeliverMessages(); // TODO(boliu): software too. | |
| 212 } | |
| 213 ConstructCommonParams(common_renderer_params); | |
| 214 } | |
| 215 | |
| 216 void SynchronousCompositorProxy::OnComputeScroll( | |
| 217 const CommonBrowserParams& common_params, | |
| 218 base::TimeTicks animation_time, | |
| 219 CommonRendererParams* common_renderer_params) { | |
| 220 ProcessCommonParams(common_params); | |
| 221 if (need_animate_scroll_) { | |
| 222 need_animate_scroll_ = false; // TODO(boliu): helper | |
| 223 input_handler_proxy_->SynchronouslyAnimate(animation_time); | |
| 224 } | |
| 225 ConstructCommonParams(common_renderer_params); | |
| 226 } | |
| 227 | |
| 228 void SynchronousCompositorProxy::ProcessCommonParams( | |
| 229 const CommonBrowserParams& common_params) { | |
| 230 if (bytes_limit_ != common_params.bytes_limit) { | |
| 231 bytes_limit_ = common_params.bytes_limit; | |
| 232 output_surface_->SetMemoryPolicy(bytes_limit_); | |
| 233 } | |
| 234 if (total_scroll_offset_ != common_params.root_scroll_offset) { | |
| 235 total_scroll_offset_ = common_params.root_scroll_offset; | |
| 236 input_handler_proxy_->SynchronouslySetRootScrollOffset( | |
| 237 total_scroll_offset_); | |
| 238 } | |
| 239 if (!common_params.resources.empty()) { | |
| 240 cc::CompositorFrameAck frame_ack; | |
| 241 // TODO(boliu): mutable and swap? | |
| 242 frame_ack.resources.insert(frame_ack.resources.end(), | |
| 243 common_params.resources.begin(), | |
| 244 common_params.resources.end()); | |
| 245 output_surface_->ReturnResources(frame_ack); | |
| 246 } | |
| 247 } | |
| 248 | |
| 249 } // namespace content | |
| OLD | NEW |