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

Side by Side Diff: content/browser/android/in_process/synchronous_compositor_impl.cc

Issue 817603002: cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix misc bugs introduced in last two patches Created 5 years, 10 months 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/android/in_process/synchronous_compositor_impl.h" 5 #include "content/browser/android/in_process/synchronous_compositor_impl.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 } 67 }
68 68
69 SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents) 69 SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents)
70 : compositor_client_(NULL), 70 : compositor_client_(NULL),
71 output_surface_(NULL), 71 output_surface_(NULL),
72 begin_frame_source_(nullptr), 72 begin_frame_source_(nullptr),
73 contents_(contents), 73 contents_(contents),
74 routing_id_(contents->GetRoutingID()), 74 routing_id_(contents->GetRoutingID()),
75 input_handler_(NULL), 75 input_handler_(NULL),
76 invoking_composite_(false), 76 invoking_composite_(false),
77 is_active_(false),
78 renderer_needs_begin_frames_(false),
77 weak_ptr_factory_(this) { 79 weak_ptr_factory_(this) {
78 DCHECK(contents); 80 DCHECK(contents);
79 DCHECK_NE(routing_id_, MSG_ROUTING_NONE); 81 DCHECK_NE(routing_id_, MSG_ROUTING_NONE);
80 SynchronousCompositorRegistry::GetInstance()->RegisterCompositor(routing_id_, 82 SynchronousCompositorRegistry::GetInstance()->RegisterCompositor(routing_id_,
81 this); 83 this);
82 } 84 }
83 85
84 SynchronousCompositorImpl::~SynchronousCompositorImpl() { 86 SynchronousCompositorImpl::~SynchronousCompositorImpl() {
85 SynchronousCompositorRegistry::GetInstance()->UnregisterCompositor( 87 SynchronousCompositorRegistry::GetInstance()->UnregisterCompositor(
86 routing_id_, this); 88 routing_id_, this);
(...skipping 26 matching lines...) Expand all
113 DCHECK(!output_surface_); 115 DCHECK(!output_surface_);
114 DCHECK(!begin_frame_source_); 116 DCHECK(!begin_frame_source_);
115 DCHECK(output_surface); 117 DCHECK(output_surface);
116 DCHECK(begin_frame_source); 118 DCHECK(begin_frame_source);
117 DCHECK(compositor_client_); 119 DCHECK(compositor_client_);
118 120
119 output_surface_ = output_surface; 121 output_surface_ = output_surface;
120 begin_frame_source_ = begin_frame_source; 122 begin_frame_source_ = begin_frame_source;
121 123
122 begin_frame_source_->SetCompositor(this); 124 begin_frame_source_->SetCompositor(this);
123 output_surface_->SetBeginFrameSource(begin_frame_source_); 125 output_surface_->SetCompositor(this);
126
124 output_surface_->SetTreeActivationCallback( 127 output_surface_->SetTreeActivationCallback(
125 base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree, 128 base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree,
126 weak_ptr_factory_.GetWeakPtr())); 129 weak_ptr_factory_.GetWeakPtr()));
127 NeedsBeginFramesChanged(); 130
131 OnNeedsBeginFramesChange(begin_frame_source_->NeedsBeginFrames());
boliu 2015/02/11 02:28:14 Move this to BFS::SetCompositor
132
128 compositor_client_->DidInitializeCompositor(this); 133 compositor_client_->DidInitializeCompositor(this);
129 } 134 }
130 135
131 void SynchronousCompositorImpl::DidDestroyRendererObjects() { 136 void SynchronousCompositorImpl::DidDestroyRendererObjects() {
132 DCHECK(output_surface_); 137 DCHECK(output_surface_);
133 DCHECK(begin_frame_source_); 138 DCHECK(begin_frame_source_);
134 139
135 begin_frame_source_->SetCompositor(nullptr); 140 begin_frame_source_->SetCompositor(nullptr);
136 output_surface_->SetBeginFrameSource(nullptr); 141 output_surface_->SetCompositor(nullptr);
137 if (compositor_client_) 142 if (compositor_client_)
138 compositor_client_->DidDestroyCompositor(this); 143 compositor_client_->DidDestroyCompositor(this);
139 compositor_client_ = nullptr; 144 compositor_client_ = nullptr;
140 output_surface_ = nullptr; 145 output_surface_ = nullptr;
141 begin_frame_source_ = nullptr; 146 begin_frame_source_ = nullptr;
142 } 147 }
143 148
144 void SynchronousCompositorImpl::NotifyDidDestroyCompositorToClient() { 149 void SynchronousCompositorImpl::NotifyDidDestroyCompositorToClient() {
145 if (compositor_client_) 150 if (compositor_client_)
146 compositor_client_->DidDestroyCompositor(this); 151 compositor_client_->DidDestroyCompositor(this);
(...skipping 29 matching lines...) Expand all
176 gfx::Rect viewport_rect_for_tile_priority, 181 gfx::Rect viewport_rect_for_tile_priority,
177 const gfx::Transform& transform_for_tile_priority) { 182 const gfx::Transform& transform_for_tile_priority) {
178 DCHECK(CalledOnValidThread()); 183 DCHECK(CalledOnValidThread());
179 DCHECK(output_surface_); 184 DCHECK(output_surface_);
180 DCHECK(!invoking_composite_); 185 DCHECK(!invoking_composite_);
181 DCHECK(compositor_client_); 186 DCHECK(compositor_client_);
182 DCHECK(begin_frame_source_); 187 DCHECK(begin_frame_source_);
183 188
184 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, 189 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_,
185 true); 190 true);
191
186 scoped_ptr<cc::CompositorFrame> frame = 192 scoped_ptr<cc::CompositorFrame> frame =
187 output_surface_->DemandDrawHw(surface_size, 193 output_surface_->DemandDrawHw(surface_size,
188 transform, 194 transform,
189 viewport, 195 viewport,
190 clip, 196 clip,
191 viewport_rect_for_tile_priority, 197 viewport_rect_for_tile_priority,
192 transform_for_tile_priority); 198 transform_for_tile_priority);
199
193 if (frame.get()) 200 if (frame.get())
194 UpdateFrameMetaData(frame->metadata); 201 UpdateFrameMetaData(frame->metadata);
195 202
196 compositor_client_->SetContinuousInvalidate(
197 begin_frame_source_->NeedsBeginFrames());
198
199 return frame.Pass(); 203 return frame.Pass();
200 } 204 }
201 205
202 void SynchronousCompositorImpl::ReturnResources( 206 void SynchronousCompositorImpl::ReturnResources(
203 const cc::CompositorFrameAck& frame_ack) { 207 const cc::CompositorFrameAck& frame_ack) {
204 DCHECK(CalledOnValidThread()); 208 DCHECK(CalledOnValidThread());
205 output_surface_->ReturnResources(frame_ack); 209 output_surface_->ReturnResources(frame_ack);
206 } 210 }
207 211
208 bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) { 212 bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
209 DCHECK(CalledOnValidThread()); 213 DCHECK(CalledOnValidThread());
210 DCHECK(output_surface_); 214 DCHECK(output_surface_);
211 DCHECK(!invoking_composite_); 215 DCHECK(!invoking_composite_);
212 DCHECK(compositor_client_); 216 DCHECK(compositor_client_);
213 DCHECK(begin_frame_source_); 217 DCHECK(begin_frame_source_);
214 218
215 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, 219 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_,
216 true); 220 true);
221
217 scoped_ptr<cc::CompositorFrame> frame = 222 scoped_ptr<cc::CompositorFrame> frame =
218 output_surface_->DemandDrawSw(canvas); 223 output_surface_->DemandDrawSw(canvas);
224
219 if (frame.get()) 225 if (frame.get())
220 UpdateFrameMetaData(frame->metadata); 226 UpdateFrameMetaData(frame->metadata);
221 227
222 compositor_client_->SetContinuousInvalidate(
223 begin_frame_source_->NeedsBeginFrames());
224
225 return !!frame.get(); 228 return !!frame.get();
226 } 229 }
227 230
228 void SynchronousCompositorImpl::UpdateFrameMetaData( 231 void SynchronousCompositorImpl::UpdateFrameMetaData(
229 const cc::CompositorFrameMetadata& frame_metadata) { 232 const cc::CompositorFrameMetadata& frame_metadata) {
230 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>( 233 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
231 contents_->GetRenderWidgetHostView()); 234 contents_->GetRenderWidgetHostView());
232 if (rwhv) 235 if (rwhv)
233 rwhv->SynchronousFrameMetadata(frame_metadata); 236 rwhv->SynchronousFrameMetadata(frame_metadata);
234 DeliverMessages(); 237 DeliverMessages();
235 } 238 }
236 239
237 void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) { 240 void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) {
238 DCHECK(CalledOnValidThread()); 241 DCHECK(CalledOnValidThread());
239 DCHECK(output_surface_); 242 DCHECK(output_surface_);
240 243
241 output_surface_->SetMemoryPolicy(bytes_limit); 244 output_surface_->SetMemoryPolicy(bytes_limit);
242 } 245 }
243 246
247 void SynchronousCompositorImpl::PostInvalidate() {
248 DCHECK(CalledOnValidThread());
249 DCHECK(compositor_client_);
250 compositor_client_->PostInvalidate();
251 }
252
244 void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset() { 253 void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset() {
245 if (input_handler_) 254 if (input_handler_)
246 input_handler_->OnRootLayerDelegatedScrollOffsetChanged(); 255 input_handler_->OnRootLayerDelegatedScrollOffsetChanged();
247 } 256 }
248 257
258 void SynchronousCompositorImpl::SetIsActive(bool is_active) {
259 is_active_ = is_active;
260 UpdateNeedsBeginFrames();
261 }
262
263 void SynchronousCompositorImpl::OnNeedsBeginFramesChange(
264 bool needs_begin_frames) {
265 renderer_needs_begin_frames_ = needs_begin_frames;
266 UpdateNeedsBeginFrames();
267 }
268
269 void SynchronousCompositorImpl::SendBeginFrame(cc::BeginFrameArgs args) {
270 DCHECK(begin_frame_source_);
271 begin_frame_source_->SendBeginFrameOnAnimate(args);
272 }
273
274 void SynchronousCompositorImpl::SendBeginFrameOnDraw() {
275 DCHECK(begin_frame_source_);
276 begin_frame_source_->SendBeginFrameOnDraw();
277 }
278
279 void SynchronousCompositorImpl::UpdateNeedsBeginFrames() {
280 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
boliu 2015/02/11 02:28:14 nts and general comment I guess: should check life
281 contents_->GetRenderWidgetHostView());
282 if (rwhv)
283 rwhv->OnSetNeedsBeginFrames(is_active_ && renderer_needs_begin_frames_);
284 }
285
249 void SynchronousCompositorImpl::SetInputHandler( 286 void SynchronousCompositorImpl::SetInputHandler(
250 cc::InputHandler* input_handler) { 287 cc::InputHandler* input_handler) {
251 DCHECK(CalledOnValidThread()); 288 DCHECK(CalledOnValidThread());
252 289
253 if (input_handler_) 290 if (input_handler_)
254 input_handler_->SetRootLayerScrollOffsetDelegate(NULL); 291 input_handler_->SetRootLayerScrollOffsetDelegate(NULL);
255 292
256 input_handler_ = input_handler; 293 input_handler_ = input_handler;
257 294
258 if (input_handler_) 295 if (input_handler_)
259 input_handler_->SetRootLayerScrollOffsetDelegate(this); 296 input_handler_->SetRootLayerScrollOffsetDelegate(this);
260 } 297 }
261 298
262 void SynchronousCompositorImpl::DidOverscroll( 299 void SynchronousCompositorImpl::DidOverscroll(
263 const DidOverscrollParams& params) { 300 const DidOverscrollParams& params) {
264 if (compositor_client_) { 301 if (compositor_client_) {
265 compositor_client_->DidOverscroll(params.accumulated_overscroll, 302 compositor_client_->DidOverscroll(params.accumulated_overscroll,
266 params.latest_overscroll_delta, 303 params.latest_overscroll_delta,
267 params.current_fling_velocity); 304 params.current_fling_velocity);
268 } 305 }
269 } 306 }
270 307
271 void SynchronousCompositorImpl::DidStopFlinging() { 308 void SynchronousCompositorImpl::DidStopFlinging() {
272 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>( 309 RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
273 contents_->GetRenderWidgetHostView()); 310 contents_->GetRenderWidgetHostView());
274 if (rwhv) 311 if (rwhv)
275 rwhv->DidStopFlinging(); 312 rwhv->DidStopFlinging();
276 } 313 }
277 314
278 void SynchronousCompositorImpl::NeedsBeginFramesChanged() const {
279 DCHECK(CalledOnValidThread());
280 DCHECK(begin_frame_source_);
281 if (invoking_composite_)
282 return;
283
284 if (compositor_client_) {
285 compositor_client_->SetContinuousInvalidate(
286 begin_frame_source_->NeedsBeginFrames());
287 }
288 }
289
290 InputEventAckState SynchronousCompositorImpl::HandleInputEvent( 315 InputEventAckState SynchronousCompositorImpl::HandleInputEvent(
291 const blink::WebInputEvent& input_event) { 316 const blink::WebInputEvent& input_event) {
292 DCHECK(CalledOnValidThread()); 317 DCHECK(CalledOnValidThread());
293 return g_factory.Get().synchronous_input_event_filter()->HandleInputEvent( 318 return g_factory.Get().synchronous_input_event_filter()->HandleInputEvent(
294 contents_->GetRoutingID(), input_event); 319 contents_->GetRoutingID(), input_event);
295 } 320 }
296 321
297 void SynchronousCompositorImpl::DeliverMessages() { 322 void SynchronousCompositorImpl::DeliverMessages() {
298 ScopedVector<IPC::Message> messages; 323 ScopedVector<IPC::Message> messages;
299 output_surface_->GetMessagesToDeliver(&messages); 324 output_surface_->GetMessagesToDeliver(&messages);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 g_factory.Get(); // Ensure it's initialized. 389 g_factory.Get(); // Ensure it's initialized.
365 SynchronousCompositorImpl::CreateForWebContents(contents); 390 SynchronousCompositorImpl::CreateForWebContents(contents);
366 } 391 }
367 SynchronousCompositorImpl* instance = 392 SynchronousCompositorImpl* instance =
368 SynchronousCompositorImpl::FromWebContents(contents); 393 SynchronousCompositorImpl::FromWebContents(contents);
369 DCHECK(instance); 394 DCHECK(instance);
370 instance->SetClient(client); 395 instance->SetClient(client);
371 } 396 }
372 397
373 } // namespace content 398 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698