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

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

Issue 646303004: aw: Ensure invalidation when pipeline is stalled (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2171
Patch Set: Created 6 years, 2 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/shared_renderer_state.h" 8 #include "android_webview/browser/shared_renderer_state.h"
9 #include "android_webview/common/aw_switches.h" 9 #include "android_webview/common/aw_switches.h"
10 #include "android_webview/public/browser/draw_gl.h" 10 #include "android_webview/public/browser/draw_gl.h"
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 is_paused_(false), 126 is_paused_(false),
127 view_visible_(false), 127 view_visible_(false),
128 window_visible_(false), 128 window_visible_(false),
129 attached_to_window_(false), 129 attached_to_window_(false),
130 hardware_enabled_(false), 130 hardware_enabled_(false),
131 dip_scale_(0.0), 131 dip_scale_(0.0),
132 page_scale_factor_(1.0), 132 page_scale_factor_(1.0),
133 on_new_picture_enable_(false), 133 on_new_picture_enable_(false),
134 clear_view_(false), 134 clear_view_(false),
135 compositor_needs_continuous_invalidate_(false), 135 compositor_needs_continuous_invalidate_(false),
136 invalidate_after_composite_(false),
136 block_invalidates_(false), 137 block_invalidates_(false),
137 fallback_tick_pending_(false), 138 fallback_tick_pending_(false),
138 width_(0), 139 width_(0),
139 height_(0) { 140 height_(0) {
140 CHECK(web_contents_); 141 CHECK(web_contents_);
141 content::SynchronousCompositor::SetClientForWebContents(web_contents_, this); 142 content::SynchronousCompositor::SetClientForWebContents(web_contents_, this);
142 143
143 // Currently the logic in this class relies on |compositor_| remaining 144 // Currently the logic in this class relies on |compositor_| remaining
144 // NULL until the DidInitializeCompositor() call, hence it is not set here. 145 // NULL until the DidInitializeCompositor() call, hence it is not set here.
145 } 146 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 // Perform a software draw 253 // Perform a software draw
253 return OnDrawSoftware(java_canvas); 254 return OnDrawSoftware(java_canvas);
254 } 255 }
255 256
256 bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) { 257 bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
257 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); 258 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
258 if (!compositor_) 259 if (!compositor_)
259 return false; 260 return false;
260 261
261 shared_renderer_state_->SetScrollOffset(last_on_draw_scroll_offset_); 262 shared_renderer_state_->SetScrollOffset(last_on_draw_scroll_offset_);
262 if (last_on_draw_global_visible_rect_.IsEmpty()) {
263 TRACE_EVENT_INSTANT0("android_webview",
264 "EarlyOut_EmptyVisibleRect",
265 TRACE_EVENT_SCOPE_THREAD);
266 shared_renderer_state_->SetForceInvalidateOnNextDrawGL(true);
267 return client_->RequestDrawGL(java_canvas, false);
268 }
269 263
270 if (!hardware_enabled_) { 264 if (!hardware_enabled_) {
271 hardware_enabled_ = compositor_->InitializeHwDraw(); 265 hardware_enabled_ = compositor_->InitializeHwDraw();
272 if (hardware_enabled_) { 266 if (hardware_enabled_) {
273 tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this); 267 tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this);
274 } 268 }
275 } 269 }
276 if (!hardware_enabled_) 270 if (!hardware_enabled_)
277 return false; 271 return false;
278 272
273 if (last_on_draw_global_visible_rect_.IsEmpty() &&
274 parent_draw_constraints_.surface_rect.IsEmpty()) {
275 TRACE_EVENT_INSTANT0("android_webview",
276 "EarlyOut_EmptyVisibleRect",
277 TRACE_EVENT_SCOPE_THREAD);
278 shared_renderer_state_->SetForceInvalidateOnNextDrawGL(true);
279 return client_->RequestDrawGL(java_canvas, false);
280 }
281
279 ReturnResourceFromParent(); 282 ReturnResourceFromParent();
280 if (shared_renderer_state_->HasCompositorFrame()) { 283 if (shared_renderer_state_->HasCompositorFrame()) {
281 TRACE_EVENT_INSTANT0("android_webview", 284 TRACE_EVENT_INSTANT0("android_webview",
282 "EarlyOut_PreviousFrameUnconsumed", 285 "EarlyOut_PreviousFrameUnconsumed",
283 TRACE_EVENT_SCOPE_THREAD); 286 TRACE_EVENT_SCOPE_THREAD);
284 SkippedCompositeInDraw(); 287 DidSkipCompositeInDraw();
285 return client_->RequestDrawGL(java_canvas, false); 288 return client_->RequestDrawGL(java_canvas, false);
286 } 289 }
287 290
288 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); 291 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
289 if (!frame.get()) 292 if (!frame.get())
290 return false; 293 return false;
291 294
292 shared_renderer_state_->SetCompositorFrame(frame.Pass(), false); 295 shared_renderer_state_->SetCompositorFrame(frame.Pass(), false);
293 GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); 296 GlobalTileManager::GetInstance()->DidUse(tile_manager_key_);
294 return client_->RequestDrawGL(java_canvas, false); 297 return client_->RequestDrawGL(java_canvas, false);
295 } 298 }
296 299
297 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { 300 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() {
298 SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); 301 SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy();
299 RequestMemoryPolicy(new_policy); 302 RequestMemoryPolicy(new_policy);
300 compositor_->SetMemoryPolicy(memory_policy_); 303 compositor_->SetMemoryPolicy(memory_policy_);
301 304
302 parent_draw_constraints_ = shared_renderer_state_->ParentDrawConstraints(); 305 parent_draw_constraints_ = shared_renderer_state_->ParentDrawConstraints();
303 gfx::Size surface_size(width_, height_); 306 gfx::Size surface_size(width_, height_);
304 gfx::Rect viewport(surface_size); 307 gfx::Rect viewport(surface_size);
305 gfx::Rect clip = viewport; 308 gfx::Rect clip = viewport;
306 gfx::Transform transform_for_tile_priority = 309 gfx::Transform transform_for_tile_priority =
307 parent_draw_constraints_.transform; 310 parent_draw_constraints_.transform;
308 311
309 // If the WebView is on a layer, WebView does not know what transform is 312 // If the WebView is on a layer, WebView does not know what transform is
310 // applied onto the layer so global visible rect does not make sense here. 313 // applied onto the layer so global visible rect does not make sense here.
311 // In this case, just use the surface rect for tiling. 314 // In this case, just use the surface rect for tiling.
312 gfx::Rect viewport_rect_for_tile_priority; 315 gfx::Rect viewport_rect_for_tile_priority;
313 if (parent_draw_constraints_.is_layer) 316 if (parent_draw_constraints_.is_layer ||
317 last_on_draw_global_visible_rect_.IsEmpty()) {
314 viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect; 318 viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect;
315 else 319 } else {
316 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; 320 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_;
321 }
317 322
318 scoped_ptr<cc::CompositorFrame> frame = 323 scoped_ptr<cc::CompositorFrame> frame =
319 compositor_->DemandDrawHw(surface_size, 324 compositor_->DemandDrawHw(surface_size,
320 gfx::Transform(), 325 gfx::Transform(),
321 viewport, 326 viewport,
322 clip, 327 clip,
323 viewport_rect_for_tile_priority, 328 viewport_rect_for_tile_priority,
324 transform_for_tile_priority); 329 transform_for_tile_priority);
325 if (frame.get()) 330 if (frame.get())
326 DidComposite(); 331 DidComposite();
327 return frame.Pass(); 332 return frame.Pass();
328 } 333 }
329 334
330 void BrowserViewRenderer::UpdateParentDrawConstraints() { 335 void BrowserViewRenderer::UpdateParentDrawConstraints() {
331 // Post an invalidate if the parent draw constraints are stale and there is 336 // Post an invalidate if the parent draw constraints are stale and there is
332 // no pending invalidate. 337 // no pending invalidate.
333 if (shared_renderer_state_->NeedsForceInvalidateOnNextDrawGL() || 338 bool needs_force_invalidate =
339 shared_renderer_state_->NeedsForceInvalidateOnNextDrawGL();
340 if (needs_force_invalidate ||
334 !parent_draw_constraints_.Equals( 341 !parent_draw_constraints_.Equals(
335 shared_renderer_state_->ParentDrawConstraints())) { 342 shared_renderer_state_->ParentDrawConstraints())) {
336 shared_renderer_state_->SetForceInvalidateOnNextDrawGL(false); 343 shared_renderer_state_->SetForceInvalidateOnNextDrawGL(false);
337 EnsureContinuousInvalidation(true, false); 344 EnsureContinuousInvalidation(true, needs_force_invalidate);
338 } 345 }
339 } 346 }
340 347
341 void BrowserViewRenderer::ReturnUnusedResource( 348 void BrowserViewRenderer::ReturnUnusedResource(
342 scoped_ptr<cc::CompositorFrame> frame) { 349 scoped_ptr<cc::CompositorFrame> frame) {
343 if (!frame.get()) 350 if (!frame.get())
344 return; 351 return;
345 352
346 cc::CompositorFrameAck frame_ack; 353 cc::CompositorFrameAck frame_ack;
347 cc::TransferableResource::ReturnResources( 354 cc::TransferableResource::ReturnResources(
348 frame->delegated_frame_data->resource_list, &frame_ack.resources); 355 frame->delegated_frame_data->resource_list, &frame_ack.resources);
349 if (compositor_ && !frame_ack.resources.empty()) 356 if (compositor_ && !frame_ack.resources.empty())
350 compositor_->ReturnResources(frame_ack); 357 compositor_->ReturnResources(frame_ack);
351 } 358 }
352 359
353 void BrowserViewRenderer::ReturnResourceFromParent() { 360 void BrowserViewRenderer::ReturnResourceFromParent() {
354 cc::CompositorFrameAck frame_ack; 361 cc::CompositorFrameAck frame_ack;
355 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources); 362 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources);
356 if (compositor_ && !frame_ack.resources.empty()) { 363 if (compositor_ && !frame_ack.resources.empty()) {
357 compositor_->ReturnResources(frame_ack); 364 compositor_->ReturnResources(frame_ack);
358 } 365 }
359 } 366 }
360 367
368 void BrowserViewRenderer::DidSkipCommitFrame() {
369 // Treat it the same way as skipping onDraw.
370 DidSkipCompositeInDraw();
371 }
372
361 bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) { 373 bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) {
362 if (!compositor_) { 374 if (!compositor_) {
363 TRACE_EVENT_INSTANT0( 375 TRACE_EVENT_INSTANT0(
364 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); 376 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD);
365 return false; 377 return false;
366 } 378 }
367 379
368 // TODO(hush): right now webview size is passed in as the auxiliary bitmap 380 // TODO(hush): right now webview size is passed in as the auxiliary bitmap
369 // size, which might hurt performace (only for software draws with auxiliary 381 // size, which might hurt performace (only for software draws with auxiliary
370 // bitmap). For better performance, get global visible rect, transform it 382 // bitmap). For better performance, get global visible rect, transform it
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( 709 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d(
698 scaled_overscroll_delta + overscroll_rounding_error_); 710 scaled_overscroll_delta + overscroll_rounding_error_);
699 overscroll_rounding_error_ = 711 overscroll_rounding_error_ =
700 scaled_overscroll_delta - rounded_overscroll_delta; 712 scaled_overscroll_delta - rounded_overscroll_delta;
701 client_->DidOverscroll(rounded_overscroll_delta); 713 client_->DidOverscroll(rounded_overscroll_delta);
702 } 714 }
703 715
704 void BrowserViewRenderer::EnsureContinuousInvalidation( 716 void BrowserViewRenderer::EnsureContinuousInvalidation(
705 bool force_invalidate, 717 bool force_invalidate,
706 bool skip_reschedule_tick) { 718 bool skip_reschedule_tick) {
719 if (force_invalidate)
720 invalidate_after_composite_ = true;
721
707 // This method should be called again when any of these conditions change. 722 // This method should be called again when any of these conditions change.
708 bool need_invalidate = 723 bool need_invalidate =
709 compositor_needs_continuous_invalidate_ || force_invalidate; 724 compositor_needs_continuous_invalidate_ || invalidate_after_composite_;
710 if (!need_invalidate || block_invalidates_) 725 if (!need_invalidate || block_invalidates_)
711 return; 726 return;
712 727
728 if (!compositor_needs_continuous_invalidate_ && invalidate_after_composite_)
729 invalidate_after_composite_ = false;
730
713 // Always call view invalidate. We rely the Android framework to ignore the 731 // Always call view invalidate. We rely the Android framework to ignore the
714 // invalidate when it's not needed such as when view is not visible. 732 // invalidate when it's not needed such as when view is not visible.
715 client_->PostInvalidate(); 733 client_->PostInvalidate();
716 734
717 // Stop fallback ticks when one of these is true. 735 // Stop fallback ticks when one of these is true.
718 // 1) Webview is paused. Also need to check we are not in clear view since 736 // 1) Webview is paused. Also need to check we are not in clear view since
719 // paused, offscreen still expect clear view to recover. 737 // paused, offscreen still expect clear view to recover.
720 // 2) If we are attached to window and the window is not visible (eg when 738 // 2) If we are attached to window and the window is not visible (eg when
721 // app is in the background). We are sure in this case the webview is used 739 // app is in the background). We are sure in this case the webview is used
722 // "on-screen" but that updates are not needed when in the background. 740 // "on-screen" but that updates are not needed when in the background.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 } 823 }
806 824
807 void BrowserViewRenderer::DidComposite() { 825 void BrowserViewRenderer::DidComposite() {
808 block_invalidates_ = false; 826 block_invalidates_ = false;
809 post_fallback_tick_.Cancel(); 827 post_fallback_tick_.Cancel();
810 fallback_tick_fired_.Cancel(); 828 fallback_tick_fired_.Cancel();
811 fallback_tick_pending_ = false; 829 fallback_tick_pending_ = false;
812 EnsureContinuousInvalidation(false, false); 830 EnsureContinuousInvalidation(false, false);
813 } 831 }
814 832
815 void BrowserViewRenderer::SkippedCompositeInDraw() { 833 void BrowserViewRenderer::DidSkipCompositeInDraw() {
816 block_invalidates_ = false; 834 block_invalidates_ = false;
817 EnsureContinuousInvalidation(false, true); 835 EnsureContinuousInvalidation(true, true);
818 } 836 }
819 837
820 std::string BrowserViewRenderer::ToString(AwDrawGLInfo* draw_info) const { 838 std::string BrowserViewRenderer::ToString(AwDrawGLInfo* draw_info) const {
821 std::string str; 839 std::string str;
822 base::StringAppendF(&str, "is_paused: %d ", is_paused_); 840 base::StringAppendF(&str, "is_paused: %d ", is_paused_);
823 base::StringAppendF(&str, "view_visible: %d ", view_visible_); 841 base::StringAppendF(&str, "view_visible: %d ", view_visible_);
824 base::StringAppendF(&str, "window_visible: %d ", window_visible_); 842 base::StringAppendF(&str, "window_visible: %d ", window_visible_);
825 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); 843 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_);
826 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); 844 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_);
827 base::StringAppendF(&str, 845 base::StringAppendF(&str,
(...skipping 23 matching lines...) Expand all
851 base::StringAppendF(&str, 869 base::StringAppendF(&str,
852 "surface width height: [%d %d] ", 870 "surface width height: [%d %d] ",
853 draw_info->width, 871 draw_info->width,
854 draw_info->height); 872 draw_info->height);
855 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); 873 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer);
856 } 874 }
857 return str; 875 return str;
858 } 876 }
859 877
860 } // namespace android_webview 878 } // 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