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 "android_webview/browser/child_frame.h" | 8 #include "android_webview/browser/child_frame.h" |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
91 is_paused_(false), | 91 is_paused_(false), |
92 view_visible_(false), | 92 view_visible_(false), |
93 window_visible_(false), | 93 window_visible_(false), |
94 attached_to_window_(false), | 94 attached_to_window_(false), |
95 hardware_enabled_(false), | 95 hardware_enabled_(false), |
96 dip_scale_(0.0), | 96 dip_scale_(0.0), |
97 page_scale_factor_(1.0), | 97 page_scale_factor_(1.0), |
98 on_new_picture_enable_(false), | 98 on_new_picture_enable_(false), |
99 clear_view_(false), | 99 clear_view_(false), |
100 offscreen_pre_raster_(false), | 100 offscreen_pre_raster_(false), |
101 compositor_needs_continuous_invalidate_(false), | |
102 block_invalidates_(false), | |
103 fallback_tick_pending_(false) { | 101 fallback_tick_pending_(false) { |
104 } | 102 } |
105 | 103 |
106 BrowserViewRenderer::~BrowserViewRenderer() { | 104 BrowserViewRenderer::~BrowserViewRenderer() { |
107 } | 105 } |
108 | 106 |
109 void BrowserViewRenderer::RegisterWithWebContents( | 107 void BrowserViewRenderer::RegisterWithWebContents( |
110 content::WebContents* web_contents) { | 108 content::WebContents* web_contents) { |
111 web_contents->SetUserData(kBrowserViewRendererUserDataKey, | 109 web_contents->SetUserData(kBrowserViewRendererUserDataKey, |
112 new BrowserViewRendererUserData(this)); | 110 new BrowserViewRendererUserData(this)); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
191 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", | 189 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", |
192 TRACE_EVENT_SCOPE_THREAD); | 190 TRACE_EVENT_SCOPE_THREAD); |
193 return false; | 191 return false; |
194 } | 192 } |
195 | 193 |
196 return true; | 194 return true; |
197 } | 195 } |
198 | 196 |
199 bool BrowserViewRenderer::OnDrawHardware() { | 197 bool BrowserViewRenderer::OnDrawHardware() { |
200 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); | 198 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); |
199 | |
200 post_fallback_tick_.Cancel(); | |
201 fallback_tick_fired_.Cancel(); | |
202 fallback_tick_pending_ = false; | |
boliu
2015/03/20 18:59:06
Factor this out into a CancelFallbackTick function
sunnyps
2015/03/20 22:48:39
Done.
| |
203 | |
201 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); | 204 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); |
202 | 205 |
203 if (!CanOnDraw()) { | 206 if (!CanOnDraw()) { |
204 return false; | 207 return false; |
205 } | 208 } |
206 | 209 |
207 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); | 210 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); |
208 | 211 |
209 if (!hardware_enabled_) { | 212 if (!hardware_enabled_) { |
210 TRACE_EVENT0("android_webview", "InitializeHwDraw"); | 213 TRACE_EVENT0("android_webview", "InitializeHwDraw"); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
256 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | 259 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
257 TRACE_EVENT_SCOPE_THREAD); | 260 TRACE_EVENT_SCOPE_THREAD); |
258 return false; | 261 return false; |
259 } | 262 } |
260 | 263 |
261 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( | 264 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( |
262 new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, | 265 new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, |
263 transform_for_tile_priority, offscreen_pre_raster_, | 266 transform_for_tile_priority, offscreen_pre_raster_, |
264 parent_draw_constraints.is_layer)); | 267 parent_draw_constraints.is_layer)); |
265 | 268 |
266 DidComposite(); | |
267 // Uncommitted frame can happen with consecutive fallback ticks. | 269 // Uncommitted frame can happen with consecutive fallback ticks. |
268 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | 270 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
269 shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass()); | 271 shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass()); |
270 return true; | 272 return true; |
271 } | 273 } |
272 | 274 |
273 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 275 void BrowserViewRenderer::UpdateParentDrawConstraints() { |
274 EnsureContinuousInvalidation(true); | |
275 ParentCompositorDrawConstraints parent_draw_constraints = | 276 ParentCompositorDrawConstraints parent_draw_constraints = |
276 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 277 shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
277 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); | 278 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); |
279 PostInvalidateWithFallback(); | |
boliu
2015/03/20 18:59:06
Put this before the client update, where EnsureCon
sunnyps
2015/03/20 22:48:39
Done.
| |
278 } | 280 } |
279 | 281 |
280 void BrowserViewRenderer::ReturnUnusedResource( | 282 void BrowserViewRenderer::ReturnUnusedResource( |
281 scoped_ptr<ChildFrame> child_frame) { | 283 scoped_ptr<ChildFrame> child_frame) { |
282 if (!child_frame.get() || !child_frame->frame.get()) | 284 if (!child_frame.get() || !child_frame->frame.get()) |
283 return; | 285 return; |
284 | 286 |
285 cc::CompositorFrameAck frame_ack; | 287 cc::CompositorFrameAck frame_ack; |
286 cc::TransferableResource::ReturnResources( | 288 cc::TransferableResource::ReturnResources( |
287 child_frame->frame->delegated_frame_data->resource_list, | 289 child_frame->frame->delegated_frame_data->resource_list, |
288 &frame_ack.resources); | 290 &frame_ack.resources); |
289 if (compositor_ && !frame_ack.resources.empty()) | 291 if (compositor_ && !frame_ack.resources.empty()) |
290 compositor_->ReturnResources(frame_ack); | 292 compositor_->ReturnResources(frame_ack); |
291 } | 293 } |
292 | 294 |
293 void BrowserViewRenderer::ReturnResourceFromParent() { | 295 void BrowserViewRenderer::ReturnResourceFromParent() { |
294 cc::CompositorFrameAck frame_ack; | 296 cc::CompositorFrameAck frame_ack; |
295 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); | 297 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); |
296 if (compositor_ && !frame_ack.resources.empty()) { | 298 if (compositor_ && !frame_ack.resources.empty()) { |
297 compositor_->ReturnResources(frame_ack); | 299 compositor_->ReturnResources(frame_ack); |
298 } | 300 } |
299 } | 301 } |
300 | 302 |
301 void BrowserViewRenderer::DetachFunctorFromView() { | 303 void BrowserViewRenderer::DetachFunctorFromView() { |
302 client_->DetachFunctorFromView(); | 304 client_->DetachFunctorFromView(); |
303 } | 305 } |
304 | 306 |
305 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 307 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { |
308 post_fallback_tick_.Cancel(); | |
309 fallback_tick_fired_.Cancel(); | |
310 fallback_tick_pending_ = false; | |
311 | |
306 return CanOnDraw() && CompositeSW(canvas); | 312 return CanOnDraw() && CompositeSW(canvas); |
307 } | 313 } |
308 | 314 |
309 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, | 315 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, |
310 int height) { | 316 int height) { |
311 TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture"); | 317 TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture"); |
312 | 318 |
313 // Return empty Picture objects for empty SkPictures. | 319 // Return empty Picture objects for empty SkPictures. |
314 if (width <= 0 || height <= 0) { | 320 if (width <= 0 || height <= 0) { |
315 SkPictureRecorder emptyRecorder; | 321 SkPictureRecorder emptyRecorder; |
(...skipping 19 matching lines...) Expand all Loading... | |
335 | 341 |
336 void BrowserViewRenderer::ClearView() { | 342 void BrowserViewRenderer::ClearView() { |
337 TRACE_EVENT_INSTANT0("android_webview", | 343 TRACE_EVENT_INSTANT0("android_webview", |
338 "BrowserViewRenderer::ClearView", | 344 "BrowserViewRenderer::ClearView", |
339 TRACE_EVENT_SCOPE_THREAD); | 345 TRACE_EVENT_SCOPE_THREAD); |
340 if (clear_view_) | 346 if (clear_view_) |
341 return; | 347 return; |
342 | 348 |
343 clear_view_ = true; | 349 clear_view_ = true; |
344 // Always invalidate ignoring the compositor to actually clear the webview. | 350 // Always invalidate ignoring the compositor to actually clear the webview. |
345 EnsureContinuousInvalidation(true); | 351 PostInvalidateWithFallback(); |
346 } | 352 } |
347 | 353 |
348 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { | 354 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { |
349 // TODO(hush): anything to do when the setting is toggled? | 355 // TODO(hush): anything to do when the setting is toggled? |
350 offscreen_pre_raster_ = enable; | 356 offscreen_pre_raster_ = enable; |
351 } | 357 } |
352 | 358 |
353 void BrowserViewRenderer::SetIsPaused(bool paused) { | 359 void BrowserViewRenderer::SetIsPaused(bool paused) { |
354 TRACE_EVENT_INSTANT1("android_webview", | 360 TRACE_EVENT_INSTANT1("android_webview", |
355 "BrowserViewRenderer::SetIsPaused", | 361 "BrowserViewRenderer::SetIsPaused", |
356 TRACE_EVENT_SCOPE_THREAD, | 362 TRACE_EVENT_SCOPE_THREAD, |
357 "paused", | 363 "paused", |
358 paused); | 364 paused); |
359 is_paused_ = paused; | 365 is_paused_ = paused; |
360 EnsureContinuousInvalidation(false); | 366 UpdateCompositorIsActive(); |
361 } | 367 } |
362 | 368 |
363 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { | 369 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { |
364 TRACE_EVENT_INSTANT1("android_webview", | 370 TRACE_EVENT_INSTANT1("android_webview", |
365 "BrowserViewRenderer::SetViewVisibility", | 371 "BrowserViewRenderer::SetViewVisibility", |
366 TRACE_EVENT_SCOPE_THREAD, | 372 TRACE_EVENT_SCOPE_THREAD, |
367 "view_visible", | 373 "view_visible", |
368 view_visible); | 374 view_visible); |
369 view_visible_ = view_visible; | 375 view_visible_ = view_visible; |
370 } | 376 } |
371 | 377 |
372 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { | 378 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { |
373 TRACE_EVENT_INSTANT1("android_webview", | 379 TRACE_EVENT_INSTANT1("android_webview", |
374 "BrowserViewRenderer::SetWindowVisibility", | 380 "BrowserViewRenderer::SetWindowVisibility", |
375 TRACE_EVENT_SCOPE_THREAD, | 381 TRACE_EVENT_SCOPE_THREAD, |
376 "window_visible", | 382 "window_visible", |
377 window_visible); | 383 window_visible); |
378 window_visible_ = window_visible; | 384 window_visible_ = window_visible; |
379 EnsureContinuousInvalidation(false); | 385 UpdateCompositorIsActive(); |
380 } | 386 } |
381 | 387 |
382 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 388 void BrowserViewRenderer::OnSizeChanged(int width, int height) { |
383 TRACE_EVENT_INSTANT2("android_webview", | 389 TRACE_EVENT_INSTANT2("android_webview", |
384 "BrowserViewRenderer::OnSizeChanged", | 390 "BrowserViewRenderer::OnSizeChanged", |
385 TRACE_EVENT_SCOPE_THREAD, | 391 TRACE_EVENT_SCOPE_THREAD, |
386 "width", | 392 "width", |
387 width, | 393 width, |
388 "height", | 394 "height", |
389 height); | 395 height); |
390 size_.SetSize(width, height); | 396 size_.SetSize(width, height); |
391 } | 397 } |
392 | 398 |
393 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { | 399 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { |
394 TRACE_EVENT2("android_webview", | 400 TRACE_EVENT2("android_webview", |
395 "BrowserViewRenderer::OnAttachedToWindow", | 401 "BrowserViewRenderer::OnAttachedToWindow", |
396 "width", | 402 "width", |
397 width, | 403 width, |
398 "height", | 404 "height", |
399 height); | 405 height); |
400 attached_to_window_ = true; | 406 attached_to_window_ = true; |
401 size_.SetSize(width, height); | 407 size_.SetSize(width, height); |
408 UpdateCompositorIsActive(); | |
402 } | 409 } |
403 | 410 |
404 void BrowserViewRenderer::OnDetachedFromWindow() { | 411 void BrowserViewRenderer::OnDetachedFromWindow() { |
405 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); | 412 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
406 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); | 413 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
407 attached_to_window_ = false; | 414 attached_to_window_ = false; |
408 DCHECK(!hardware_enabled_); | 415 DCHECK(!hardware_enabled_); |
416 UpdateCompositorIsActive(); | |
409 } | 417 } |
410 | 418 |
411 void BrowserViewRenderer::ReleaseHardware() { | 419 void BrowserViewRenderer::ReleaseHardware() { |
412 DCHECK(hardware_enabled_); | 420 DCHECK(hardware_enabled_); |
413 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | 421 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
414 ReturnResourceFromParent(); | 422 ReturnResourceFromParent(); |
415 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); | 423 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); |
416 | 424 |
417 if (compositor_) { | 425 if (compositor_) { |
418 compositor_->ReleaseHwDraw(); | 426 compositor_->ReleaseHwDraw(); |
(...skipping 11 matching lines...) Expand all Loading... | |
430 return gfx::Rect(client_->GetLocationOnScreen(), size_); | 438 return gfx::Rect(client_->GetLocationOnScreen(), size_); |
431 } | 439 } |
432 | 440 |
433 void BrowserViewRenderer::DidInitializeCompositor( | 441 void BrowserViewRenderer::DidInitializeCompositor( |
434 content::SynchronousCompositor* compositor) { | 442 content::SynchronousCompositor* compositor) { |
435 TRACE_EVENT0("android_webview", | 443 TRACE_EVENT0("android_webview", |
436 "BrowserViewRenderer::DidInitializeCompositor"); | 444 "BrowserViewRenderer::DidInitializeCompositor"); |
437 DCHECK(compositor); | 445 DCHECK(compositor); |
438 DCHECK(!compositor_); | 446 DCHECK(!compositor_); |
439 compositor_ = compositor; | 447 compositor_ = compositor; |
448 UpdateCompositorIsActive(); | |
440 } | 449 } |
441 | 450 |
442 void BrowserViewRenderer::DidDestroyCompositor( | 451 void BrowserViewRenderer::DidDestroyCompositor( |
443 content::SynchronousCompositor* compositor) { | 452 content::SynchronousCompositor* compositor) { |
444 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); | 453 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); |
445 DCHECK(compositor_); | 454 DCHECK(compositor_); |
446 compositor_ = NULL; | 455 compositor_ = NULL; |
447 } | 456 } |
448 | 457 |
449 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { | |
450 if (compositor_needs_continuous_invalidate_ == invalidate) | |
451 return; | |
452 | |
453 TRACE_EVENT_INSTANT1("android_webview", | |
454 "BrowserViewRenderer::SetContinuousInvalidate", | |
455 TRACE_EVENT_SCOPE_THREAD, | |
456 "invalidate", | |
457 invalidate); | |
458 compositor_needs_continuous_invalidate_ = invalidate; | |
459 | |
460 EnsureContinuousInvalidation(false); | |
461 } | |
462 | |
463 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 458 void BrowserViewRenderer::SetDipScale(float dip_scale) { |
464 dip_scale_ = dip_scale; | 459 dip_scale_ = dip_scale; |
465 CHECK_GT(dip_scale_, 0.f); | 460 CHECK_GT(dip_scale_, 0.f); |
466 } | 461 } |
467 | 462 |
468 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 463 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { |
469 DCHECK_GT(dip_scale_, 0.f); | 464 DCHECK_GT(dip_scale_, 0.f); |
470 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 465 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( |
471 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); | 466 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); |
472 } | 467 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
620 overscroll_rounding_error_ = gfx::Vector2dF(); | 615 overscroll_rounding_error_ = gfx::Vector2dF(); |
621 gfx::Vector2dF scaled_overscroll_delta = | 616 gfx::Vector2dF scaled_overscroll_delta = |
622 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); | 617 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); |
623 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 618 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( |
624 scaled_overscroll_delta + overscroll_rounding_error_); | 619 scaled_overscroll_delta + overscroll_rounding_error_); |
625 overscroll_rounding_error_ = | 620 overscroll_rounding_error_ = |
626 scaled_overscroll_delta - rounded_overscroll_delta; | 621 scaled_overscroll_delta - rounded_overscroll_delta; |
627 client_->DidOverscroll(rounded_overscroll_delta); | 622 client_->DidOverscroll(rounded_overscroll_delta); |
628 } | 623 } |
629 | 624 |
630 void BrowserViewRenderer::EnsureContinuousInvalidation(bool force_invalidate) { | 625 void BrowserViewRenderer::PostInvalidate() { |
631 // This method should be called again when any of these conditions change. | 626 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", |
632 bool need_invalidate = | 627 TRACE_EVENT_SCOPE_THREAD); |
633 compositor_needs_continuous_invalidate_ || force_invalidate; | 628 PostInvalidateWithFallback(); |
634 if (!need_invalidate || block_invalidates_) | 629 } |
635 return; | |
636 | 630 |
637 // Always call view invalidate. We rely the Android framework to ignore the | 631 void BrowserViewRenderer::PostInvalidateWithFallback() { |
638 // invalidate when it's not needed such as when view is not visible. | |
639 client_->PostInvalidate(); | |
640 | |
641 // Stop fallback ticks when one of these is true. | 632 // Stop fallback ticks when one of these is true. |
642 // 1) Webview is paused. Also need to check we are not in clear view since | 633 // 1) Webview is paused. Also need to check we are not in clear view since |
643 // paused, offscreen still expect clear view to recover. | 634 // paused, offscreen still expect clear view to recover. |
644 // 2) If we are attached to window and the window is not visible (eg when | 635 // 2) If we are attached to window and the window is not visible (eg when |
645 // app is in the background). We are sure in this case the webview is used | 636 // app is in the background). We are sure in this case the webview is used |
646 // "on-screen" but that updates are not needed when in the background. | 637 // "on-screen" but that updates are not needed when in the background. |
647 bool throttle_fallback_tick = | 638 bool throttle_fallback_tick = |
648 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | 639 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); |
649 if (throttle_fallback_tick) | 640 |
641 if (throttle_fallback_tick || fallback_tick_pending_) | |
650 return; | 642 return; |
651 | 643 |
652 block_invalidates_ = compositor_needs_continuous_invalidate_; | 644 // Always call view invalidate. We rely the Android framework to ignore the |
653 if (fallback_tick_pending_) | 645 // invalidate when it's not needed such as when view is not visible. |
654 return; | 646 client_->PostInvalidate(); |
boliu
2015/03/20 18:59:06
This should be above the throttle/fallback pending
sunnyps
2015/03/20 22:48:39
Done.
| |
655 | 647 |
656 // Unretained here is safe because the callbacks are cancelled when | 648 DCHECK(post_fallback_tick_.IsCancelled()); |
657 // they are destroyed. | 649 DCHECK(fallback_tick_fired_.IsCancelled()); |
650 | |
658 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | 651 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, |
659 base::Unretained(this))); | 652 base::Unretained(this))); |
660 fallback_tick_fired_.Cancel(); | 653 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); |
661 fallback_tick_pending_ = false; | 654 fallback_tick_pending_ = true; |
662 | |
663 // No need to reschedule fallback tick if compositor does not need to be | |
664 // ticked. This can happen if this is reached because force_invalidate is | |
665 // true. | |
666 if (compositor_needs_continuous_invalidate_) { | |
667 fallback_tick_pending_ = true; | |
668 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); | |
669 } | |
670 } | 655 } |
671 | 656 |
672 void BrowserViewRenderer::PostFallbackTick() { | 657 void BrowserViewRenderer::PostFallbackTick() { |
673 DCHECK(fallback_tick_fired_.IsCancelled()); | 658 DCHECK(fallback_tick_fired_.IsCancelled()); |
659 TRACE_EVENT0("android_webview", "BrowserViewRenderer::PostFallbackTick"); | |
660 post_fallback_tick_.Cancel(); | |
674 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, | 661 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, |
675 base::Unretained(this))); | 662 base::Unretained(this))); |
676 if (compositor_needs_continuous_invalidate_) { | 663 ui_task_runner_->PostDelayedTask( |
677 ui_task_runner_->PostDelayedTask( | 664 FROM_HERE, fallback_tick_fired_.callback(), |
678 FROM_HERE, | 665 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); |
679 fallback_tick_fired_.callback(), | |
680 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); | |
681 } else { | |
682 // Pretend we just composited to unblock further invalidates. | |
683 DidComposite(); | |
684 } | |
685 } | 666 } |
686 | 667 |
687 void BrowserViewRenderer::FallbackTickFired() { | 668 void BrowserViewRenderer::FallbackTickFired() { |
688 TRACE_EVENT1("android_webview", | 669 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired"); |
689 "BrowserViewRenderer::FallbackTickFired", | |
690 "compositor_needs_continuous_invalidate_", | |
691 compositor_needs_continuous_invalidate_); | |
692 | |
693 // This should only be called if OnDraw or DrawGL did not come in time, which | 670 // This should only be called if OnDraw or DrawGL did not come in time, which |
694 // means block_invalidates_ must still be true. | 671 // means fallback_tick_pending_ must still be true. |
695 DCHECK(block_invalidates_); | 672 DCHECK(fallback_tick_pending_); |
673 fallback_tick_fired_.Cancel(); | |
696 fallback_tick_pending_ = false; | 674 fallback_tick_pending_ = false; |
697 if (compositor_needs_continuous_invalidate_ && compositor_) { | 675 if (compositor_) { |
698 if (hardware_enabled_) { | 676 if (hardware_enabled_) { |
699 CompositeHw(); | 677 CompositeHw(); |
700 } else { | 678 } else { |
701 ForceFakeCompositeSW(); | 679 ForceFakeCompositeSW(); |
702 } | 680 } |
703 } else { | |
704 // Pretend we just composited to unblock further invalidates. | |
705 DidComposite(); | |
706 } | 681 } |
707 } | 682 } |
708 | 683 |
709 void BrowserViewRenderer::ForceFakeCompositeSW() { | 684 void BrowserViewRenderer::ForceFakeCompositeSW() { |
710 DCHECK(compositor_); | 685 DCHECK(compositor_); |
711 SkBitmap bitmap; | 686 SkBitmap bitmap; |
712 bitmap.allocN32Pixels(1, 1); | 687 bitmap.allocN32Pixels(1, 1); |
713 bitmap.eraseColor(0); | 688 bitmap.eraseColor(0); |
714 SkCanvas canvas(bitmap); | 689 SkCanvas canvas(bitmap); |
715 CompositeSW(&canvas); | 690 CompositeSW(&canvas); |
716 } | 691 } |
717 | 692 |
718 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { | 693 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { |
719 DCHECK(compositor_); | 694 DCHECK(compositor_); |
720 ReturnResourceFromParent(); | 695 ReturnResourceFromParent(); |
721 bool result = compositor_->DemandDrawSw(canvas); | 696 return compositor_->DemandDrawSw(canvas); |
722 DidComposite(); | |
723 return result; | |
724 } | 697 } |
725 | 698 |
726 void BrowserViewRenderer::DidComposite() { | 699 void BrowserViewRenderer::UpdateCompositorIsActive() { |
727 block_invalidates_ = false; | 700 if (compositor_) |
728 post_fallback_tick_.Cancel(); | 701 compositor_->SetIsActive(!is_paused_ && |
729 fallback_tick_fired_.Cancel(); | 702 (!attached_to_window_ || window_visible_)); |
730 fallback_tick_pending_ = false; | |
731 EnsureContinuousInvalidation(false); | |
732 } | 703 } |
733 | 704 |
734 std::string BrowserViewRenderer::ToString() const { | 705 std::string BrowserViewRenderer::ToString() const { |
735 std::string str; | 706 std::string str; |
736 base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 707 base::StringAppendF(&str, "is_paused: %d ", is_paused_); |
737 base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 708 base::StringAppendF(&str, "view_visible: %d ", view_visible_); |
738 base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 709 base::StringAppendF(&str, "window_visible: %d ", window_visible_); |
739 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 710 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); |
740 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 711 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); |
741 base::StringAppendF(&str, | 712 base::StringAppendF(&str, "fallback_tick_pending: %d ", |
742 "compositor_needs_continuous_invalidate: %d ", | 713 fallback_tick_pending_); |
743 compositor_needs_continuous_invalidate_); | |
744 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); | |
745 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); | 714 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); |
746 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 715 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
747 base::StringAppendF(&str, | 716 base::StringAppendF(&str, |
748 "global visible rect: %s ", | 717 "global visible rect: %s ", |
749 last_on_draw_global_visible_rect_.ToString().c_str()); | 718 last_on_draw_global_visible_rect_.ToString().c_str()); |
750 base::StringAppendF( | 719 base::StringAppendF( |
751 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); | 720 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); |
752 base::StringAppendF(&str, | 721 base::StringAppendF(&str, |
753 "overscroll_rounding_error_: %s ", | 722 "overscroll_rounding_error_: %s ", |
754 overscroll_rounding_error_.ToString().c_str()); | 723 overscroll_rounding_error_.ToString().c_str()); |
755 base::StringAppendF( | 724 base::StringAppendF( |
756 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 725 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
757 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 726 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
758 return str; | 727 return str; |
759 } | 728 } |
760 | 729 |
761 } // namespace android_webview | 730 } // namespace android_webview |
OLD | NEW |