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

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: dcheng review 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 for (size_t i = 0; i < messages.size(); ++i) {
dcheng 2015/11/04 18:24:29 Nit: I think this should work: for (auto* message
boliu 2015/11/04 18:35:32 Yep. Done
110 Send(messages[i]);
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(&params);
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
OLDNEW
« no previous file with comments | « content/renderer/android/synchronous_compositor_proxy.h ('k') | content/renderer/gpu/render_widget_compositor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698