| 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/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 compositor_(NULL), | 59 compositor_(NULL), |
| 60 is_paused_(false), | 60 is_paused_(false), |
| 61 view_visible_(false), | 61 view_visible_(false), |
| 62 window_visible_(false), | 62 window_visible_(false), |
| 63 attached_to_window_(false), | 63 attached_to_window_(false), |
| 64 hardware_enabled_(false), | 64 hardware_enabled_(false), |
| 65 dip_scale_(0.0), | 65 dip_scale_(0.0), |
| 66 page_scale_factor_(1.0), | 66 page_scale_factor_(1.0), |
| 67 on_new_picture_enable_(false), | 67 on_new_picture_enable_(false), |
| 68 clear_view_(false), | 68 clear_view_(false), |
| 69 compositor_needs_continuous_invalidate_(false), | 69 compositor_needs_vsyncs_(false) { |
| 70 invalidate_after_composite_(false), | |
| 71 block_invalidates_(false), | |
| 72 fallback_tick_pending_(false) { | |
| 73 } | 70 } |
| 74 | 71 |
| 75 BrowserViewRenderer::~BrowserViewRenderer() { | 72 BrowserViewRenderer::~BrowserViewRenderer() { |
| 76 } | 73 } |
| 77 | 74 |
| 78 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { | 75 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { |
| 79 return &shared_renderer_state_; | 76 return &shared_renderer_state_; |
| 80 } | 77 } |
| 81 | 78 |
| 82 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { | 79 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 112 | 109 |
| 113 // Drop everything in hardware. | 110 // Drop everything in hardware. |
| 114 if (level >= TRIM_MEMORY_MODERATE) { | 111 if (level >= TRIM_MEMORY_MODERATE) { |
| 115 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); | 112 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
| 116 return; | 113 return; |
| 117 } | 114 } |
| 118 | 115 |
| 119 // Just set the memory limit to 0 and drop all tiles. This will be reset to | 116 // Just set the memory limit to 0 and drop all tiles. This will be reset to |
| 120 // normal levels in the next DrawGL call. | 117 // normal levels in the next DrawGL call. |
| 121 compositor_->SetMemoryPolicy(0u); | 118 compositor_->SetMemoryPolicy(0u); |
| 122 ForceFakeCompositeSW(); | |
| 123 } | 119 } |
| 124 | 120 |
| 125 size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { | 121 size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { |
| 126 if (g_memory_override_in_bytes) | 122 if (g_memory_override_in_bytes) |
| 127 return static_cast<size_t>(g_memory_override_in_bytes); | 123 return static_cast<size_t>(g_memory_override_in_bytes); |
| 128 | 124 |
| 129 size_t width = last_on_draw_global_visible_rect_.width(); | 125 size_t width = last_on_draw_global_visible_rect_.width(); |
| 130 size_t height = last_on_draw_global_visible_rect_.height(); | 126 size_t height = last_on_draw_global_visible_rect_.height(); |
| 131 size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; | 127 size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; |
| 132 // Round up to a multiple of kMemoryAllocationStep. | 128 // Round up to a multiple of kMemoryAllocationStep. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 TRACE_EVENT_SCOPE_THREAD); | 165 TRACE_EVENT_SCOPE_THREAD); |
| 170 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); | 166 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); |
| 171 return true; | 167 return true; |
| 172 } | 168 } |
| 173 | 169 |
| 174 ReturnResourceFromParent(); | 170 ReturnResourceFromParent(); |
| 175 if (shared_renderer_state_.HasCompositorFrameOnUI()) { | 171 if (shared_renderer_state_.HasCompositorFrameOnUI()) { |
| 176 TRACE_EVENT_INSTANT0("android_webview", | 172 TRACE_EVENT_INSTANT0("android_webview", |
| 177 "EarlyOut_PreviousFrameUnconsumed", | 173 "EarlyOut_PreviousFrameUnconsumed", |
| 178 TRACE_EVENT_SCOPE_THREAD); | 174 TRACE_EVENT_SCOPE_THREAD); |
| 179 DidSkipCompositeInDraw(); | |
| 180 return true; | 175 return true; |
| 181 } | 176 } |
| 182 | 177 |
| 183 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | 178 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |
| 184 if (!frame.get()) { | 179 if (!frame.get()) { |
| 185 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | 180 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
| 186 TRACE_EVENT_SCOPE_THREAD); | 181 TRACE_EVENT_SCOPE_THREAD); |
| 187 return false; | 182 return false; |
| 188 } | 183 } |
| 189 | 184 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 213 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 208 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; |
| 214 } | 209 } |
| 215 | 210 |
| 216 scoped_ptr<cc::CompositorFrame> frame = | 211 scoped_ptr<cc::CompositorFrame> frame = |
| 217 compositor_->DemandDrawHw(surface_size, | 212 compositor_->DemandDrawHw(surface_size, |
| 218 gfx::Transform(), | 213 gfx::Transform(), |
| 219 viewport, | 214 viewport, |
| 220 clip, | 215 clip, |
| 221 viewport_rect_for_tile_priority, | 216 viewport_rect_for_tile_priority, |
| 222 transform_for_tile_priority); | 217 transform_for_tile_priority); |
| 223 if (frame.get()) | |
| 224 DidComposite(); | |
| 225 return frame.Pass(); | 218 return frame.Pass(); |
| 226 } | 219 } |
| 227 | 220 |
| 228 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 221 void BrowserViewRenderer::UpdateParentDrawConstraints() { |
| 229 // Post an invalidate if the parent draw constraints are stale and there is | 222 // Post an invalidate if the parent draw constraints are stale and there is |
| 230 // no pending invalidate. | 223 // no pending invalidate. |
| 231 bool needs_force_invalidate = | 224 bool needs_force_invalidate = |
| 232 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); | 225 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); |
| 233 if (needs_force_invalidate || | 226 if (needs_force_invalidate || |
| 234 !parent_draw_constraints_.Equals( | 227 !parent_draw_constraints_.Equals( |
| 235 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { | 228 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { |
| 236 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); | 229 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); |
| 237 EnsureContinuousInvalidation(true, needs_force_invalidate); | 230 PostInvalidate(); |
| 238 } | 231 } |
| 239 } | 232 } |
| 240 | 233 |
| 241 void BrowserViewRenderer::ReturnUnusedResource( | 234 void BrowserViewRenderer::ReturnUnusedResource( |
| 242 scoped_ptr<cc::CompositorFrame> frame) { | 235 scoped_ptr<cc::CompositorFrame> frame) { |
| 243 if (!frame.get()) | 236 if (!frame.get()) |
| 244 return; | 237 return; |
| 245 | 238 |
| 246 cc::CompositorFrameAck frame_ack; | 239 cc::CompositorFrameAck frame_ack; |
| 247 cc::TransferableResource::ReturnResources( | 240 cc::TransferableResource::ReturnResources( |
| 248 frame->delegated_frame_data->resource_list, &frame_ack.resources); | 241 frame->delegated_frame_data->resource_list, &frame_ack.resources); |
| 249 if (compositor_ && !frame_ack.resources.empty()) | 242 if (compositor_ && !frame_ack.resources.empty()) |
| 250 compositor_->ReturnResources(frame_ack); | 243 compositor_->ReturnResources(frame_ack); |
| 251 } | 244 } |
| 252 | 245 |
| 253 void BrowserViewRenderer::ReturnResourceFromParent() { | 246 void BrowserViewRenderer::ReturnResourceFromParent() { |
| 254 cc::CompositorFrameAck frame_ack; | 247 cc::CompositorFrameAck frame_ack; |
| 255 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); | 248 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); |
| 256 if (compositor_ && !frame_ack.resources.empty()) { | 249 if (compositor_ && !frame_ack.resources.empty()) { |
| 257 compositor_->ReturnResources(frame_ack); | 250 compositor_->ReturnResources(frame_ack); |
| 258 } | 251 } |
| 259 } | 252 } |
| 260 | 253 |
| 261 void BrowserViewRenderer::DidSkipCommitFrame() { | |
| 262 // Treat it the same way as skipping onDraw. | |
| 263 DidSkipCompositeInDraw(); | |
| 264 } | |
| 265 | |
| 266 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { | 254 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { |
| 267 client_->InvalidateOnFunctorDestroy(); | 255 client_->InvalidateOnFunctorDestroy(); |
| 268 } | 256 } |
| 269 | 257 |
| 270 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 258 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { |
| 271 if (!compositor_) { | 259 if (!compositor_) { |
| 272 TRACE_EVENT_INSTANT0( | 260 TRACE_EVENT_INSTANT0( |
| 273 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); | 261 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); |
| 274 return false; | 262 return false; |
| 275 } | 263 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 305 } | 293 } |
| 306 | 294 |
| 307 void BrowserViewRenderer::ClearView() { | 295 void BrowserViewRenderer::ClearView() { |
| 308 TRACE_EVENT_INSTANT0("android_webview", | 296 TRACE_EVENT_INSTANT0("android_webview", |
| 309 "BrowserViewRenderer::ClearView", | 297 "BrowserViewRenderer::ClearView", |
| 310 TRACE_EVENT_SCOPE_THREAD); | 298 TRACE_EVENT_SCOPE_THREAD); |
| 311 if (clear_view_) | 299 if (clear_view_) |
| 312 return; | 300 return; |
| 313 | 301 |
| 314 clear_view_ = true; | 302 clear_view_ = true; |
| 315 // Always invalidate ignoring the compositor to actually clear the webview. | 303 |
| 316 EnsureContinuousInvalidation(true, false); | 304 PostInvalidate(); |
| 305 } |
| 306 |
| 307 void BrowserViewRenderer::OnVSync(base::TimeTicks frame_time, |
| 308 base::TimeDelta vsync_period) { |
| 309 DCHECK(needs_vsyncs_); |
| 310 |
| 311 if (needs_vsyncs_) |
| 312 client_->RequestVSyncUpdate(); |
| 317 } | 313 } |
| 318 | 314 |
| 319 void BrowserViewRenderer::SetIsPaused(bool paused) { | 315 void BrowserViewRenderer::SetIsPaused(bool paused) { |
| 320 TRACE_EVENT_INSTANT1("android_webview", | 316 TRACE_EVENT_INSTANT1("android_webview", |
| 321 "BrowserViewRenderer::SetIsPaused", | 317 "BrowserViewRenderer::SetIsPaused", |
| 322 TRACE_EVENT_SCOPE_THREAD, | 318 TRACE_EVENT_SCOPE_THREAD, |
| 323 "paused", | 319 "paused", |
| 324 paused); | 320 paused); |
| 325 is_paused_ = paused; | 321 is_paused_ = paused; |
| 326 EnsureContinuousInvalidation(false, false); | 322 UpdateNeedsVSyncs(); |
| 327 } | 323 } |
| 328 | 324 |
| 329 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { | 325 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { |
| 330 TRACE_EVENT_INSTANT1("android_webview", | 326 TRACE_EVENT_INSTANT1("android_webview", |
| 331 "BrowserViewRenderer::SetViewVisibility", | 327 "BrowserViewRenderer::SetViewVisibility", |
| 332 TRACE_EVENT_SCOPE_THREAD, | 328 TRACE_EVENT_SCOPE_THREAD, |
| 333 "view_visible", | 329 "view_visible", |
| 334 view_visible); | 330 view_visible); |
| 335 view_visible_ = view_visible; | 331 view_visible_ = view_visible; |
| 332 UpdateNeedsVSyncs(); |
| 336 } | 333 } |
| 337 | 334 |
| 338 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { | 335 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { |
| 339 TRACE_EVENT_INSTANT1("android_webview", | 336 TRACE_EVENT_INSTANT1("android_webview", |
| 340 "BrowserViewRenderer::SetWindowVisibility", | 337 "BrowserViewRenderer::SetWindowVisibility", |
| 341 TRACE_EVENT_SCOPE_THREAD, | 338 TRACE_EVENT_SCOPE_THREAD, |
| 342 "window_visible", | 339 "window_visible", |
| 343 window_visible); | 340 window_visible); |
| 344 window_visible_ = window_visible; | 341 window_visible_ = window_visible; |
| 345 EnsureContinuousInvalidation(false, false); | 342 UpdateNeedsVSyncs(); |
| 346 } | 343 } |
| 347 | 344 |
| 348 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 345 void BrowserViewRenderer::OnSizeChanged(int width, int height) { |
| 349 TRACE_EVENT_INSTANT2("android_webview", | 346 TRACE_EVENT_INSTANT2("android_webview", |
| 350 "BrowserViewRenderer::OnSizeChanged", | 347 "BrowserViewRenderer::OnSizeChanged", |
| 351 TRACE_EVENT_SCOPE_THREAD, | 348 TRACE_EVENT_SCOPE_THREAD, |
| 352 "width", | 349 "width", |
| 353 width, | 350 width, |
| 354 "height", | 351 "height", |
| 355 height); | 352 height); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 compositor_ = compositor; | 402 compositor_ = compositor; |
| 406 } | 403 } |
| 407 | 404 |
| 408 void BrowserViewRenderer::DidDestroyCompositor( | 405 void BrowserViewRenderer::DidDestroyCompositor( |
| 409 content::SynchronousCompositor* compositor) { | 406 content::SynchronousCompositor* compositor) { |
| 410 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); | 407 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); |
| 411 DCHECK(compositor_); | 408 DCHECK(compositor_); |
| 412 compositor_ = NULL; | 409 compositor_ = NULL; |
| 413 } | 410 } |
| 414 | 411 |
| 415 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { | 412 void BrowserViewRenderer::SetNeedsVSyncs(bool needs_vsyncs) { |
| 416 if (compositor_needs_continuous_invalidate_ == invalidate) | 413 compositor_needs_vsyncs_ = needs_vsyncs; |
| 417 return; | 414 UpdateNeedsVSyncs(); |
| 415 } |
| 418 | 416 |
| 419 TRACE_EVENT_INSTANT1("android_webview", | 417 void BrowserViewRenderer::PostInvalidate() { |
| 420 "BrowserViewRenderer::SetContinuousInvalidate", | 418 DCHECK(client_); |
| 421 TRACE_EVENT_SCOPE_THREAD, | 419 client_->PostInvalidate(); |
| 422 "invalidate", | |
| 423 invalidate); | |
| 424 compositor_needs_continuous_invalidate_ = invalidate; | |
| 425 | |
| 426 EnsureContinuousInvalidation(false, false); | |
| 427 } | 420 } |
| 428 | 421 |
| 429 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 422 void BrowserViewRenderer::SetDipScale(float dip_scale) { |
| 430 dip_scale_ = dip_scale; | 423 dip_scale_ = dip_scale; |
| 431 CHECK_GT(dip_scale_, 0); | 424 CHECK_GT(dip_scale_, 0); |
| 432 } | 425 } |
| 433 | 426 |
| 434 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 427 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { |
| 435 DCHECK_GT(dip_scale_, 0); | 428 DCHECK_GT(dip_scale_, 0); |
| 436 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 429 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 overscroll_rounding_error_ = gfx::Vector2dF(); | 575 overscroll_rounding_error_ = gfx::Vector2dF(); |
| 583 gfx::Vector2dF scaled_overscroll_delta = | 576 gfx::Vector2dF scaled_overscroll_delta = |
| 584 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); | 577 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); |
| 585 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 578 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( |
| 586 scaled_overscroll_delta + overscroll_rounding_error_); | 579 scaled_overscroll_delta + overscroll_rounding_error_); |
| 587 overscroll_rounding_error_ = | 580 overscroll_rounding_error_ = |
| 588 scaled_overscroll_delta - rounded_overscroll_delta; | 581 scaled_overscroll_delta - rounded_overscroll_delta; |
| 589 client_->DidOverscroll(rounded_overscroll_delta); | 582 client_->DidOverscroll(rounded_overscroll_delta); |
| 590 } | 583 } |
| 591 | 584 |
| 592 void BrowserViewRenderer::EnsureContinuousInvalidation( | |
| 593 bool force_invalidate, | |
| 594 bool skip_reschedule_tick) { | |
| 595 if (force_invalidate) | |
| 596 invalidate_after_composite_ = true; | |
| 597 | |
| 598 // This method should be called again when any of these conditions change. | |
| 599 bool need_invalidate = | |
| 600 compositor_needs_continuous_invalidate_ || invalidate_after_composite_; | |
| 601 if (!need_invalidate || block_invalidates_) | |
| 602 return; | |
| 603 | |
| 604 if (!compositor_needs_continuous_invalidate_ && invalidate_after_composite_) | |
| 605 invalidate_after_composite_ = false; | |
| 606 | |
| 607 // Always call view invalidate. We rely the Android framework to ignore the | |
| 608 // invalidate when it's not needed such as when view is not visible. | |
| 609 client_->PostInvalidate(); | |
| 610 | |
| 611 // Stop fallback ticks when one of these is true. | |
| 612 // 1) Webview is paused. Also need to check we are not in clear view since | |
| 613 // paused, offscreen still expect clear view to recover. | |
| 614 // 2) If we are attached to window and the window is not visible (eg when | |
| 615 // app is in the background). We are sure in this case the webview is used | |
| 616 // "on-screen" but that updates are not needed when in the background. | |
| 617 bool throttle_fallback_tick = | |
| 618 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | |
| 619 if (throttle_fallback_tick) | |
| 620 return; | |
| 621 | |
| 622 block_invalidates_ = compositor_needs_continuous_invalidate_; | |
| 623 if (skip_reschedule_tick && fallback_tick_pending_) | |
| 624 return; | |
| 625 | |
| 626 // Unretained here is safe because the callbacks are cancelled when | |
| 627 // they are destroyed. | |
| 628 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | |
| 629 base::Unretained(this))); | |
| 630 fallback_tick_fired_.Cancel(); | |
| 631 fallback_tick_pending_ = false; | |
| 632 | |
| 633 // No need to reschedule fallback tick if compositor does not need to be | |
| 634 // ticked. This can happen if this is reached because force_invalidate is | |
| 635 // true. | |
| 636 if (compositor_needs_continuous_invalidate_) { | |
| 637 fallback_tick_pending_ = true; | |
| 638 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); | |
| 639 } | |
| 640 } | |
| 641 | |
| 642 void BrowserViewRenderer::PostFallbackTick() { | |
| 643 DCHECK(fallback_tick_fired_.IsCancelled()); | |
| 644 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, | |
| 645 base::Unretained(this))); | |
| 646 if (compositor_needs_continuous_invalidate_) { | |
| 647 ui_task_runner_->PostDelayedTask( | |
| 648 FROM_HERE, | |
| 649 fallback_tick_fired_.callback(), | |
| 650 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); | |
| 651 } else { | |
| 652 // Pretend we just composited to unblock further invalidates. | |
| 653 DidComposite(); | |
| 654 } | |
| 655 } | |
| 656 | |
| 657 void BrowserViewRenderer::FallbackTickFired() { | |
| 658 TRACE_EVENT1("android_webview", | |
| 659 "BrowserViewRenderer::FallbackTickFired", | |
| 660 "compositor_needs_continuous_invalidate_", | |
| 661 compositor_needs_continuous_invalidate_); | |
| 662 | |
| 663 // This should only be called if OnDraw or DrawGL did not come in time, which | |
| 664 // means block_invalidates_ must still be true. | |
| 665 DCHECK(block_invalidates_); | |
| 666 fallback_tick_pending_ = false; | |
| 667 if (compositor_needs_continuous_invalidate_ && compositor_) { | |
| 668 if (hardware_enabled_) { | |
| 669 ReturnResourceFromParent(); | |
| 670 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | |
| 671 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | |
| 672 if (frame.get()) { | |
| 673 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true); | |
| 674 } | |
| 675 } else { | |
| 676 ForceFakeCompositeSW(); | |
| 677 } | |
| 678 } else { | |
| 679 // Pretend we just composited to unblock further invalidates. | |
| 680 DidComposite(); | |
| 681 } | |
| 682 } | |
| 683 | |
| 684 void BrowserViewRenderer::ForceFakeCompositeSW() { | |
| 685 DCHECK(compositor_); | |
| 686 SkBitmap bitmap; | |
| 687 bitmap.allocN32Pixels(1, 1); | |
| 688 bitmap.eraseColor(0); | |
| 689 SkCanvas canvas(bitmap); | |
| 690 CompositeSW(&canvas); | |
| 691 } | |
| 692 | |
| 693 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { | 585 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { |
| 694 DCHECK(compositor_); | 586 DCHECK(compositor_); |
| 695 ReturnResourceFromParent(); | 587 ReturnResourceFromParent(); |
| 696 bool result = compositor_->DemandDrawSw(canvas); | 588 return compositor_->DemandDrawSw(canvas); |
| 697 DidComposite(); | |
| 698 return result; | |
| 699 } | 589 } |
| 700 | 590 |
| 701 void BrowserViewRenderer::DidComposite() { | 591 void BrowserViewRenderer::UpdateNeedsVSyncs() { |
| 702 block_invalidates_ = false; | 592 bool needs_vsyncs = !is_paused_ && IsVisible() && compositor_needs_vsyncs_; |
| 703 post_fallback_tick_.Cancel(); | |
| 704 fallback_tick_fired_.Cancel(); | |
| 705 fallback_tick_pending_ = false; | |
| 706 EnsureContinuousInvalidation(false, false); | |
| 707 } | |
| 708 | 593 |
| 709 void BrowserViewRenderer::DidSkipCompositeInDraw() { | 594 if (needs_vsyncs_ == needs_vsyncs) |
| 710 block_invalidates_ = false; | 595 return; |
| 711 EnsureContinuousInvalidation(true, true); | 596 |
| 597 needs_vsyncs_ = needs_vsyncs; |
| 598 |
| 599 if (needs_vsyncs_) |
| 600 client_->RequestVSyncUpdate(); |
| 712 } | 601 } |
| 713 | 602 |
| 714 std::string BrowserViewRenderer::ToString() const { | 603 std::string BrowserViewRenderer::ToString() const { |
| 715 std::string str; | 604 std::string str; |
| 716 base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 605 base::StringAppendF(&str, "is_paused: %d ", is_paused_); |
| 717 base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 606 base::StringAppendF(&str, "view_visible: %d ", view_visible_); |
| 718 base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 607 base::StringAppendF(&str, "window_visible: %d ", window_visible_); |
| 719 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 608 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); |
| 720 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 609 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); |
| 721 base::StringAppendF(&str, | 610 base::StringAppendF(&str, |
| 722 "compositor_needs_continuous_invalidate: %d ", | 611 "compositor_needs_vsyncs_: %d ", |
| 723 compositor_needs_continuous_invalidate_); | 612 compositor_needs_vsyncs_); |
| 724 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); | |
| 725 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); | 613 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); |
| 726 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 614 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
| 727 base::StringAppendF(&str, | 615 base::StringAppendF(&str, |
| 728 "global visible rect: %s ", | 616 "global visible rect: %s ", |
| 729 last_on_draw_global_visible_rect_.ToString().c_str()); | 617 last_on_draw_global_visible_rect_.ToString().c_str()); |
| 730 base::StringAppendF( | 618 base::StringAppendF( |
| 731 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); | 619 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); |
| 732 base::StringAppendF(&str, | 620 base::StringAppendF(&str, |
| 733 "overscroll_rounding_error_: %s ", | 621 "overscroll_rounding_error_: %s ", |
| 734 overscroll_rounding_error_.ToString().c_str()); | 622 overscroll_rounding_error_.ToString().c_str()); |
| 735 base::StringAppendF( | 623 base::StringAppendF( |
| 736 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 624 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 737 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 625 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 738 return str; | 626 return str; |
| 739 } | 627 } |
| 740 | 628 |
| 741 } // namespace android_webview | 629 } // namespace android_webview |
| OLD | NEW |