Chromium Code Reviews| 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 |