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

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: fix win compile 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 const gfx::Size& surface_size,
50 const gfx::Transform& transform,
51 const gfx::Rect& viewport,
52 const gfx::Rect& clip,
53 const gfx::Rect& viewport_rect_for_tile_priority,
54 const gfx::Transform& transform_for_tile_priority) {
55 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
56 clip, viewport_rect_for_tile_priority,
57 transform_for_tile_priority);
58 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
59 SyncCompositorCommonBrowserParams common_browser_params;
60 PopulateCommonParams(&common_browser_params);
61 SyncCompositorCommonRendererParams common_renderer_params;
62 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
63 routing_id_, common_browser_params, params, &common_renderer_params,
64 frame.get()))) {
65 return nullptr;
66 }
67 ProcessCommonParams(common_renderer_params);
68 if (!frame->delegated_frame_data) {
69 // This can happen if compositor did not swap in this draw.
70 frame.reset();
71 }
72 if (frame)
73 UpdateFrameMetaData(frame->metadata);
74 return frame;
75 }
76
77 void SynchronousCompositorHost::UpdateFrameMetaData(
78 const cc::CompositorFrameMetadata& frame_metadata) {
79 rwhva_->SynchronousFrameMetadata(frame_metadata);
80 }
81
82 bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) {
83 // TODO(boliu): Implement.
84 return false;
85 }
86
87 void SynchronousCompositorHost::ReturnResources(
88 const cc::CompositorFrameAck& frame_ack) {
89 returned_resources_.insert(returned_resources_.end(),
90 frame_ack.resources.begin(),
91 frame_ack.resources.end());
92 }
93
94 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) {
95 if (bytes_limit_ == bytes_limit)
96 return;
97 bytes_limit_ = bytes_limit;
98 // TODO(boliu): Handle not in draw.
99 }
100
101 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset(
102 const gfx::ScrollOffset& root_offset) {
103 if (root_scroll_offset_ == root_offset)
104 return;
105 root_scroll_offset_ = root_offset;
106 // TODO(boliu): Handle async.
107 }
108
109 void SynchronousCompositorHost::SetIsActive(bool is_active) {
110 is_active_ = is_active;
111 UpdateNeedsBeginFrames();
112 }
113
114 void SynchronousCompositorHost::OnComputeScroll(
115 base::TimeTicks animation_time) {
116 if (!need_animate_scroll_)
117 return;
118 need_animate_scroll_ = false;
119
120 SyncCompositorCommonBrowserParams common_browser_params;
121 PopulateCommonParams(&common_browser_params);
122 SyncCompositorCommonRendererParams common_renderer_params;
123 if (!sender_->Send(new SyncCompositorMsg_ComputeScroll(
124 routing_id_, common_browser_params, animation_time,
125 &common_renderer_params))) {
126 return;
127 }
128 ProcessCommonParams(common_renderer_params);
129 }
130
131 InputEventAckState SynchronousCompositorHost::HandleInputEvent(
132 const blink::WebInputEvent& input_event) {
133 SyncCompositorCommonBrowserParams common_browser_params;
134 PopulateCommonParams(&common_browser_params);
135 SyncCompositorCommonRendererParams common_renderer_params;
136 InputEventAckState ack = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
137 if (!sender_->Send(new SyncCompositorMsg_HandleInputEvent(
138 routing_id_, common_browser_params, &input_event,
139 &common_renderer_params, &ack))) {
140 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
141 }
142 ProcessCommonParams(common_renderer_params);
143 return ack;
144 }
145
146 void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) {
147 if (!is_active_ || !need_begin_frame_)
148 return;
149
150 SyncCompositorCommonBrowserParams common_browser_params;
151 PopulateCommonParams(&common_browser_params);
152 SyncCompositorCommonRendererParams common_renderer_params;
153 if (!sender_->Send(
154 new SyncCompositorMsg_BeginFrame(routing_id_, common_browser_params,
155 args, &common_renderer_params))) {
156 return;
157 }
158 ProcessCommonParams(common_renderer_params);
159 }
160
161 void SynchronousCompositorHost::PopulateCommonParams(
162 SyncCompositorCommonBrowserParams* params) {
163 DCHECK(params);
164 DCHECK(params->ack.resources.empty());
165 params->bytes_limit = bytes_limit_;
166 params->root_scroll_offset = root_scroll_offset_;
167 params->ack.resources.swap(returned_resources_);
168 }
169
170 void SynchronousCompositorHost::ProcessCommonParams(
171 const SyncCompositorCommonRendererParams& params) {
172 // Ignore if |renderer_param_version_| is newer than |params.version|. This
173 // comparison takes into account when the unsigned int wraps.
174 if ((renderer_param_version_ - params.version) < 0x80000000) {
175 return;
176 }
177 renderer_param_version_ = params.version;
178 need_animate_scroll_ = params.need_animate_scroll;
179 if (need_begin_frame_ != params.need_begin_frame) {
180 need_begin_frame_ = params.need_begin_frame;
181 UpdateNeedsBeginFrames();
182 }
183 need_invalidate_ = need_invalidate_ || params.need_invalidate;
184 did_activate_pending_tree_ =
185 did_activate_pending_tree_ || params.did_activate_pending_tree;
186 root_scroll_offset_ = params.total_scroll_offset;
187
188 if (need_invalidate_) {
189 need_invalidate_ = false;
190 client_->PostInvalidate();
191 }
192
193 if (did_activate_pending_tree_) {
194 did_activate_pending_tree_ = false;
195 client_->DidUpdateContent();
196 }
197
198 // Ensure only valid values from compositor are sent to client.
199 // Compositor has page_scale_factor set to 0 before initialization, so check
200 // for that case here.
201 if (params.page_scale_factor) {
202 client_->UpdateRootLayerState(
203 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
204 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
205 params.scrollable_size, params.page_scale_factor,
206 params.min_page_scale_factor, params.max_page_scale_factor);
207 }
208 }
209
210 void SynchronousCompositorHost::UpdateNeedsBeginFrames() {
211 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_);
212 }
213
214 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/synchronous_compositor_host.h ('k') | content/browser/renderer_host/render_widget_host_view_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698