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

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: send FrameAct 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 "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 std::vector<IPC::Message*> released_messages;
110 messages.release(&released_messages);
111 for (size_t i = 0; i < released_messages.size(); ++i) {
112 Send(released_messages[i]);
113 released_messages[i] = nullptr;
114 }
dcheng 2015/11/04 09:47:41 Maybe just take advantage of ScopedVector<T>::weak
boliu 2015/11/04 16:52:05 Done.
115 }
116
117 void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() {
118 if (inside_receive_)
119 return;
120 SyncCompositorCommonRendererParams params;
121 ConstructCommonParams(&params);
122 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params));
123 }
124
125 void SynchronousCompositorProxy::ConstructCommonParams(
126 SyncCompositorCommonRendererParams* params) {
127 *params = SyncCompositorCommonRendererParams(
128 ++version_, total_scroll_offset_, max_scroll_offset_, scrollable_size_,
129 page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_,
130 need_animate_scroll_, need_invalidate_, need_begin_frame_,
131 did_activate_pending_tree_);
132 need_invalidate_ = false;
133 did_activate_pending_tree_ = false;
134 }
135
136 void SynchronousCompositorProxy::OnMessageReceived(
137 const IPC::Message& message) {
138 DCHECK(!inside_receive_);
139 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
140 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message)
141 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent)
142 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame)
143 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll)
144 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw)
145 IPC_END_MESSAGE_MAP()
146 }
147
148 bool SynchronousCompositorProxy::Send(IPC::Message* message) {
149 return sender_->Send(message);
150 }
151
152 void SynchronousCompositorProxy::HandleInputEvent(
153 const SyncCompositorCommonBrowserParams& common_params,
154 const blink::WebInputEvent* event,
155 SyncCompositorCommonRendererParams* common_renderer_params,
156 InputEventAckState* ack) {
157 ProcessCommonParams(common_params);
158 DCHECK(!input_handler_->is_null());
159 ui::LatencyInfo latency;
160 *ack = input_handler_->Run(routing_id_, event, &latency);
161 ConstructCommonParams(common_renderer_params);
162 }
163
164 void SynchronousCompositorProxy::BeginFrame(
165 const SyncCompositorCommonBrowserParams& common_params,
166 const cc::BeginFrameArgs& args,
167 SyncCompositorCommonRendererParams* common_renderer_params) {
168 ProcessCommonParams(common_params);
169 if (need_begin_frame_) {
170 begin_frame_source_->BeginFrame(args);
171 }
172 ConstructCommonParams(common_renderer_params);
173 }
174
175 void SynchronousCompositorProxy::DemandDrawHw(
176 const SyncCompositorCommonBrowserParams& common_params,
177 const SyncCompositorDemandDrawHwParams& params,
178 SyncCompositorCommonRendererParams* common_renderer_params,
179 cc::CompositorFrame* frame) {
180 DCHECK(frame);
181 ProcessCommonParams(common_params);
182 scoped_ptr<cc::CompositorFrame> frame_ptr = output_surface_->DemandDrawHw(
183 params.surface_size, params.transform, params.viewport, params.clip,
184 params.viewport_rect_for_tile_priority,
185 params.transform_for_tile_priority);
186 if (frame_ptr.get()) {
dcheng 2015/11/04 09:47:41 No .get()
boliu 2015/11/04 16:52:05 Done.
187 frame_ptr->AssignTo(frame);
188 DeliverMessages();
189 }
190 ConstructCommonParams(common_renderer_params);
191 }
192
193 void SynchronousCompositorProxy::OnComputeScroll(
194 const SyncCompositorCommonBrowserParams& common_params,
195 base::TimeTicks animation_time,
196 SyncCompositorCommonRendererParams* common_renderer_params) {
197 ProcessCommonParams(common_params);
198 if (need_animate_scroll_) {
199 need_animate_scroll_ = false;
200 input_handler_proxy_->SynchronouslyAnimate(animation_time);
201 }
202 ConstructCommonParams(common_renderer_params);
203 }
204
205 void SynchronousCompositorProxy::ProcessCommonParams(
206 const SyncCompositorCommonBrowserParams& common_params) {
207 if (bytes_limit_ != common_params.bytes_limit) {
208 bytes_limit_ = common_params.bytes_limit;
209 output_surface_->SetMemoryPolicy(bytes_limit_);
210 }
211 if (total_scroll_offset_ != common_params.root_scroll_offset) {
212 total_scroll_offset_ = common_params.root_scroll_offset;
213 input_handler_proxy_->SynchronouslySetRootScrollOffset(
214 total_scroll_offset_);
215 }
216 if (!common_params.ack.resources.empty()) {
217 output_surface_->ReturnResources(common_params.ack);
218 }
219 }
220
221 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698