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

Side by Side Diff: android_webview/browser/browser_view_renderer.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 regression caused by last patch on dynamic pages 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "android_webview/browser/browser_view_renderer.h" 5 #include "android_webview/browser/browser_view_renderer.h"
6 6
7 #include "android_webview/browser/browser_view_renderer_client.h" 7 #include "android_webview/browser/browser_view_renderer_client.h"
8 #include "base/auto_reset.h" 8 #include "base/auto_reset.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 compositor_(NULL), 61 compositor_(NULL),
62 is_paused_(false), 62 is_paused_(false),
63 view_visible_(false), 63 view_visible_(false),
64 window_visible_(false), 64 window_visible_(false),
65 attached_to_window_(false), 65 attached_to_window_(false),
66 hardware_enabled_(false), 66 hardware_enabled_(false),
67 dip_scale_(0.0), 67 dip_scale_(0.0),
68 page_scale_factor_(1.0), 68 page_scale_factor_(1.0),
69 on_new_picture_enable_(false), 69 on_new_picture_enable_(false),
70 clear_view_(false), 70 clear_view_(false),
71 compositor_needs_continuous_invalidate_(false),
72 invalidate_after_composite_(false), 71 invalidate_after_composite_(false),
73 block_invalidates_(false), 72 block_invalidates_(false),
74 fallback_tick_pending_(false) { 73 fallback_tick_pending_(false) {
75 } 74 }
76 75
77 BrowserViewRenderer::~BrowserViewRenderer() { 76 BrowserViewRenderer::~BrowserViewRenderer() {
78 } 77 }
79 78
80 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { 79 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() {
81 return &shared_renderer_state_; 80 return &shared_renderer_state_;
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 gfx::Transform(), 233 gfx::Transform(),
235 viewport, 234 viewport,
236 clip, 235 clip,
237 viewport_rect_for_tile_priority, 236 viewport_rect_for_tile_priority,
238 transform_for_tile_priority); 237 transform_for_tile_priority);
239 if (frame.get()) 238 if (frame.get())
240 DidComposite(); 239 DidComposite();
241 return frame.Pass(); 240 return frame.Pass();
242 } 241 }
243 242
243 void BrowserViewRenderer::ForceCompositeHw() {
244 ReturnResourceFromParent();
245 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
246 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
247 if (frame.get()) {
248 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true);
249 }
250 }
251
244 void BrowserViewRenderer::UpdateParentDrawConstraints() { 252 void BrowserViewRenderer::UpdateParentDrawConstraints() {
245 // Post an invalidate if the parent draw constraints are stale and there is 253 // Post an invalidate if the parent draw constraints are stale and there is
246 // no pending invalidate. 254 // no pending invalidate.
247 bool needs_force_invalidate = 255 bool needs_force_invalidate =
248 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); 256 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI();
249 if (needs_force_invalidate || 257 if (needs_force_invalidate ||
250 !parent_draw_constraints_.Equals( 258 !parent_draw_constraints_.Equals(
251 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { 259 shared_renderer_state_.GetParentDrawConstraintsOnUI())) {
252 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); 260 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false);
253 EnsureContinuousInvalidation(true, needs_force_invalidate); 261 PostInvalidateWithFallback(needs_force_invalidate);
254 } 262 }
255 } 263 }
256 264
257 void BrowserViewRenderer::ReturnUnusedResource( 265 void BrowserViewRenderer::ReturnUnusedResource(
258 scoped_ptr<cc::CompositorFrame> frame) { 266 scoped_ptr<cc::CompositorFrame> frame) {
259 if (!frame.get()) 267 if (!frame.get())
260 return; 268 return;
261 269
262 cc::CompositorFrameAck frame_ack; 270 cc::CompositorFrameAck frame_ack;
263 cc::TransferableResource::ReturnResources( 271 cc::TransferableResource::ReturnResources(
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 324
317 void BrowserViewRenderer::ClearView() { 325 void BrowserViewRenderer::ClearView() {
318 TRACE_EVENT_INSTANT0("android_webview", 326 TRACE_EVENT_INSTANT0("android_webview",
319 "BrowserViewRenderer::ClearView", 327 "BrowserViewRenderer::ClearView",
320 TRACE_EVENT_SCOPE_THREAD); 328 TRACE_EVENT_SCOPE_THREAD);
321 if (clear_view_) 329 if (clear_view_)
322 return; 330 return;
323 331
324 clear_view_ = true; 332 clear_view_ = true;
325 // Always invalidate ignoring the compositor to actually clear the webview. 333 // Always invalidate ignoring the compositor to actually clear the webview.
326 EnsureContinuousInvalidation(true, false); 334 PostInvalidateWithFallback(false);
327 } 335 }
328 336
329 void BrowserViewRenderer::SetIsPaused(bool paused) { 337 void BrowserViewRenderer::SetIsPaused(bool paused) {
330 TRACE_EVENT_INSTANT1("android_webview", 338 TRACE_EVENT_INSTANT1("android_webview",
331 "BrowserViewRenderer::SetIsPaused", 339 "BrowserViewRenderer::SetIsPaused",
332 TRACE_EVENT_SCOPE_THREAD, 340 TRACE_EVENT_SCOPE_THREAD,
333 "paused", 341 "paused",
334 paused); 342 paused);
335 is_paused_ = paused; 343 is_paused_ = paused;
336 EnsureContinuousInvalidation(false, false); 344 UpdateCompositorIsActive();
boliu 2015/02/11 02:28:15 Hmm, for now when fallback tick is still not remov
337 } 345 }
338 346
339 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { 347 void BrowserViewRenderer::SetViewVisibility(bool view_visible) {
340 TRACE_EVENT_INSTANT1("android_webview", 348 TRACE_EVENT_INSTANT1("android_webview",
341 "BrowserViewRenderer::SetViewVisibility", 349 "BrowserViewRenderer::SetViewVisibility",
342 TRACE_EVENT_SCOPE_THREAD, 350 TRACE_EVENT_SCOPE_THREAD,
343 "view_visible", 351 "view_visible",
344 view_visible); 352 view_visible);
345 view_visible_ = view_visible; 353 view_visible_ = view_visible;
346 } 354 }
347 355
348 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { 356 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) {
349 TRACE_EVENT_INSTANT1("android_webview", 357 TRACE_EVENT_INSTANT1("android_webview",
350 "BrowserViewRenderer::SetWindowVisibility", 358 "BrowserViewRenderer::SetWindowVisibility",
351 TRACE_EVENT_SCOPE_THREAD, 359 TRACE_EVENT_SCOPE_THREAD,
352 "window_visible", 360 "window_visible",
353 window_visible); 361 window_visible);
354 window_visible_ = window_visible; 362 window_visible_ = window_visible;
355 EnsureContinuousInvalidation(false, false); 363 UpdateCompositorIsActive();
356 } 364 }
357 365
358 void BrowserViewRenderer::OnSizeChanged(int width, int height) { 366 void BrowserViewRenderer::OnSizeChanged(int width, int height) {
359 TRACE_EVENT_INSTANT2("android_webview", 367 TRACE_EVENT_INSTANT2("android_webview",
360 "BrowserViewRenderer::OnSizeChanged", 368 "BrowserViewRenderer::OnSizeChanged",
361 TRACE_EVENT_SCOPE_THREAD, 369 TRACE_EVENT_SCOPE_THREAD,
362 "width", 370 "width",
363 width, 371 width,
364 "height", 372 "height",
365 height); 373 height);
366 size_.SetSize(width, height); 374 size_.SetSize(width, height);
367 } 375 }
368 376
369 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { 377 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) {
370 TRACE_EVENT2("android_webview", 378 TRACE_EVENT2("android_webview",
371 "BrowserViewRenderer::OnAttachedToWindow", 379 "BrowserViewRenderer::OnAttachedToWindow",
372 "width", 380 "width",
373 width, 381 width,
374 "height", 382 "height",
375 height); 383 height);
376 attached_to_window_ = true; 384 attached_to_window_ = true;
377 size_.SetSize(width, height); 385 size_.SetSize(width, height);
386 UpdateCompositorIsActive();
378 } 387 }
379 388
380 void BrowserViewRenderer::OnDetachedFromWindow() { 389 void BrowserViewRenderer::OnDetachedFromWindow() {
381 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); 390 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow");
382 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); 391 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
383 attached_to_window_ = false; 392 attached_to_window_ = false;
384 DCHECK(!hardware_enabled_); 393 DCHECK(!hardware_enabled_);
394 UpdateCompositorIsActive();
385 } 395 }
386 396
387 void BrowserViewRenderer::ReleaseHardware() { 397 void BrowserViewRenderer::ReleaseHardware() {
388 DCHECK(hardware_enabled_); 398 DCHECK(hardware_enabled_);
389 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); 399 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
390 ReturnResourceFromParent(); 400 ReturnResourceFromParent();
391 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); 401 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI());
392 402
393 if (compositor_) { 403 if (compositor_) {
394 compositor_->ReleaseHwDraw(); 404 compositor_->ReleaseHwDraw();
(...skipping 11 matching lines...) Expand all
406 return gfx::Rect(client_->GetLocationOnScreen(), size_); 416 return gfx::Rect(client_->GetLocationOnScreen(), size_);
407 } 417 }
408 418
409 void BrowserViewRenderer::DidInitializeCompositor( 419 void BrowserViewRenderer::DidInitializeCompositor(
410 content::SynchronousCompositor* compositor) { 420 content::SynchronousCompositor* compositor) {
411 TRACE_EVENT0("android_webview", 421 TRACE_EVENT0("android_webview",
412 "BrowserViewRenderer::DidInitializeCompositor"); 422 "BrowserViewRenderer::DidInitializeCompositor");
413 DCHECK(compositor); 423 DCHECK(compositor);
414 DCHECK(!compositor_); 424 DCHECK(!compositor_);
415 compositor_ = compositor; 425 compositor_ = compositor;
426 UpdateCompositorIsActive();
416 } 427 }
417 428
418 void BrowserViewRenderer::DidDestroyCompositor( 429 void BrowserViewRenderer::DidDestroyCompositor(
419 content::SynchronousCompositor* compositor) { 430 content::SynchronousCompositor* compositor) {
420 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); 431 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor");
421 DCHECK(compositor_); 432 DCHECK(compositor_);
422 compositor_ = NULL; 433 compositor_ = NULL;
423 } 434 }
424 435
425 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) {
426 if (compositor_needs_continuous_invalidate_ == invalidate)
427 return;
428
429 TRACE_EVENT_INSTANT1("android_webview",
430 "BrowserViewRenderer::SetContinuousInvalidate",
431 TRACE_EVENT_SCOPE_THREAD,
432 "invalidate",
433 invalidate);
434 compositor_needs_continuous_invalidate_ = invalidate;
435
436 EnsureContinuousInvalidation(false, false);
437 }
438
439 void BrowserViewRenderer::SetDipScale(float dip_scale) { 436 void BrowserViewRenderer::SetDipScale(float dip_scale) {
440 dip_scale_ = dip_scale; 437 dip_scale_ = dip_scale;
441 CHECK_GT(dip_scale_, 0.f); 438 CHECK_GT(dip_scale_, 0.f);
442 } 439 }
443 440
444 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { 441 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const {
445 DCHECK_GT(dip_scale_, 0.f); 442 DCHECK_GT(dip_scale_, 0.f);
446 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( 443 return gfx::ToCeiledVector2d(gfx::ScaleVector2d(
447 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); 444 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_));
448 } 445 }
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 overscroll_rounding_error_ = gfx::Vector2dF(); 593 overscroll_rounding_error_ = gfx::Vector2dF();
597 gfx::Vector2dF scaled_overscroll_delta = 594 gfx::Vector2dF scaled_overscroll_delta =
598 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); 595 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale);
599 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( 596 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d(
600 scaled_overscroll_delta + overscroll_rounding_error_); 597 scaled_overscroll_delta + overscroll_rounding_error_);
601 overscroll_rounding_error_ = 598 overscroll_rounding_error_ =
602 scaled_overscroll_delta - rounded_overscroll_delta; 599 scaled_overscroll_delta - rounded_overscroll_delta;
603 client_->DidOverscroll(rounded_overscroll_delta); 600 client_->DidOverscroll(rounded_overscroll_delta);
604 } 601 }
605 602
606 void BrowserViewRenderer::EnsureContinuousInvalidation( 603 void BrowserViewRenderer::PostInvalidate() {
607 bool force_invalidate, 604 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate",
605 TRACE_EVENT_SCOPE_THREAD);
606 PostInvalidateWithFallback(false);
607 }
608
609 void BrowserViewRenderer::PostInvalidateWithFallback(
608 bool skip_reschedule_tick) { 610 bool skip_reschedule_tick) {
609 if (force_invalidate) 611 if (block_invalidates_) {
610 invalidate_after_composite_ = true; 612 invalidate_after_composite_ = true;
boliu 2015/02/11 02:28:14 I think BVR needs a general clean up before having
611
612 // This method should be called again when any of these conditions change.
613 bool need_invalidate =
614 compositor_needs_continuous_invalidate_ || invalidate_after_composite_;
615 if (!need_invalidate || block_invalidates_)
616 return; 613 return;
617 614 }
618 if (!compositor_needs_continuous_invalidate_ && invalidate_after_composite_)
619 invalidate_after_composite_ = false;
620 615
621 // Always call view invalidate. We rely the Android framework to ignore the 616 // Always call view invalidate. We rely the Android framework to ignore the
622 // invalidate when it's not needed such as when view is not visible. 617 // invalidate when it's not needed such as when view is not visible.
623 client_->PostInvalidate(); 618 client_->PostInvalidate();
624 619
620 // Always clear any queued invalidates when posting a new one.
621 invalidate_after_composite_ = false;
622
625 // Stop fallback ticks when one of these is true. 623 // Stop fallback ticks when one of these is true.
626 // 1) Webview is paused. Also need to check we are not in clear view since 624 // 1) Webview is paused. Also need to check we are not in clear view since
627 // paused, offscreen still expect clear view to recover. 625 // paused, offscreen still expect clear view to recover.
628 // 2) If we are attached to window and the window is not visible (eg when 626 // 2) If we are attached to window and the window is not visible (eg when
629 // app is in the background). We are sure in this case the webview is used 627 // app is in the background). We are sure in this case the webview is used
630 // "on-screen" but that updates are not needed when in the background. 628 // "on-screen" but that updates are not needed when in the background.
631 bool throttle_fallback_tick = 629 bool throttle_fallback_tick =
632 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); 630 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_);
boliu 2015/02/11 02:28:14 clear_view_ *was* here because we still want activ
631
633 if (throttle_fallback_tick) 632 if (throttle_fallback_tick)
634 return; 633 return;
635 634
636 block_invalidates_ = compositor_needs_continuous_invalidate_; 635 // Start blocking any invalidates posted. Eventually DidComposite or
636 // DidSkipCompositeInDraw will be called either via onDraw or the fallback
637 // tick and invalidates will be unblocked.
638 block_invalidates_ = true;
639
637 if (skip_reschedule_tick && fallback_tick_pending_) 640 if (skip_reschedule_tick && fallback_tick_pending_)
638 return; 641 return;
639 642
640 // Unretained here is safe because the callbacks are cancelled when
641 // they are destroyed.
642 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, 643 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick,
643 base::Unretained(this))); 644 base::Unretained(this)));
644 fallback_tick_fired_.Cancel(); 645 fallback_tick_fired_.Cancel();
645 fallback_tick_pending_ = false;
646 646
647 // No need to reschedule fallback tick if compositor does not need to be 647 fallback_tick_pending_ = true;
648 // ticked. This can happen if this is reached because force_invalidate is 648 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback());
649 // true.
650 if (compositor_needs_continuous_invalidate_) {
651 fallback_tick_pending_ = true;
652 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback());
653 }
654 } 649 }
655 650
656 void BrowserViewRenderer::PostFallbackTick() { 651 void BrowserViewRenderer::PostFallbackTick() {
657 DCHECK(fallback_tick_fired_.IsCancelled()); 652 DCHECK(fallback_tick_fired_.IsCancelled());
658 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, 653 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired,
659 base::Unretained(this))); 654 base::Unretained(this)));
660 if (compositor_needs_continuous_invalidate_) { 655 if (compositor_) {
boliu 2015/02/11 02:28:14 don't really need this check either
661 ui_task_runner_->PostDelayedTask( 656 ui_task_runner_->PostDelayedTask(
662 FROM_HERE, 657 FROM_HERE,
663 fallback_tick_fired_.callback(), 658 fallback_tick_fired_.callback(),
664 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); 659 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds));
665 } else {
666 // Pretend we just composited to unblock further invalidates.
667 DidComposite();
668 } 660 }
661 // Pretend we just composited to unblock further invalidates.
662 DidComposite();
boliu 2015/02/11 02:28:14 just remove this, once compositor is gone, it's go
669 } 663 }
670 664
671 void BrowserViewRenderer::FallbackTickFired() { 665 void BrowserViewRenderer::FallbackTickFired() {
672 TRACE_EVENT1("android_webview", 666 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired");
673 "BrowserViewRenderer::FallbackTickFired",
674 "compositor_needs_continuous_invalidate_",
675 compositor_needs_continuous_invalidate_);
676
677 // This should only be called if OnDraw or DrawGL did not come in time, which 667 // This should only be called if OnDraw or DrawGL did not come in time, which
678 // means block_invalidates_ must still be true. 668 // means block_invalidates_ must still be true.
679 DCHECK(block_invalidates_); 669 DCHECK(block_invalidates_);
680 fallback_tick_pending_ = false; 670 fallback_tick_pending_ = false;
681 if (compositor_needs_continuous_invalidate_ && compositor_) { 671 if (compositor_) {
682 if (hardware_enabled_) { 672 if (hardware_enabled_) {
683 ReturnResourceFromParent(); 673 ForceCompositeHw();
684 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
685 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
686 if (frame.get()) {
687 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true);
688 }
689 } else { 674 } else {
690 ForceFakeCompositeSW(); 675 ForceFakeCompositeSW();
691 } 676 }
692 } else {
693 // Pretend we just composited to unblock further invalidates.
694 DidComposite();
695 } 677 }
678 // Pretend we just composited to unblock further invalidates.
679 DidComposite();
boliu 2015/02/11 02:28:15 ditto
696 } 680 }
697 681
698 void BrowserViewRenderer::ForceFakeCompositeSW() { 682 void BrowserViewRenderer::ForceFakeCompositeSW() {
699 DCHECK(compositor_); 683 DCHECK(compositor_);
700 SkBitmap bitmap; 684 SkBitmap bitmap;
701 bitmap.allocN32Pixels(1, 1); 685 bitmap.allocN32Pixels(1, 1);
702 bitmap.eraseColor(0); 686 bitmap.eraseColor(0);
703 SkCanvas canvas(bitmap); 687 SkCanvas canvas(bitmap);
704 CompositeSW(&canvas); 688 CompositeSW(&canvas);
705 } 689 }
706 690
707 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { 691 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
708 DCHECK(compositor_); 692 DCHECK(compositor_);
709 ReturnResourceFromParent(); 693 ReturnResourceFromParent();
710 bool result = compositor_->DemandDrawSw(canvas); 694 bool result = compositor_->DemandDrawSw(canvas);
711 DidComposite(); 695 DidComposite();
712 return result; 696 return result;
713 } 697 }
714 698
715 void BrowserViewRenderer::DidComposite() { 699 void BrowserViewRenderer::DidComposite() {
716 block_invalidates_ = false; 700 block_invalidates_ = false;
701
717 post_fallback_tick_.Cancel(); 702 post_fallback_tick_.Cancel();
718 fallback_tick_fired_.Cancel(); 703 fallback_tick_fired_.Cancel();
719 fallback_tick_pending_ = false; 704 fallback_tick_pending_ = false;
720 EnsureContinuousInvalidation(false, false); 705
706 if (invalidate_after_composite_)
707 PostInvalidateWithFallback(false);
721 } 708 }
722 709
723 void BrowserViewRenderer::DidSkipCompositeInDraw() { 710 void BrowserViewRenderer::DidSkipCompositeInDraw() {
711 DCHECK(block_invalidates_);
724 block_invalidates_ = false; 712 block_invalidates_ = false;
725 EnsureContinuousInvalidation(true, true); 713 PostInvalidateWithFallback(true);
714 }
715
716 void BrowserViewRenderer::UpdateCompositorIsActive() {
717 if (compositor_)
718 compositor_->SetIsActive(!is_paused_ &&
719 (!attached_to_window_ || window_visible_));
726 } 720 }
727 721
728 std::string BrowserViewRenderer::ToString() const { 722 std::string BrowserViewRenderer::ToString() const {
729 std::string str; 723 std::string str;
730 base::StringAppendF(&str, "is_paused: %d ", is_paused_); 724 base::StringAppendF(&str, "is_paused: %d ", is_paused_);
731 base::StringAppendF(&str, "view_visible: %d ", view_visible_); 725 base::StringAppendF(&str, "view_visible: %d ", view_visible_);
732 base::StringAppendF(&str, "window_visible: %d ", window_visible_); 726 base::StringAppendF(&str, "window_visible: %d ", window_visible_);
733 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); 727 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_);
734 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); 728 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_);
735 base::StringAppendF(&str, 729 base::StringAppendF(&str, "invalidate_after_composite: %d ",
736 "compositor_needs_continuous_invalidate: %d ", 730 invalidate_after_composite_);
737 compositor_needs_continuous_invalidate_);
738 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); 731 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_);
732 base::StringAppendF(&str, "fallback_tick_pending: %d ",
733 fallback_tick_pending_);
739 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); 734 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str());
740 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); 735 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_);
741 base::StringAppendF(&str, 736 base::StringAppendF(&str,
742 "global visible rect: %s ", 737 "global visible rect: %s ",
743 last_on_draw_global_visible_rect_.ToString().c_str()); 738 last_on_draw_global_visible_rect_.ToString().c_str());
744 base::StringAppendF( 739 base::StringAppendF(
745 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); 740 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str());
746 base::StringAppendF(&str, 741 base::StringAppendF(&str,
747 "overscroll_rounding_error_: %s ", 742 "overscroll_rounding_error_: %s ",
748 overscroll_rounding_error_.ToString().c_str()); 743 overscroll_rounding_error_.ToString().c_str());
749 base::StringAppendF( 744 base::StringAppendF(
750 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 745 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
751 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 746 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
752 return str; 747 return str;
753 } 748 }
754 749
755 } // namespace android_webview 750 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698