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

Side by Side Diff: android_webview/browser/browser_view_renderer.cc

Issue 817603002: cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small fix after rebase. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/browser/browser_view_renderer.h" 5 #include "android_webview/browser/browser_view_renderer.h"
6 6
7 #include "android_webview/browser/browser_view_renderer_client.h" 7 #include "android_webview/browser/browser_view_renderer_client.h"
8 #include "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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698