Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: content/renderer/android/synchronous_compositor_proxy.cc

Issue 1408123005: Android Webview IPC-based sync compositing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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(&params);
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(&params);
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(&params);
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(&params);
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698