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

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

Issue 1782093002: Move fallback tick handling to compositor thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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 <utility> 7 #include <utility>
8 8
9 #include "android_webview/browser/browser_view_renderer_client.h" 9 #include "android_webview/browser/browser_view_renderer_client.h"
10 #include "android_webview/browser/child_frame.h" 10 #include "android_webview/browser/child_frame.h"
(...skipping 14 matching lines...) Expand all
25 #include "third_party/skia/include/core/SkPictureRecorder.h" 25 #include "third_party/skia/include/core/SkPictureRecorder.h"
26 #include "ui/gfx/geometry/scroll_offset.h" 26 #include "ui/gfx/geometry/scroll_offset.h"
27 #include "ui/gfx/geometry/vector2d_conversions.h" 27 #include "ui/gfx/geometry/vector2d_conversions.h"
28 28
29 namespace android_webview { 29 namespace android_webview {
30 30
31 namespace { 31 namespace {
32 32
33 const double kEpsilon = 1e-8; 33 const double kEpsilon = 1e-8;
34 34
35 const int64_t kFallbackTickTimeoutInMilliseconds = 100;
36
37 // Used to calculate memory allocation. Determined experimentally. 35 // Used to calculate memory allocation. Determined experimentally.
38 const size_t kMemoryMultiplier = 20; 36 const size_t kMemoryMultiplier = 20;
39 const size_t kBytesPerPixel = 4; 37 const size_t kBytesPerPixel = 4;
40 const size_t kMemoryAllocationStep = 5 * 1024 * 1024; 38 const size_t kMemoryAllocationStep = 5 * 1024 * 1024;
41 uint64_t g_memory_override_in_bytes = 0u; 39 uint64_t g_memory_override_in_bytes = 0u;
42 40
43 const void* const kBrowserViewRendererUserDataKey = 41 const void* const kBrowserViewRendererUserDataKey =
44 &kBrowserViewRendererUserDataKey; 42 &kBrowserViewRendererUserDataKey;
45 43
46 class BrowserViewRendererUserData : public base::SupportsUserData::Data { 44 class BrowserViewRendererUserData : public base::SupportsUserData::Data {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 window_visible_(false), 97 window_visible_(false),
100 attached_to_window_(false), 98 attached_to_window_(false),
101 hardware_enabled_(false), 99 hardware_enabled_(false),
102 dip_scale_(0.f), 100 dip_scale_(0.f),
103 page_scale_factor_(1.f), 101 page_scale_factor_(1.f),
104 min_page_scale_factor_(0.f), 102 min_page_scale_factor_(0.f),
105 max_page_scale_factor_(0.f), 103 max_page_scale_factor_(0.f),
106 on_new_picture_enable_(false), 104 on_new_picture_enable_(false),
107 clear_view_(false), 105 clear_view_(false),
108 offscreen_pre_raster_(false), 106 offscreen_pre_raster_(false),
109 fallback_tick_pending_(false),
110 next_compositor_id_(1) {} 107 next_compositor_id_(1) {}
111 108
112 BrowserViewRenderer::~BrowserViewRenderer() { 109 BrowserViewRenderer::~BrowserViewRenderer() {
113 DCHECK(compositor_map_.empty()); 110 DCHECK(compositor_map_.empty());
114 } 111 }
115 112
116 void BrowserViewRenderer::RegisterWithWebContents( 113 void BrowserViewRenderer::RegisterWithWebContents(
117 content::WebContents* web_contents) { 114 content::WebContents* web_contents) {
118 web_contents->SetUserData(kBrowserViewRendererUserDataKey, 115 web_contents->SetUserData(kBrowserViewRendererUserDataKey,
119 new BrowserViewRendererUserData(this)); 116 new BrowserViewRendererUserData(this));
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 222
226 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); 223 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI();
227 224
228 if (!CanOnDraw()) { 225 if (!CanOnDraw()) {
229 return false; 226 return false;
230 } 227 }
231 228
232 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); 229 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_);
233 hardware_enabled_ = true; 230 hardware_enabled_ = true;
234 231
235 return CompositeHw();
236 }
237
238 bool BrowserViewRenderer::CompositeHw() {
239 CancelFallbackTick();
240
241 ReturnResourceFromParent(); 232 ReturnResourceFromParent();
242 UpdateMemoryPolicy(); 233 UpdateMemoryPolicy();
243 234
244 ParentCompositorDrawConstraints parent_draw_constraints = 235 ParentCompositorDrawConstraints parent_draw_constraints =
245 shared_renderer_state_.GetParentDrawConstraintsOnUI(); 236 shared_renderer_state_.GetParentDrawConstraintsOnUI();
246 gfx::Size surface_size(size_); 237 gfx::Size surface_size(size_);
247 gfx::Rect viewport(surface_size); 238 gfx::Rect viewport(surface_size);
248 gfx::Rect clip = viewport; 239 gfx::Rect clip = viewport;
249 gfx::Transform transform_for_tile_priority = 240 gfx::Transform transform_for_tile_priority =
250 parent_draw_constraints.transform; 241 parent_draw_constraints.transform;
(...skipping 19 matching lines...) Expand all
270 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", 261 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame",
271 TRACE_EVENT_SCOPE_THREAD); 262 TRACE_EVENT_SCOPE_THREAD);
272 return shared_renderer_state_.HasFrameOnUI(); 263 return shared_renderer_state_.HasFrameOnUI();
273 } 264 }
274 265
275 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame( 266 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame(
276 std::move(frame), GetCompositorID(compositor_), 267 std::move(frame), GetCompositorID(compositor_),
277 viewport_rect_for_tile_priority.IsEmpty(), transform_for_tile_priority, 268 viewport_rect_for_tile_priority.IsEmpty(), transform_for_tile_priority,
278 offscreen_pre_raster_, parent_draw_constraints.is_layer)); 269 offscreen_pre_raster_, parent_draw_constraints.is_layer));
279 270
280 // Uncommitted frame can happen with consecutive fallback ticks.
281 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); 271 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
282 shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame)); 272 shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame));
283 return true; 273 return true;
284 } 274 }
285 275
286 void BrowserViewRenderer::UpdateParentDrawConstraints() { 276 void BrowserViewRenderer::UpdateParentDrawConstraints() {
287 PostInvalidateWithFallback(); 277 PostInvalidate();
288 ParentCompositorDrawConstraints parent_draw_constraints = 278 ParentCompositorDrawConstraints parent_draw_constraints =
289 shared_renderer_state_.GetParentDrawConstraintsOnUI(); 279 shared_renderer_state_.GetParentDrawConstraintsOnUI();
290 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); 280 client_->ParentDrawConstraintsUpdated(parent_draw_constraints);
291 } 281 }
292 282
293 void BrowserViewRenderer::ReturnUnusedResource( 283 void BrowserViewRenderer::ReturnUnusedResource(
294 scoped_ptr<ChildFrame> child_frame) { 284 scoped_ptr<ChildFrame> child_frame) {
295 if (!child_frame.get() || !child_frame->frame.get()) 285 if (!child_frame.get() || !child_frame->frame.get())
296 return; 286 return;
297 287
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 350
361 void BrowserViewRenderer::ClearView() { 351 void BrowserViewRenderer::ClearView() {
362 TRACE_EVENT_INSTANT0("android_webview", 352 TRACE_EVENT_INSTANT0("android_webview",
363 "BrowserViewRenderer::ClearView", 353 "BrowserViewRenderer::ClearView",
364 TRACE_EVENT_SCOPE_THREAD); 354 TRACE_EVENT_SCOPE_THREAD);
365 if (clear_view_) 355 if (clear_view_)
366 return; 356 return;
367 357
368 clear_view_ = true; 358 clear_view_ = true;
369 // Always invalidate ignoring the compositor to actually clear the webview. 359 // Always invalidate ignoring the compositor to actually clear the webview.
370 PostInvalidateWithFallback(); 360 PostInvalidate();
371 } 361 }
372 362
373 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { 363 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) {
374 if (offscreen_pre_raster_ != enable && compositor_) 364 if (offscreen_pre_raster_ != enable && compositor_)
375 UpdateMemoryPolicy(); 365 UpdateMemoryPolicy();
376 366
377 offscreen_pre_raster_ = enable; 367 offscreen_pre_raster_ = enable;
378 } 368 }
379 369
380 void BrowserViewRenderer::SetIsPaused(bool paused) { 370 void BrowserViewRenderer::SetIsPaused(bool paused) {
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 scaled_overscroll_delta - rounded_overscroll_delta; 683 scaled_overscroll_delta - rounded_overscroll_delta;
694 gfx::Vector2dF fling_velocity_pixels = 684 gfx::Vector2dF fling_velocity_pixels =
695 gfx::ScaleVector2d(current_fling_velocity, physical_pixel_scale); 685 gfx::ScaleVector2d(current_fling_velocity, physical_pixel_scale);
696 686
697 client_->DidOverscroll(rounded_overscroll_delta, fling_velocity_pixels); 687 client_->DidOverscroll(rounded_overscroll_delta, fling_velocity_pixels);
698 } 688 }
699 689
700 void BrowserViewRenderer::PostInvalidate() { 690 void BrowserViewRenderer::PostInvalidate() {
701 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", 691 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate",
702 TRACE_EVENT_SCOPE_THREAD); 692 TRACE_EVENT_SCOPE_THREAD);
703 PostInvalidateWithFallback();
704 }
705
706 void BrowserViewRenderer::PostInvalidateWithFallback() {
707 // Always call view invalidate. We rely the Android framework to ignore the
708 // invalidate when it's not needed such as when view is not visible.
709 client_->PostInvalidate(); 693 client_->PostInvalidate();
710
711 // Stop fallback ticks when one of these is true.
712 // 1) Webview is paused. Also need to check we are not in clear view since
713 // paused, offscreen still expect clear view to recover.
714 // 2) If we are attached to window and the window is not visible (eg when
715 // app is in the background). We are sure in this case the webview is used
716 // "on-screen" but that updates are not needed when in the background.
717 bool throttle_fallback_tick =
718 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_);
boliu 2016/03/11 17:43:09 So, according to IsClientVisible, visible = !is_pa
719
720 if (throttle_fallback_tick || fallback_tick_pending_)
721 return;
722
723 DCHECK(post_fallback_tick_.IsCancelled());
724 DCHECK(fallback_tick_fired_.IsCancelled());
725
726 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick,
727 base::Unretained(this)));
728 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback());
729 fallback_tick_pending_ = true;
730 }
731
732 void BrowserViewRenderer::CancelFallbackTick() {
733 post_fallback_tick_.Cancel();
734 fallback_tick_fired_.Cancel();
735 fallback_tick_pending_ = false;
736 }
737
738 void BrowserViewRenderer::PostFallbackTick() {
739 DCHECK(fallback_tick_fired_.IsCancelled());
740 TRACE_EVENT0("android_webview", "BrowserViewRenderer::PostFallbackTick");
741 post_fallback_tick_.Cancel();
742 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired,
743 base::Unretained(this)));
744 ui_task_runner_->PostDelayedTask(
745 FROM_HERE, fallback_tick_fired_.callback(),
746 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds));
747 }
748
749 void BrowserViewRenderer::FallbackTickFired() {
750 TRACE_EVENT0("android_webview", "BrowserViewRenderer::FallbackTickFired");
751 // This should only be called if OnDraw or DrawGL did not come in time, which
752 // means fallback_tick_pending_ must still be true.
753 DCHECK(fallback_tick_pending_);
754 fallback_tick_fired_.Cancel();
755 fallback_tick_pending_ = false;
756 if (compositor_) {
757 if (hardware_enabled_ && !size_.IsEmpty()) {
758 CompositeHw();
759 } else {
760 ForceFakeCompositeSW();
761 }
762 }
763 }
764
765 void BrowserViewRenderer::ForceFakeCompositeSW() {
766 DCHECK(compositor_);
767 SkBitmap bitmap;
768 bitmap.allocN32Pixels(1, 1);
769 bitmap.eraseColor(0);
770 SkCanvas canvas(bitmap);
771 CompositeSW(&canvas);
772 } 694 }
773 695
774 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { 696 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
775 DCHECK(compositor_); 697 DCHECK(compositor_);
776 CancelFallbackTick();
777 ReturnResourceFromParent(); 698 ReturnResourceFromParent();
778 return compositor_->DemandDrawSw(canvas); 699 return compositor_->DemandDrawSw(canvas);
779 } 700 }
780 701
781 void BrowserViewRenderer::UpdateCompositorIsActive() { 702 void BrowserViewRenderer::UpdateCompositorIsActive() {
782 if (compositor_) { 703 if (compositor_) {
783 compositor_->SetIsActive(!is_paused_ && 704 compositor_->SetIsActive(!is_paused_ &&
784 (!attached_to_window_ || window_visible_)); 705 (!attached_to_window_ || window_visible_));
785 } 706 }
786 } 707 }
787 708
788 std::string BrowserViewRenderer::ToString() const { 709 std::string BrowserViewRenderer::ToString() const {
789 std::string str; 710 std::string str;
790 base::StringAppendF(&str, "is_paused: %d ", is_paused_); 711 base::StringAppendF(&str, "is_paused: %d ", is_paused_);
791 base::StringAppendF(&str, "view_visible: %d ", view_visible_); 712 base::StringAppendF(&str, "view_visible: %d ", view_visible_);
792 base::StringAppendF(&str, "window_visible: %d ", window_visible_); 713 base::StringAppendF(&str, "window_visible: %d ", window_visible_);
793 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); 714 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_);
794 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); 715 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_);
795 base::StringAppendF(&str, "fallback_tick_pending: %d ",
796 fallback_tick_pending_);
797 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); 716 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str());
798 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); 717 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_);
799 base::StringAppendF(&str, 718 base::StringAppendF(&str,
800 "global visible rect: %s ", 719 "global visible rect: %s ",
801 last_on_draw_global_visible_rect_.ToString().c_str()); 720 last_on_draw_global_visible_rect_.ToString().c_str());
802 base::StringAppendF( 721 base::StringAppendF(
803 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); 722 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str());
804 base::StringAppendF(&str, 723 base::StringAppendF(&str,
805 "overscroll_rounding_error_: %s ", 724 "overscroll_rounding_error_: %s ",
806 overscroll_rounding_error_.ToString().c_str()); 725 overscroll_rounding_error_.ToString().c_str());
807 base::StringAppendF( 726 base::StringAppendF(
808 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 727 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
809 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 728 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
810 return str; 729 return str;
811 } 730 }
812 731
813 } // namespace android_webview 732 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698