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

Side by Side Diff: content/browser/android/synchronous_compositor_host.cc

Issue 1969263004: sync compositor: Remove begin frame source (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comment Created 4 years, 6 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 2015 The Chromium Authors. All rights reserved. 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 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/synchronous_compositor_host.h" 5 #include "content/browser/android/synchronous_compositor_host.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 bool async_input, 68 bool async_input,
69 bool use_in_proc_software_draw) 69 bool use_in_proc_software_draw)
70 : rwhva_(rwhva), 70 : rwhva_(rwhva),
71 client_(client), 71 client_(client),
72 ui_task_runner_( 72 ui_task_runner_(
73 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), 73 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
74 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), 74 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
75 sender_(rwhva_->GetRenderWidgetHost()), 75 sender_(rwhva_->GetRenderWidgetHost()),
76 async_input_(async_input), 76 async_input_(async_input),
77 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), 77 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw),
78 is_active_(false),
79 bytes_limit_(0u), 78 bytes_limit_(0u),
80 renderer_param_version_(0u), 79 renderer_param_version_(0u),
81 need_animate_scroll_(false), 80 need_animate_scroll_(false),
82 need_invalidate_count_(0u), 81 need_invalidate_count_(0u),
83 need_begin_frame_(false), 82 did_activate_pending_tree_count_(0u) {
84 did_activate_pending_tree_count_(0u),
85 weak_ptr_factory_(this) {
86 client_->DidInitializeCompositor(this); 83 client_->DidInitializeCompositor(this);
87 } 84 }
88 85
89 SynchronousCompositorHost::~SynchronousCompositorHost() { 86 SynchronousCompositorHost::~SynchronousCompositorHost() {
90 client_->DidDestroyCompositor(this); 87 client_->DidDestroyCompositor(this);
91 if (weak_ptr_factory_.HasWeakPtrs())
92 UpdateStateTask();
93 } 88 }
94 89
95 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { 90 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
96 bool handled = true; 91 bool handled = true;
97 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) 92 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
98 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated, 93 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated,
99 OutputSurfaceCreated) 94 OutputSurfaceCreated)
100 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) 95 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
101 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll) 96 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll)
102 IPC_MESSAGE_UNHANDLED(handled = false) 97 IPC_MESSAGE_UNHANDLED(handled = false)
(...skipping 10 matching lines...) Expand all
113 const gfx::Transform& transform, 108 const gfx::Transform& transform,
114 const gfx::Rect& viewport, 109 const gfx::Rect& viewport,
115 const gfx::Rect& clip, 110 const gfx::Rect& clip,
116 const gfx::Rect& viewport_rect_for_tile_priority, 111 const gfx::Rect& viewport_rect_for_tile_priority,
117 const gfx::Transform& transform_for_tile_priority) { 112 const gfx::Transform& transform_for_tile_priority) {
118 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, 113 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
119 clip, viewport_rect_for_tile_priority, 114 clip, viewport_rect_for_tile_priority,
120 transform_for_tile_priority); 115 transform_for_tile_priority);
121 SynchronousCompositor::Frame frame; 116 SynchronousCompositor::Frame frame;
122 frame.frame.reset(new cc::CompositorFrame); 117 frame.frame.reset(new cc::CompositorFrame);
123 SyncCompositorCommonBrowserParams common_browser_params;
124 PopulateCommonParams(&common_browser_params);
125 SyncCompositorCommonRendererParams common_renderer_params; 118 SyncCompositorCommonRendererParams common_renderer_params;
126 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( 119 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
127 routing_id_, common_browser_params, params, &common_renderer_params, 120 routing_id_, params, &common_renderer_params,
128 &frame.output_surface_id, frame.frame.get()))) { 121 &frame.output_surface_id, frame.frame.get()))) {
129 return SynchronousCompositor::Frame(); 122 return SynchronousCompositor::Frame();
130 } 123 }
131 ProcessCommonParams(common_renderer_params); 124 ProcessCommonParams(common_renderer_params);
132 if (!frame.frame->delegated_frame_data) { 125 if (!frame.frame->delegated_frame_data) {
133 // This can happen if compositor did not swap in this draw. 126 // This can happen if compositor did not swap in this draw.
134 frame.frame.reset(); 127 frame.frame.reset();
135 } 128 }
136 if (frame.frame) { 129 if (frame.frame) {
137 UpdateFrameMetaData(frame.frame->metadata); 130 UpdateFrameMetaData(frame.frame->metadata);
(...skipping 18 matching lines...) Expand all
156 SynchronousCompositorSetSkCanvas(nullptr); 149 SynchronousCompositorSetSkCanvas(nullptr);
157 } 150 }
158 151
159 private: 152 private:
160 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas); 153 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas);
161 }; 154 };
162 155
163 } 156 }
164 157
165 bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) { 158 bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) {
166 SyncCompositorCommonBrowserParams common_browser_params;
167 PopulateCommonParams(&common_browser_params);
168 SyncCompositorCommonRendererParams common_renderer_params; 159 SyncCompositorCommonRendererParams common_renderer_params;
169 bool success = false; 160 bool success = false;
170 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 161 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
171 ScopedSetSkCanvas set_sk_canvas(canvas); 162 ScopedSetSkCanvas set_sk_canvas(canvas);
172 SyncCompositorDemandDrawSwParams params; // Unused. 163 SyncCompositorDemandDrawSwParams params; // Unused.
173 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( 164 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
174 routing_id_, common_browser_params, params, &success, 165 routing_id_, params, &success, &common_renderer_params,
175 &common_renderer_params, frame.get()))) { 166 frame.get()))) {
176 return false; 167 return false;
177 } 168 }
178 if (!success) 169 if (!success)
179 return false; 170 return false;
180 ProcessCommonParams(common_renderer_params); 171 ProcessCommonParams(common_renderer_params);
181 UpdateFrameMetaData(frame->metadata); 172 UpdateFrameMetaData(frame->metadata);
182 return true; 173 return true;
183 } 174 }
184 175
185 class SynchronousCompositorHost::ScopedSendZeroMemory { 176 class SynchronousCompositorHost::ScopedSendZeroMemory {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 size_t stride = info.minRowBytes(); 216 size_t stride = info.minRowBytes();
226 size_t buffer_size = info.getSafeSize(stride); 217 size_t buffer_size = info.getSafeSize(stride);
227 if (!buffer_size) 218 if (!buffer_size)
228 return false; // Overflow. 219 return false; // Overflow.
229 220
230 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); 221 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size);
231 if (!software_draw_shm_) 222 if (!software_draw_shm_)
232 return false; 223 return false;
233 224
234 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 225 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
235 SyncCompositorCommonBrowserParams common_browser_params;
236 PopulateCommonParams(&common_browser_params);
237 SyncCompositorCommonRendererParams common_renderer_params; 226 SyncCompositorCommonRendererParams common_renderer_params;
238 bool success = false; 227 bool success = false;
239 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( 228 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
240 routing_id_, common_browser_params, params, &success, 229 routing_id_, params, &success, &common_renderer_params,
241 &common_renderer_params, frame.get()))) { 230 frame.get()))) {
242 return false; 231 return false;
243 } 232 }
244 ScopedSendZeroMemory send_zero_memory(this); 233 ScopedSendZeroMemory send_zero_memory(this);
245 if (!success) 234 if (!success)
246 return false; 235 return false;
247 236
248 ProcessCommonParams(common_renderer_params); 237 ProcessCommonParams(common_renderer_params);
249 UpdateFrameMetaData(frame->metadata); 238 UpdateFrameMetaData(frame->metadata);
250 239
251 SkBitmap bitmap; 240 SkBitmap bitmap;
(...skipping 28 matching lines...) Expand all
280 269
281 SyncCompositorSetSharedMemoryParams set_shm_params; 270 SyncCompositorSetSharedMemoryParams set_shm_params;
282 set_shm_params.buffer_size = buffer_size; 271 set_shm_params.buffer_size = buffer_size;
283 base::ProcessHandle renderer_process_handle = 272 base::ProcessHandle renderer_process_handle =
284 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); 273 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle();
285 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, 274 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle,
286 &set_shm_params.shm_handle)) { 275 &set_shm_params.shm_handle)) {
287 return; 276 return;
288 } 277 }
289 278
290 SyncCompositorCommonBrowserParams common_browser_params;
291 PopulateCommonParams(&common_browser_params);
292 bool success = false; 279 bool success = false;
293 SyncCompositorCommonRendererParams common_renderer_params; 280 SyncCompositorCommonRendererParams common_renderer_params;
294 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( 281 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory(
295 routing_id_, common_browser_params, set_shm_params, &success, 282 routing_id_, set_shm_params, &success, &common_renderer_params)) ||
296 &common_renderer_params)) ||
297 !success) { 283 !success) {
298 return; 284 return;
299 } 285 }
300 software_draw_shm_ = std::move(software_draw_shm); 286 software_draw_shm_ = std::move(software_draw_shm);
301 ProcessCommonParams(common_renderer_params); 287 ProcessCommonParams(common_renderer_params);
302 } 288 }
303 289
304 void SynchronousCompositorHost::SendZeroMemory() { 290 void SynchronousCompositorHost::SendZeroMemory() {
305 // No need to check return value. 291 // No need to check return value.
306 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); 292 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_));
(...skipping 19 matching lines...) Expand all
326 312
327 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset( 313 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset(
328 const gfx::ScrollOffset& root_offset) { 314 const gfx::ScrollOffset& root_offset) {
329 if (root_scroll_offset_ == root_offset) 315 if (root_scroll_offset_ == root_offset)
330 return; 316 return;
331 root_scroll_offset_ = root_offset; 317 root_scroll_offset_ = root_offset;
332 sender_->Send( 318 sender_->Send(
333 new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_)); 319 new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_));
334 } 320 }
335 321
336 void SynchronousCompositorHost::SendAsyncCompositorStateIfNeeded() {
337 if (weak_ptr_factory_.HasWeakPtrs())
338 return;
339
340 ui_task_runner_->PostTask(
341 FROM_HERE, base::Bind(&SynchronousCompositorHost::UpdateStateTask,
342 weak_ptr_factory_.GetWeakPtr()));
343 }
344
345 void SynchronousCompositorHost::UpdateStateTask() {
346 SyncCompositorCommonBrowserParams common_browser_params;
347 PopulateCommonParams(&common_browser_params);
348 sender_->Send(
349 new SyncCompositorMsg_UpdateState(routing_id_, common_browser_params));
350 DCHECK(!weak_ptr_factory_.HasWeakPtrs());
351 }
352
353 void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta, 322 void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta,
354 const gfx::Point& anchor) { 323 const gfx::Point& anchor) {
355 SyncCompositorCommonBrowserParams common_browser_params;
356 PopulateCommonParams(&common_browser_params);
357 SyncCompositorCommonRendererParams common_renderer_params; 324 SyncCompositorCommonRendererParams common_renderer_params;
358 if (!sender_->Send(new SyncCompositorMsg_ZoomBy( 325 if (!sender_->Send(new SyncCompositorMsg_ZoomBy(
359 routing_id_, common_browser_params, zoom_delta, anchor, 326 routing_id_, zoom_delta, anchor, &common_renderer_params))) {
360 &common_renderer_params))) {
361 return; 327 return;
362 } 328 }
363 ProcessCommonParams(common_renderer_params); 329 ProcessCommonParams(common_renderer_params);
364 } 330 }
365 331
366 void SynchronousCompositorHost::SetIsActive(bool is_active) {
367 if (is_active_ == is_active)
368 return;
369 is_active_ = is_active;
370 UpdateNeedsBeginFrames();
371 SendAsyncCompositorStateIfNeeded();
372 }
373
374 void SynchronousCompositorHost::OnComputeScroll( 332 void SynchronousCompositorHost::OnComputeScroll(
375 base::TimeTicks animation_time) { 333 base::TimeTicks animation_time) {
376 if (!need_animate_scroll_) 334 if (!need_animate_scroll_)
377 return; 335 return;
378 need_animate_scroll_ = false; 336 need_animate_scroll_ = false;
379 337
380 SyncCompositorCommonBrowserParams common_browser_params;
381 PopulateCommonParams(&common_browser_params);
382 SyncCompositorCommonRendererParams common_renderer_params; 338 SyncCompositorCommonRendererParams common_renderer_params;
383 sender_->Send(new SyncCompositorMsg_ComputeScroll( 339 sender_->Send(
384 routing_id_, common_browser_params, animation_time)); 340 new SyncCompositorMsg_ComputeScroll(routing_id_, animation_time));
385 } 341 }
386 342
387 InputEventAckState SynchronousCompositorHost::HandleInputEvent( 343 InputEventAckState SynchronousCompositorHost::HandleInputEvent(
388 const blink::WebInputEvent& input_event) { 344 const blink::WebInputEvent& input_event) {
389 if (async_input_) 345 if (async_input_)
390 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 346 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
391 SyncCompositorCommonBrowserParams common_browser_params;
392 PopulateCommonParams(&common_browser_params);
393 SyncCompositorCommonRendererParams common_renderer_params; 347 SyncCompositorCommonRendererParams common_renderer_params;
394 InputEventAckState ack = INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 348 InputEventAckState ack = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
395 if (!sender_->Send(new SyncCompositorMsg_HandleInputEvent( 349 if (!sender_->Send(new SyncCompositorMsg_HandleInputEvent(
396 routing_id_, common_browser_params, &input_event, 350 routing_id_, &input_event, &common_renderer_params, &ack))) {
397 &common_renderer_params, &ack))) {
398 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 351 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
399 } 352 }
400 ProcessCommonParams(common_renderer_params); 353 ProcessCommonParams(common_renderer_params);
401 return ack; 354 return ack;
402 } 355 }
403 356
404 void SynchronousCompositorHost::DidOverscroll( 357 void SynchronousCompositorHost::DidOverscroll(
405 const DidOverscrollParams& over_scroll_params) { 358 const DidOverscrollParams& over_scroll_params) {
406 client_->DidOverscroll(over_scroll_params.accumulated_overscroll, 359 client_->DidOverscroll(over_scroll_params.accumulated_overscroll,
407 over_scroll_params.latest_overscroll_delta, 360 over_scroll_params.latest_overscroll_delta,
408 over_scroll_params.current_fling_velocity); 361 over_scroll_params.current_fling_velocity);
409 } 362 }
410 363
411 void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) { 364 void SynchronousCompositorHost::DidSendBeginFrame() {
412 if (!is_active_)
413 return;
414
415 SyncCompositorCommonBrowserParams common_browser_params;
416 PopulateCommonParams(&common_browser_params);
417 SyncCompositorCommonRendererParams common_renderer_params; 365 SyncCompositorCommonRendererParams common_renderer_params;
418 if (!sender_->Send( 366 if (!sender_->Send(new SyncCompositorMsg_SynchronizeRendererState(
419 new SyncCompositorMsg_BeginFrame(routing_id_, common_browser_params, 367 routing_id_, &common_renderer_params))) {
420 args, &common_renderer_params))) {
421 return; 368 return;
422 } 369 }
423 ProcessCommonParams(common_renderer_params); 370 ProcessCommonParams(common_renderer_params);
424 } 371 }
425 372
426 void SynchronousCompositorHost::OutputSurfaceCreated() { 373 void SynchronousCompositorHost::OutputSurfaceCreated() {
427 // New output surface is not aware of state from Browser side. So need to 374 // New output surface is not aware of state from Browser side. So need to
428 // re-send all browser side state here. 375 // re-send all browser side state here.
429 sender_->Send( 376 sender_->Send(
430 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); 377 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_));
431 } 378 }
432 379
433 void SynchronousCompositorHost::OnOverScroll( 380 void SynchronousCompositorHost::OnOverScroll(
434 const SyncCompositorCommonRendererParams& params, 381 const SyncCompositorCommonRendererParams& params,
435 const DidOverscrollParams& over_scroll_params) { 382 const DidOverscrollParams& over_scroll_params) {
436 ProcessCommonParams(params); 383 ProcessCommonParams(params);
437 DidOverscroll(over_scroll_params); 384 DidOverscroll(over_scroll_params);
438 } 385 }
439 386
440 void SynchronousCompositorHost::PopulateCommonParams(
441 SyncCompositorCommonBrowserParams* params) {
442 DCHECK(params);
443 params->begin_frame_source_paused = !is_active_;
444
445 weak_ptr_factory_.InvalidateWeakPtrs();
446 }
447
448 void SynchronousCompositorHost::ProcessCommonParams( 387 void SynchronousCompositorHost::ProcessCommonParams(
449 const SyncCompositorCommonRendererParams& params) { 388 const SyncCompositorCommonRendererParams& params) {
450 // Ignore if |renderer_param_version_| is newer than |params.version|. This 389 // Ignore if |renderer_param_version_| is newer than |params.version|. This
451 // comparison takes into account when the unsigned int wraps. 390 // comparison takes into account when the unsigned int wraps.
452 if ((renderer_param_version_ - params.version) < 0x80000000) { 391 if ((renderer_param_version_ - params.version) < 0x80000000) {
453 return; 392 return;
454 } 393 }
455 renderer_param_version_ = params.version; 394 renderer_param_version_ = params.version;
456 need_animate_scroll_ = params.need_animate_scroll; 395 need_animate_scroll_ = params.need_animate_scroll;
457 if (need_begin_frame_ != params.need_begin_frame) {
458 need_begin_frame_ = params.need_begin_frame;
459 UpdateNeedsBeginFrames();
460 }
461 root_scroll_offset_ = params.total_scroll_offset; 396 root_scroll_offset_ = params.total_scroll_offset;
462 397
463 if (need_invalidate_count_ != params.need_invalidate_count) { 398 if (need_invalidate_count_ != params.need_invalidate_count) {
464 need_invalidate_count_ = params.need_invalidate_count; 399 need_invalidate_count_ = params.need_invalidate_count;
465 client_->PostInvalidate(); 400 client_->PostInvalidate();
466 } 401 }
467 402
468 if (did_activate_pending_tree_count_ != 403 if (did_activate_pending_tree_count_ !=
469 params.did_activate_pending_tree_count) { 404 params.did_activate_pending_tree_count) {
470 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count; 405 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count;
471 client_->DidUpdateContent(); 406 client_->DidUpdateContent();
472 } 407 }
473 408
474 // Ensure only valid values from compositor are sent to client. 409 // Ensure only valid values from compositor are sent to client.
475 // Compositor has page_scale_factor set to 0 before initialization, so check 410 // Compositor has page_scale_factor set to 0 before initialization, so check
476 // for that case here. 411 // for that case here.
477 if (params.page_scale_factor) { 412 if (params.page_scale_factor) {
478 client_->UpdateRootLayerState( 413 client_->UpdateRootLayerState(
479 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), 414 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
480 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), 415 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
481 params.scrollable_size, params.page_scale_factor, 416 params.scrollable_size, params.page_scale_factor,
482 params.min_page_scale_factor, params.max_page_scale_factor); 417 params.min_page_scale_factor, params.max_page_scale_factor);
483 } 418 }
484 } 419 }
485 420
486 void SynchronousCompositorHost::UpdateNeedsBeginFrames() {
487 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_);
488 }
489
490 } // namespace content 421 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698