OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |