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

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

Issue 1055743002: Revert of cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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),
101 fallback_tick_pending_(false) { 103 fallback_tick_pending_(false) {
102 } 104 }
103 105
104 BrowserViewRenderer::~BrowserViewRenderer() { 106 BrowserViewRenderer::~BrowserViewRenderer() {
105 } 107 }
106 108
107 void BrowserViewRenderer::RegisterWithWebContents( 109 void BrowserViewRenderer::RegisterWithWebContents(
108 content::WebContents* web_contents) { 110 content::WebContents* web_contents) {
109 web_contents->SetUserData(kBrowserViewRendererUserDataKey, 111 web_contents->SetUserData(kBrowserViewRendererUserDataKey,
110 new BrowserViewRendererUserData(this)); 112 new BrowserViewRendererUserData(this));
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", 191 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView",
190 TRACE_EVENT_SCOPE_THREAD); 192 TRACE_EVENT_SCOPE_THREAD);
191 return false; 193 return false;
192 } 194 }
193 195
194 return true; 196 return true;
195 } 197 }
196 198
197 bool BrowserViewRenderer::OnDrawHardware() { 199 bool BrowserViewRenderer::OnDrawHardware() {
198 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); 200 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
199
200 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); 201 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI();
201 202
202 if (!CanOnDraw()) { 203 if (!CanOnDraw()) {
203 return false; 204 return false;
204 } 205 }
205 206
206 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); 207 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_);
207 208
208 if (!hardware_enabled_) { 209 if (!hardware_enabled_) {
209 TRACE_EVENT0("android_webview", "InitializeHwDraw"); 210 TRACE_EVENT0("android_webview", "InitializeHwDraw");
210 hardware_enabled_ = compositor_->InitializeHwDraw(); 211 hardware_enabled_ = compositor_->InitializeHwDraw();
211 } 212 }
212 if (!hardware_enabled_) { 213 if (!hardware_enabled_) {
213 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled", 214 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_HardwareNotEnabled",
214 TRACE_EVENT_SCOPE_THREAD); 215 TRACE_EVENT_SCOPE_THREAD);
215 return false; 216 return false;
216 } 217 }
217 218
218 return CompositeHw(); 219 return CompositeHw();
219 } 220 }
220 221
221 bool BrowserViewRenderer::CompositeHw() { 222 bool BrowserViewRenderer::CompositeHw() {
222 CancelFallbackTick();
223
224 ReturnResourceFromParent(); 223 ReturnResourceFromParent();
225 compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); 224 compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy());
226 225
227 ParentCompositorDrawConstraints parent_draw_constraints = 226 ParentCompositorDrawConstraints parent_draw_constraints =
228 shared_renderer_state_.GetParentDrawConstraintsOnUI(); 227 shared_renderer_state_.GetParentDrawConstraintsOnUI();
229 gfx::Size surface_size(size_); 228 gfx::Size surface_size(size_);
230 gfx::Rect viewport(surface_size); 229 gfx::Rect viewport(surface_size);
231 gfx::Rect clip = viewport; 230 gfx::Rect clip = viewport;
232 gfx::Transform transform_for_tile_priority = 231 gfx::Transform transform_for_tile_priority =
233 parent_draw_constraints.transform; 232 parent_draw_constraints.transform;
(...skipping 23 matching lines...) Expand all
257 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", 256 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame",
258 TRACE_EVENT_SCOPE_THREAD); 257 TRACE_EVENT_SCOPE_THREAD);
259 return false; 258 return false;
260 } 259 }
261 260
262 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( 261 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(
263 new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, 262 new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority,
264 transform_for_tile_priority, offscreen_pre_raster_, 263 transform_for_tile_priority, offscreen_pre_raster_,
265 parent_draw_constraints.is_layer)); 264 parent_draw_constraints.is_layer));
266 265
266 DidComposite();
267 // Uncommitted frame can happen with consecutive fallback ticks. 267 // Uncommitted frame can happen with consecutive fallback ticks.
268 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); 268 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
269 shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass()); 269 shared_renderer_state_.SetCompositorFrameOnUI(child_frame.Pass());
270 return true; 270 return true;
271 } 271 }
272 272
273 void BrowserViewRenderer::UpdateParentDrawConstraints() { 273 void BrowserViewRenderer::UpdateParentDrawConstraints() {
274 PostInvalidateWithFallback(); 274 EnsureContinuousInvalidation(true);
275 ParentCompositorDrawConstraints parent_draw_constraints = 275 ParentCompositorDrawConstraints parent_draw_constraints =
276 shared_renderer_state_.GetParentDrawConstraintsOnUI(); 276 shared_renderer_state_.GetParentDrawConstraintsOnUI();
277 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); 277 client_->ParentDrawConstraintsUpdated(parent_draw_constraints);
278 } 278 }
279 279
280 void BrowserViewRenderer::ReturnUnusedResource( 280 void BrowserViewRenderer::ReturnUnusedResource(
281 scoped_ptr<ChildFrame> child_frame) { 281 scoped_ptr<ChildFrame> child_frame) {
282 if (!child_frame.get() || !child_frame->frame.get()) 282 if (!child_frame.get() || !child_frame->frame.get())
283 return; 283 return;
284 284
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 335
336 void BrowserViewRenderer::ClearView() { 336 void BrowserViewRenderer::ClearView() {
337 TRACE_EVENT_INSTANT0("android_webview", 337 TRACE_EVENT_INSTANT0("android_webview",
338 "BrowserViewRenderer::ClearView", 338 "BrowserViewRenderer::ClearView",
339 TRACE_EVENT_SCOPE_THREAD); 339 TRACE_EVENT_SCOPE_THREAD);
340 if (clear_view_) 340 if (clear_view_)
341 return; 341 return;
342 342
343 clear_view_ = true; 343 clear_view_ = true;
344 // Always invalidate ignoring the compositor to actually clear the webview. 344 // Always invalidate ignoring the compositor to actually clear the webview.
345 PostInvalidateWithFallback(); 345 EnsureContinuousInvalidation(true);
346 } 346 }
347 347
348 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { 348 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) {
349 // TODO(hush): anything to do when the setting is toggled? 349 // TODO(hush): anything to do when the setting is toggled?
350 offscreen_pre_raster_ = enable; 350 offscreen_pre_raster_ = enable;
351 } 351 }
352 352
353 void BrowserViewRenderer::SetIsPaused(bool paused) { 353 void BrowserViewRenderer::SetIsPaused(bool paused) {
354 TRACE_EVENT_INSTANT1("android_webview", 354 TRACE_EVENT_INSTANT1("android_webview",
355 "BrowserViewRenderer::SetIsPaused", 355 "BrowserViewRenderer::SetIsPaused",
356 TRACE_EVENT_SCOPE_THREAD, 356 TRACE_EVENT_SCOPE_THREAD,
357 "paused", 357 "paused",
358 paused); 358 paused);
359 is_paused_ = paused; 359 is_paused_ = paused;
360 UpdateCompositorIsActive(); 360 EnsureContinuousInvalidation(false);
361 } 361 }
362 362
363 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { 363 void BrowserViewRenderer::SetViewVisibility(bool view_visible) {
364 TRACE_EVENT_INSTANT1("android_webview", 364 TRACE_EVENT_INSTANT1("android_webview",
365 "BrowserViewRenderer::SetViewVisibility", 365 "BrowserViewRenderer::SetViewVisibility",
366 TRACE_EVENT_SCOPE_THREAD, 366 TRACE_EVENT_SCOPE_THREAD,
367 "view_visible", 367 "view_visible",
368 view_visible); 368 view_visible);
369 view_visible_ = view_visible; 369 view_visible_ = view_visible;
370 } 370 }
371 371
372 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { 372 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) {
373 TRACE_EVENT_INSTANT1("android_webview", 373 TRACE_EVENT_INSTANT1("android_webview",
374 "BrowserViewRenderer::SetWindowVisibility", 374 "BrowserViewRenderer::SetWindowVisibility",
375 TRACE_EVENT_SCOPE_THREAD, 375 TRACE_EVENT_SCOPE_THREAD,
376 "window_visible", 376 "window_visible",
377 window_visible); 377 window_visible);
378 window_visible_ = window_visible; 378 window_visible_ = window_visible;
379 UpdateCompositorIsActive(); 379 EnsureContinuousInvalidation(false);
380 } 380 }
381 381
382 void BrowserViewRenderer::OnSizeChanged(int width, int height) { 382 void BrowserViewRenderer::OnSizeChanged(int width, int height) {
383 TRACE_EVENT_INSTANT2("android_webview", 383 TRACE_EVENT_INSTANT2("android_webview",
384 "BrowserViewRenderer::OnSizeChanged", 384 "BrowserViewRenderer::OnSizeChanged",
385 TRACE_EVENT_SCOPE_THREAD, 385 TRACE_EVENT_SCOPE_THREAD,
386 "width", 386 "width",
387 width, 387 width,
388 "height", 388 "height",
389 height); 389 height);
390 size_.SetSize(width, height); 390 size_.SetSize(width, height);
391 } 391 }
392 392
393 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { 393 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) {
394 TRACE_EVENT2("android_webview", 394 TRACE_EVENT2("android_webview",
395 "BrowserViewRenderer::OnAttachedToWindow", 395 "BrowserViewRenderer::OnAttachedToWindow",
396 "width", 396 "width",
397 width, 397 width,
398 "height", 398 "height",
399 height); 399 height);
400 attached_to_window_ = true; 400 attached_to_window_ = true;
401 size_.SetSize(width, height); 401 size_.SetSize(width, height);
402 UpdateCompositorIsActive();
403 } 402 }
404 403
405 void BrowserViewRenderer::OnDetachedFromWindow() { 404 void BrowserViewRenderer::OnDetachedFromWindow() {
406 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); 405 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow");
407 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); 406 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
408 attached_to_window_ = false; 407 attached_to_window_ = false;
409 DCHECK(!hardware_enabled_); 408 DCHECK(!hardware_enabled_);
410 UpdateCompositorIsActive();
411 } 409 }
412 410
413 void BrowserViewRenderer::ReleaseHardware() { 411 void BrowserViewRenderer::ReleaseHardware() {
414 DCHECK(hardware_enabled_); 412 DCHECK(hardware_enabled_);
415 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); 413 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
416 ReturnResourceFromParent(); 414 ReturnResourceFromParent();
417 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); 415 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI());
418 416
419 if (compositor_) { 417 if (compositor_) {
420 compositor_->ReleaseHwDraw(); 418 compositor_->ReleaseHwDraw();
(...skipping 11 matching lines...) Expand all
432 return gfx::Rect(client_->GetLocationOnScreen(), size_); 430 return gfx::Rect(client_->GetLocationOnScreen(), size_);
433 } 431 }
434 432
435 void BrowserViewRenderer::DidInitializeCompositor( 433 void BrowserViewRenderer::DidInitializeCompositor(
436 content::SynchronousCompositor* compositor) { 434 content::SynchronousCompositor* compositor) {
437 TRACE_EVENT0("android_webview", 435 TRACE_EVENT0("android_webview",
438 "BrowserViewRenderer::DidInitializeCompositor"); 436 "BrowserViewRenderer::DidInitializeCompositor");
439 DCHECK(compositor); 437 DCHECK(compositor);
440 DCHECK(!compositor_); 438 DCHECK(!compositor_);
441 compositor_ = compositor; 439 compositor_ = compositor;
442 UpdateCompositorIsActive();
443 } 440 }
444 441
445 void BrowserViewRenderer::DidDestroyCompositor( 442 void BrowserViewRenderer::DidDestroyCompositor(
446 content::SynchronousCompositor* compositor) { 443 content::SynchronousCompositor* compositor) {
447 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); 444 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor");
448 DCHECK(compositor_); 445 DCHECK(compositor_);
449 compositor_ = NULL; 446 compositor_ = NULL;
450 } 447 }
451 448
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
452 void BrowserViewRenderer::SetDipScale(float dip_scale) { 463 void BrowserViewRenderer::SetDipScale(float dip_scale) {
453 dip_scale_ = dip_scale; 464 dip_scale_ = dip_scale;
454 CHECK_GT(dip_scale_, 0.f); 465 CHECK_GT(dip_scale_, 0.f);
455 } 466 }
456 467
457 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { 468 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const {
458 DCHECK_GT(dip_scale_, 0.f); 469 DCHECK_GT(dip_scale_, 0.f);
459 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( 470 return gfx::ToCeiledVector2d(gfx::ScaleVector2d(
460 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); 471 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_));
461 } 472 }
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 overscroll_rounding_error_ = gfx::Vector2dF(); 620 overscroll_rounding_error_ = gfx::Vector2dF();
610 gfx::Vector2dF scaled_overscroll_delta = 621 gfx::Vector2dF scaled_overscroll_delta =
611 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); 622 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale);
612 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( 623 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d(
613 scaled_overscroll_delta + overscroll_rounding_error_); 624 scaled_overscroll_delta + overscroll_rounding_error_);
614 overscroll_rounding_error_ = 625 overscroll_rounding_error_ =
615 scaled_overscroll_delta - rounded_overscroll_delta; 626 scaled_overscroll_delta - rounded_overscroll_delta;
616 client_->DidOverscroll(rounded_overscroll_delta); 627 client_->DidOverscroll(rounded_overscroll_delta);
617 } 628 }
618 629
619 void BrowserViewRenderer::PostInvalidate() { 630 void BrowserViewRenderer::EnsureContinuousInvalidation(bool force_invalidate) {
620 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", 631 // This method should be called again when any of these conditions change.
621 TRACE_EVENT_SCOPE_THREAD); 632 bool need_invalidate =
622 PostInvalidateWithFallback(); 633 compositor_needs_continuous_invalidate_ || force_invalidate;
623 } 634 if (!need_invalidate || block_invalidates_)
635 return;
624 636
625 void BrowserViewRenderer::PostInvalidateWithFallback() {
626 // Always call view invalidate. We rely the Android framework to ignore the 637 // Always call view invalidate. We rely the Android framework to ignore the
627 // invalidate when it's not needed such as when view is not visible. 638 // invalidate when it's not needed such as when view is not visible.
628 client_->PostInvalidate(); 639 client_->PostInvalidate();
629 640
630 // Stop fallback ticks when one of these is true. 641 // Stop fallback ticks when one of these is true.
631 // 1) Webview is paused. Also need to check we are not in clear view since 642 // 1) Webview is paused. Also need to check we are not in clear view since
632 // paused, offscreen still expect clear view to recover. 643 // paused, offscreen still expect clear view to recover.
633 // 2) If we are attached to window and the window is not visible (eg when 644 // 2) If we are attached to window and the window is not visible (eg when
634 // app is in the background). We are sure in this case the webview is used 645 // app is in the background). We are sure in this case the webview is used
635 // "on-screen" but that updates are not needed when in the background. 646 // "on-screen" but that updates are not needed when in the background.
636 bool throttle_fallback_tick = 647 bool throttle_fallback_tick =
637 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); 648 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_);
638 649 if (throttle_fallback_tick)
639 if (throttle_fallback_tick || fallback_tick_pending_)
640 return; 650 return;
641 651
642 DCHECK(post_fallback_tick_.IsCancelled()); 652 block_invalidates_ = compositor_needs_continuous_invalidate_;
643 DCHECK(fallback_tick_fired_.IsCancelled()); 653 if (fallback_tick_pending_)
654 return;
644 655
656 // Unretained here is safe because the callbacks are cancelled when
657 // they are destroyed.
645 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, 658 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick,
646 base::Unretained(this))); 659 base::Unretained(this)));
647 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback());
648 fallback_tick_pending_ = true;
649 }
650
651 void BrowserViewRenderer::CancelFallbackTick() {
652 post_fallback_tick_.Cancel();
653 fallback_tick_fired_.Cancel(); 660 fallback_tick_fired_.Cancel();
654 fallback_tick_pending_ = false; 661 fallback_tick_pending_ = false;
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 }
655 } 670 }
656 671
657 void BrowserViewRenderer::PostFallbackTick() { 672 void BrowserViewRenderer::PostFallbackTick() {
658 DCHECK(fallback_tick_fired_.IsCancelled()); 673 DCHECK(fallback_tick_fired_.IsCancelled());
659 TRACE_EVENT0("android_webview", "BrowserViewRenderer::PostFallbackTick");
660 post_fallback_tick_.Cancel();
661 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, 674 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired,
662 base::Unretained(this))); 675 base::Unretained(this)));
663 ui_task_runner_->PostDelayedTask( 676 if (compositor_needs_continuous_invalidate_) {
664 FROM_HERE, fallback_tick_fired_.callback(), 677 ui_task_runner_->PostDelayedTask(
665 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); 678 FROM_HERE,
679 fallback_tick_fired_.callback(),
680 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds));
681 } else {
682 // Pretend we just composited to unblock further invalidates.
683 DidComposite();
684 }
666 } 685 }
667 686
668 void BrowserViewRenderer::FallbackTickFired() { 687 void BrowserViewRenderer::FallbackTickFired() {
669 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired"); 688 TRACE_EVENT1("android_webview",
689 "BrowserViewRenderer::FallbackTickFired",
690 "compositor_needs_continuous_invalidate_",
691 compositor_needs_continuous_invalidate_);
692
670 // This should only be called if OnDraw or DrawGL did not come in time, which 693 // This should only be called if OnDraw or DrawGL did not come in time, which
671 // means fallback_tick_pending_ must still be true. 694 // means block_invalidates_ must still be true.
672 DCHECK(fallback_tick_pending_); 695 DCHECK(block_invalidates_);
673 fallback_tick_fired_.Cancel();
674 fallback_tick_pending_ = false; 696 fallback_tick_pending_ = false;
675 if (compositor_) { 697 if (compositor_needs_continuous_invalidate_ && compositor_) {
676 if (hardware_enabled_) { 698 if (hardware_enabled_) {
677 CompositeHw(); 699 CompositeHw();
678 } else { 700 } else {
679 ForceFakeCompositeSW(); 701 ForceFakeCompositeSW();
680 } 702 }
703 } else {
704 // Pretend we just composited to unblock further invalidates.
705 DidComposite();
681 } 706 }
682 } 707 }
683 708
684 void BrowserViewRenderer::ForceFakeCompositeSW() { 709 void BrowserViewRenderer::ForceFakeCompositeSW() {
685 DCHECK(compositor_); 710 DCHECK(compositor_);
686 SkBitmap bitmap; 711 SkBitmap bitmap;
687 bitmap.allocN32Pixels(1, 1); 712 bitmap.allocN32Pixels(1, 1);
688 bitmap.eraseColor(0); 713 bitmap.eraseColor(0);
689 SkCanvas canvas(bitmap); 714 SkCanvas canvas(bitmap);
690 CompositeSW(&canvas); 715 CompositeSW(&canvas);
691 } 716 }
692 717
693 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { 718 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
694 DCHECK(compositor_); 719 DCHECK(compositor_);
695 CancelFallbackTick();
696 ReturnResourceFromParent(); 720 ReturnResourceFromParent();
697 return compositor_->DemandDrawSw(canvas); 721 bool result = compositor_->DemandDrawSw(canvas);
722 DidComposite();
723 return result;
698 } 724 }
699 725
700 void BrowserViewRenderer::UpdateCompositorIsActive() { 726 void BrowserViewRenderer::DidComposite() {
701 if (compositor_) 727 block_invalidates_ = false;
702 compositor_->SetIsActive(!is_paused_ && 728 post_fallback_tick_.Cancel();
703 (!attached_to_window_ || window_visible_)); 729 fallback_tick_fired_.Cancel();
730 fallback_tick_pending_ = false;
731 EnsureContinuousInvalidation(false);
704 } 732 }
705 733
706 std::string BrowserViewRenderer::ToString() const { 734 std::string BrowserViewRenderer::ToString() const {
707 std::string str; 735 std::string str;
708 base::StringAppendF(&str, "is_paused: %d ", is_paused_); 736 base::StringAppendF(&str, "is_paused: %d ", is_paused_);
709 base::StringAppendF(&str, "view_visible: %d ", view_visible_); 737 base::StringAppendF(&str, "view_visible: %d ", view_visible_);
710 base::StringAppendF(&str, "window_visible: %d ", window_visible_); 738 base::StringAppendF(&str, "window_visible: %d ", window_visible_);
711 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); 739 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_);
712 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); 740 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_);
713 base::StringAppendF(&str, "fallback_tick_pending: %d ", 741 base::StringAppendF(&str,
714 fallback_tick_pending_); 742 "compositor_needs_continuous_invalidate: %d ",
743 compositor_needs_continuous_invalidate_);
744 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_);
715 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); 745 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str());
716 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); 746 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_);
717 base::StringAppendF(&str, 747 base::StringAppendF(&str,
718 "global visible rect: %s ", 748 "global visible rect: %s ",
719 last_on_draw_global_visible_rect_.ToString().c_str()); 749 last_on_draw_global_visible_rect_.ToString().c_str());
720 base::StringAppendF( 750 base::StringAppendF(
721 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); 751 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str());
722 base::StringAppendF(&str, 752 base::StringAppendF(&str,
723 "overscroll_rounding_error_: %s ", 753 "overscroll_rounding_error_: %s ",
724 overscroll_rounding_error_.ToString().c_str()); 754 overscroll_rounding_error_.ToString().c_str());
725 base::StringAppendF( 755 base::StringAppendF(
726 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 756 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
727 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 757 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
728 return str; 758 return str;
729 } 759 }
730 760
731 } // namespace android_webview 761 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/browser/browser_view_renderer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698