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

Side by Side Diff: content/browser/android/synchronous_compositor_host.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/browser/android/synchronous_compositor_host.h"
6
7 #include "base/containers/hash_tables.h"
8 #include "cc/output/compositor_frame_ack.h"
9 #include "content/browser/renderer_host/render_widget_host_view_android.h"
10 #include "content/browser/web_contents/web_contents_impl.h"
11 #include "content/common/android/sync_compositor_messages.h"
12 #include "content/public/browser/android/synchronous_compositor_client.h"
13 #include "content/public/browser/render_view_host.h"
14 #include "ipc/ipc_sender.h"
15
16 namespace content {
17
18 SynchronousCompositorHost::SynchronousCompositorHost(
19 RenderWidgetHostViewAndroid* rwhva,
20 SynchronousCompositorClient* client)
21 : rwhva_(rwhva),
22 client_(client),
23 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
24 sender_(rwhva_->GetRenderWidgetHost()),
25 is_active_(false),
26 bytes_limit_(0u),
27 renderer_param_version_(0u),
28 need_animate_scroll_(false),
29 need_invalidate_(false),
30 need_begin_frame_(false),
31 did_activate_pending_tree_(false) {
32 client_->DidInitializeCompositor(this);
33 }
34
35 SynchronousCompositorHost::~SynchronousCompositorHost() {
36 client_->DidDestroyCompositor(this);
37 }
38
39 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
40 bool handled = true;
41 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
42 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
43 IPC_MESSAGE_UNHANDLED(handled = false)
44 IPC_END_MESSAGE_MAP()
45 return handled;
46 }
47
48 scoped_ptr<cc::CompositorFrame> SynchronousCompositorHost::DemandDrawHw(
49 gfx::Size surface_size,
50 const gfx::Transform& transform,
51 gfx::Rect viewport,
52 gfx::Rect clip,
53 gfx::Rect viewport_rect_for_tile_priority,
54 const gfx::Transform& transform_for_tile_priority) {
55 DemandDrawHwParams params(surface_size, transform, viewport, clip,
56 viewport_rect_for_tile_priority,
57 transform_for_tile_priority);
58 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
59 CommonRendererParams common_renderer_params;
60 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
61 routing_id_, ConstructCommonParams(), params, &common_renderer_params,
62 frame.get()))) {
63 return nullptr;
64 }
65 ProcessCommonParams(common_renderer_params);
66 // TODO(boliu): move this to BVR
67 if (!frame->delegated_frame_data.get()) {
dcheng 2015/10/27 21:06:58 No .get()
boliu 2015/10/28 02:07:06 Done.
68 frame.reset();
69 }
70 if (frame.get())
dcheng 2015/10/27 21:06:58 Ditto, no .get()
boliu 2015/10/28 02:07:06 Done.
71 UpdateFrameMetaData(frame->metadata);
72 return frame.Pass();
dcheng 2015/10/27 21:06:58 return frame; should work
boliu 2015/10/28 02:07:06 Done.
73 }
74
75 void SynchronousCompositorHost::UpdateFrameMetaData(
76 const cc::CompositorFrameMetadata& frame_metadata) {
77 rwhva_->SynchronousFrameMetadata(frame_metadata);
78 }
79
80 bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) {
81 return false;
82 }
83
84 void SynchronousCompositorHost::ReturnResources(
85 const cc::CompositorFrameAck& frame_ack) {
86 returned_resources_.insert(returned_resources_.end(),
87 frame_ack.resources.begin(),
88 frame_ack.resources.end());
89 }
90
91 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) {
92 if (bytes_limit_ == bytes_limit)
93 return;
94 bytes_limit_ = bytes_limit;
95 // TODO(boliu): Handle not in draw?
96 }
97
98 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset(
99 const gfx::ScrollOffset& root_offset) {
100 if (root_scroll_offset_ == root_offset)
101 return;
102 root_scroll_offset_ = root_offset;
103 // TODO(boliu): Handle async.
104 }
105
106 void SynchronousCompositorHost::SetIsActive(bool is_active) {
107 is_active_ = is_active;
108 UpdateNeedsBeginFrames();
109 }
110
111 void SynchronousCompositorHost::OnComputeScroll(
112 base::TimeTicks animation_time) {
113 if (!need_animate_scroll_)
114 return;
115 need_animate_scroll_ = false;
116
117 CommonRendererParams common_renderer_params;
118 if (!sender_->Send(new SyncCompositorMsg_ComputeScroll(
119 routing_id_, ConstructCommonParams(), animation_time,
120 &common_renderer_params))) {
121 return;
122 }
123 ProcessCommonParams(common_renderer_params);
124 }
125
126 InputEventAckState SynchronousCompositorHost::HandleInputEvent(
127 const blink::WebInputEvent& input_event) {
128 CommonRendererParams common_renderer_params;
129 InputEventAckState ack = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
130 if (!sender_->Send(new SyncCompositorMsg_HandleInputEvent(
131 routing_id_, ConstructCommonParams(), &input_event,
132 &common_renderer_params, &ack))) {
133 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
134 }
135 ProcessCommonParams(common_renderer_params);
136 return ack;
137 }
138
139 void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) {
140 if (!is_active_ || !need_begin_frame_)
141 return;
142
143 CommonRendererParams common_renderer_params;
144 if (!sender_->Send(
145 new SyncCompositorMsg_BeginFrame(routing_id_, ConstructCommonParams(),
146 args, &common_renderer_params))) {
147 return;
148 }
149 ProcessCommonParams(common_renderer_params);
150 }
151
152 CommonBrowserParams SynchronousCompositorHost::ConstructCommonParams() {
153 CommonBrowserParams params(bytes_limit_, root_scroll_offset_);
154 params.resources.swap(returned_resources_);
155 DCHECK(returned_resources_.empty());
156 return params;
157 }
158
159 void SynchronousCompositorHost::ProcessCommonParams(
160 const CommonRendererParams& params) {
161 if ((renderer_param_version_ - params.version) < 0x80000000) {
dcheng 2015/10/27 21:06:58 What's the significance of 0x80000000? I think thi
boliu 2015/10/28 02:07:06 It's for comparing versions when the version can w
162 return;
163 }
164 renderer_param_version_ = params.version;
165 need_animate_scroll_ = params.need_animate_scroll;
166 if (need_begin_frame_ != params.need_begin_frame) {
167 need_begin_frame_ = params.need_begin_frame;
168 UpdateNeedsBeginFrames();
169 }
170 need_invalidate_ = need_invalidate_ || params.need_invalidate;
171 did_activate_pending_tree_ =
172 did_activate_pending_tree_ || params.did_activate_pending_tree;
173 root_scroll_offset_ = params.total_scroll_offset;
174
175 if (!client_)
176 return;
177 if (need_invalidate_) {
178 need_invalidate_ = false;
179 client_->PostInvalidate();
180 }
181
182 if (did_activate_pending_tree_) {
183 did_activate_pending_tree_ = false;
184 client_->DidUpdateContent();
185 }
186
187 // Make sure renderer side is initialized.
188 if (params.page_scale_factor) {
189 client_->UpdateRootLayerState(
190 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
191 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
192 params.scrollable_size, params.page_scale_factor,
193 params.min_page_scale_factor, params.max_page_scale_factor);
194 }
195 }
196
197 void SynchronousCompositorHost::UpdateNeedsBeginFrames() {
198 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_);
199 }
200
201 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698