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 "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 compositor_(NULL), | 59 compositor_(NULL), |
60 is_paused_(false), | 60 is_paused_(false), |
61 view_visible_(false), | 61 view_visible_(false), |
62 window_visible_(false), | 62 window_visible_(false), |
63 attached_to_window_(false), | 63 attached_to_window_(false), |
64 hardware_enabled_(false), | 64 hardware_enabled_(false), |
65 dip_scale_(0.0), | 65 dip_scale_(0.0), |
66 page_scale_factor_(1.0), | 66 page_scale_factor_(1.0), |
67 on_new_picture_enable_(false), | 67 on_new_picture_enable_(false), |
68 clear_view_(false), | 68 clear_view_(false), |
69 compositor_needs_continuous_invalidate_(false), | 69 compositor_needs_vsyncs_(false) { |
70 invalidate_after_composite_(false), | |
71 block_invalidates_(false), | |
72 fallback_tick_pending_(false) { | |
73 } | 70 } |
74 | 71 |
75 BrowserViewRenderer::~BrowserViewRenderer() { | 72 BrowserViewRenderer::~BrowserViewRenderer() { |
76 } | 73 } |
77 | 74 |
78 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { | 75 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { |
79 return &shared_renderer_state_; | 76 return &shared_renderer_state_; |
80 } | 77 } |
81 | 78 |
82 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { | 79 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { |
(...skipping 29 matching lines...) Expand all Loading... |
112 | 109 |
113 // Drop everything in hardware. | 110 // Drop everything in hardware. |
114 if (level >= TRIM_MEMORY_MODERATE) { | 111 if (level >= TRIM_MEMORY_MODERATE) { |
115 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); | 112 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
116 return; | 113 return; |
117 } | 114 } |
118 | 115 |
119 // Just set the memory limit to 0 and drop all tiles. This will be reset to | 116 // Just set the memory limit to 0 and drop all tiles. This will be reset to |
120 // normal levels in the next DrawGL call. | 117 // normal levels in the next DrawGL call. |
121 compositor_->SetMemoryPolicy(0u); | 118 compositor_->SetMemoryPolicy(0u); |
122 ForceFakeCompositeSW(); | |
123 } | 119 } |
124 | 120 |
125 size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { | 121 size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { |
126 if (g_memory_override_in_bytes) | 122 if (g_memory_override_in_bytes) |
127 return static_cast<size_t>(g_memory_override_in_bytes); | 123 return static_cast<size_t>(g_memory_override_in_bytes); |
128 | 124 |
129 size_t width = last_on_draw_global_visible_rect_.width(); | 125 size_t width = last_on_draw_global_visible_rect_.width(); |
130 size_t height = last_on_draw_global_visible_rect_.height(); | 126 size_t height = last_on_draw_global_visible_rect_.height(); |
131 size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; | 127 size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; |
132 // Round up to a multiple of kMemoryAllocationStep. | 128 // Round up to a multiple of kMemoryAllocationStep. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 TRACE_EVENT_SCOPE_THREAD); | 165 TRACE_EVENT_SCOPE_THREAD); |
170 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); | 166 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); |
171 return true; | 167 return true; |
172 } | 168 } |
173 | 169 |
174 ReturnResourceFromParent(); | 170 ReturnResourceFromParent(); |
175 if (shared_renderer_state_.HasCompositorFrameOnUI()) { | 171 if (shared_renderer_state_.HasCompositorFrameOnUI()) { |
176 TRACE_EVENT_INSTANT0("android_webview", | 172 TRACE_EVENT_INSTANT0("android_webview", |
177 "EarlyOut_PreviousFrameUnconsumed", | 173 "EarlyOut_PreviousFrameUnconsumed", |
178 TRACE_EVENT_SCOPE_THREAD); | 174 TRACE_EVENT_SCOPE_THREAD); |
179 DidSkipCompositeInDraw(); | |
180 return true; | 175 return true; |
181 } | 176 } |
182 | 177 |
183 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | 178 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |
184 if (!frame.get()) { | 179 if (!frame.get()) { |
185 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | 180 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
186 TRACE_EVENT_SCOPE_THREAD); | 181 TRACE_EVENT_SCOPE_THREAD); |
187 return false; | 182 return false; |
188 } | 183 } |
189 | 184 |
(...skipping 23 matching lines...) Expand all Loading... |
213 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 208 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; |
214 } | 209 } |
215 | 210 |
216 scoped_ptr<cc::CompositorFrame> frame = | 211 scoped_ptr<cc::CompositorFrame> frame = |
217 compositor_->DemandDrawHw(surface_size, | 212 compositor_->DemandDrawHw(surface_size, |
218 gfx::Transform(), | 213 gfx::Transform(), |
219 viewport, | 214 viewport, |
220 clip, | 215 clip, |
221 viewport_rect_for_tile_priority, | 216 viewport_rect_for_tile_priority, |
222 transform_for_tile_priority); | 217 transform_for_tile_priority); |
223 if (frame.get()) | |
224 DidComposite(); | |
225 return frame.Pass(); | 218 return frame.Pass(); |
226 } | 219 } |
227 | 220 |
228 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 221 void BrowserViewRenderer::UpdateParentDrawConstraints() { |
229 // Post an invalidate if the parent draw constraints are stale and there is | 222 // Post an invalidate if the parent draw constraints are stale and there is |
230 // no pending invalidate. | 223 // no pending invalidate. |
231 bool needs_force_invalidate = | 224 bool needs_force_invalidate = |
232 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); | 225 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI(); |
233 if (needs_force_invalidate || | 226 if (needs_force_invalidate || |
234 !parent_draw_constraints_.Equals( | 227 !parent_draw_constraints_.Equals( |
235 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { | 228 shared_renderer_state_.GetParentDrawConstraintsOnUI())) { |
236 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); | 229 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false); |
237 EnsureContinuousInvalidation(true, needs_force_invalidate); | 230 PostInvalidate(); |
238 } | 231 } |
239 } | 232 } |
240 | 233 |
241 void BrowserViewRenderer::ReturnUnusedResource( | 234 void BrowserViewRenderer::ReturnUnusedResource( |
242 scoped_ptr<cc::CompositorFrame> frame) { | 235 scoped_ptr<cc::CompositorFrame> frame) { |
243 if (!frame.get()) | 236 if (!frame.get()) |
244 return; | 237 return; |
245 | 238 |
246 cc::CompositorFrameAck frame_ack; | 239 cc::CompositorFrameAck frame_ack; |
247 cc::TransferableResource::ReturnResources( | 240 cc::TransferableResource::ReturnResources( |
248 frame->delegated_frame_data->resource_list, &frame_ack.resources); | 241 frame->delegated_frame_data->resource_list, &frame_ack.resources); |
249 if (compositor_ && !frame_ack.resources.empty()) | 242 if (compositor_ && !frame_ack.resources.empty()) |
250 compositor_->ReturnResources(frame_ack); | 243 compositor_->ReturnResources(frame_ack); |
251 } | 244 } |
252 | 245 |
253 void BrowserViewRenderer::ReturnResourceFromParent() { | 246 void BrowserViewRenderer::ReturnResourceFromParent() { |
254 cc::CompositorFrameAck frame_ack; | 247 cc::CompositorFrameAck frame_ack; |
255 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); | 248 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources); |
256 if (compositor_ && !frame_ack.resources.empty()) { | 249 if (compositor_ && !frame_ack.resources.empty()) { |
257 compositor_->ReturnResources(frame_ack); | 250 compositor_->ReturnResources(frame_ack); |
258 } | 251 } |
259 } | 252 } |
260 | 253 |
261 void BrowserViewRenderer::DidSkipCommitFrame() { | |
262 // Treat it the same way as skipping onDraw. | |
263 DidSkipCompositeInDraw(); | |
264 } | |
265 | |
266 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { | 254 void BrowserViewRenderer::InvalidateOnFunctorDestroy() { |
267 client_->InvalidateOnFunctorDestroy(); | 255 client_->InvalidateOnFunctorDestroy(); |
268 } | 256 } |
269 | 257 |
270 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 258 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { |
271 if (!compositor_) { | 259 if (!compositor_) { |
272 TRACE_EVENT_INSTANT0( | 260 TRACE_EVENT_INSTANT0( |
273 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); | 261 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); |
274 return false; | 262 return false; |
275 } | 263 } |
(...skipping 29 matching lines...) Expand all Loading... |
305 } | 293 } |
306 | 294 |
307 void BrowserViewRenderer::ClearView() { | 295 void BrowserViewRenderer::ClearView() { |
308 TRACE_EVENT_INSTANT0("android_webview", | 296 TRACE_EVENT_INSTANT0("android_webview", |
309 "BrowserViewRenderer::ClearView", | 297 "BrowserViewRenderer::ClearView", |
310 TRACE_EVENT_SCOPE_THREAD); | 298 TRACE_EVENT_SCOPE_THREAD); |
311 if (clear_view_) | 299 if (clear_view_) |
312 return; | 300 return; |
313 | 301 |
314 clear_view_ = true; | 302 clear_view_ = true; |
315 // Always invalidate ignoring the compositor to actually clear the webview. | 303 |
316 EnsureContinuousInvalidation(true, false); | 304 PostInvalidate(); |
| 305 } |
| 306 |
| 307 void BrowserViewRenderer::OnVSync(base::TimeTicks frame_time, |
| 308 base::TimeDelta vsync_period) { |
| 309 DCHECK(needs_vsyncs_); |
| 310 |
| 311 if (needs_vsyncs_) |
| 312 client_->RequestVSyncUpdate(); |
317 } | 313 } |
318 | 314 |
319 void BrowserViewRenderer::SetIsPaused(bool paused) { | 315 void BrowserViewRenderer::SetIsPaused(bool paused) { |
320 TRACE_EVENT_INSTANT1("android_webview", | 316 TRACE_EVENT_INSTANT1("android_webview", |
321 "BrowserViewRenderer::SetIsPaused", | 317 "BrowserViewRenderer::SetIsPaused", |
322 TRACE_EVENT_SCOPE_THREAD, | 318 TRACE_EVENT_SCOPE_THREAD, |
323 "paused", | 319 "paused", |
324 paused); | 320 paused); |
325 is_paused_ = paused; | 321 is_paused_ = paused; |
326 EnsureContinuousInvalidation(false, false); | 322 UpdateNeedsVSyncs(); |
327 } | 323 } |
328 | 324 |
329 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { | 325 void BrowserViewRenderer::SetViewVisibility(bool view_visible) { |
330 TRACE_EVENT_INSTANT1("android_webview", | 326 TRACE_EVENT_INSTANT1("android_webview", |
331 "BrowserViewRenderer::SetViewVisibility", | 327 "BrowserViewRenderer::SetViewVisibility", |
332 TRACE_EVENT_SCOPE_THREAD, | 328 TRACE_EVENT_SCOPE_THREAD, |
333 "view_visible", | 329 "view_visible", |
334 view_visible); | 330 view_visible); |
335 view_visible_ = view_visible; | 331 view_visible_ = view_visible; |
| 332 UpdateNeedsVSyncs(); |
336 } | 333 } |
337 | 334 |
338 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { | 335 void BrowserViewRenderer::SetWindowVisibility(bool window_visible) { |
339 TRACE_EVENT_INSTANT1("android_webview", | 336 TRACE_EVENT_INSTANT1("android_webview", |
340 "BrowserViewRenderer::SetWindowVisibility", | 337 "BrowserViewRenderer::SetWindowVisibility", |
341 TRACE_EVENT_SCOPE_THREAD, | 338 TRACE_EVENT_SCOPE_THREAD, |
342 "window_visible", | 339 "window_visible", |
343 window_visible); | 340 window_visible); |
344 window_visible_ = window_visible; | 341 window_visible_ = window_visible; |
345 EnsureContinuousInvalidation(false, false); | 342 UpdateNeedsVSyncs(); |
346 } | 343 } |
347 | 344 |
348 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 345 void BrowserViewRenderer::OnSizeChanged(int width, int height) { |
349 TRACE_EVENT_INSTANT2("android_webview", | 346 TRACE_EVENT_INSTANT2("android_webview", |
350 "BrowserViewRenderer::OnSizeChanged", | 347 "BrowserViewRenderer::OnSizeChanged", |
351 TRACE_EVENT_SCOPE_THREAD, | 348 TRACE_EVENT_SCOPE_THREAD, |
352 "width", | 349 "width", |
353 width, | 350 width, |
354 "height", | 351 "height", |
355 height); | 352 height); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 compositor_ = compositor; | 402 compositor_ = compositor; |
406 } | 403 } |
407 | 404 |
408 void BrowserViewRenderer::DidDestroyCompositor( | 405 void BrowserViewRenderer::DidDestroyCompositor( |
409 content::SynchronousCompositor* compositor) { | 406 content::SynchronousCompositor* compositor) { |
410 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); | 407 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); |
411 DCHECK(compositor_); | 408 DCHECK(compositor_); |
412 compositor_ = NULL; | 409 compositor_ = NULL; |
413 } | 410 } |
414 | 411 |
415 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { | 412 void BrowserViewRenderer::SetNeedsVSyncs(bool needs_vsyncs) { |
416 if (compositor_needs_continuous_invalidate_ == invalidate) | 413 compositor_needs_vsyncs_ = needs_vsyncs; |
417 return; | 414 UpdateNeedsVSyncs(); |
| 415 } |
418 | 416 |
419 TRACE_EVENT_INSTANT1("android_webview", | 417 void BrowserViewRenderer::PostInvalidate() { |
420 "BrowserViewRenderer::SetContinuousInvalidate", | 418 DCHECK(client_); |
421 TRACE_EVENT_SCOPE_THREAD, | 419 client_->PostInvalidate(); |
422 "invalidate", | |
423 invalidate); | |
424 compositor_needs_continuous_invalidate_ = invalidate; | |
425 | |
426 EnsureContinuousInvalidation(false, false); | |
427 } | 420 } |
428 | 421 |
429 void BrowserViewRenderer::SetDipScale(float dip_scale) { | 422 void BrowserViewRenderer::SetDipScale(float dip_scale) { |
430 dip_scale_ = dip_scale; | 423 dip_scale_ = dip_scale; |
431 CHECK_GT(dip_scale_, 0); | 424 CHECK_GT(dip_scale_, 0); |
432 } | 425 } |
433 | 426 |
434 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { | 427 gfx::Vector2d BrowserViewRenderer::max_scroll_offset() const { |
435 DCHECK_GT(dip_scale_, 0); | 428 DCHECK_GT(dip_scale_, 0); |
436 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( | 429 return gfx::ToCeiledVector2d(gfx::ScaleVector2d( |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 overscroll_rounding_error_ = gfx::Vector2dF(); | 575 overscroll_rounding_error_ = gfx::Vector2dF(); |
583 gfx::Vector2dF scaled_overscroll_delta = | 576 gfx::Vector2dF scaled_overscroll_delta = |
584 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); | 577 gfx::ScaleVector2d(latest_overscroll_delta, physical_pixel_scale); |
585 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( | 578 gfx::Vector2d rounded_overscroll_delta = gfx::ToRoundedVector2d( |
586 scaled_overscroll_delta + overscroll_rounding_error_); | 579 scaled_overscroll_delta + overscroll_rounding_error_); |
587 overscroll_rounding_error_ = | 580 overscroll_rounding_error_ = |
588 scaled_overscroll_delta - rounded_overscroll_delta; | 581 scaled_overscroll_delta - rounded_overscroll_delta; |
589 client_->DidOverscroll(rounded_overscroll_delta); | 582 client_->DidOverscroll(rounded_overscroll_delta); |
590 } | 583 } |
591 | 584 |
592 void BrowserViewRenderer::EnsureContinuousInvalidation( | |
593 bool force_invalidate, | |
594 bool skip_reschedule_tick) { | |
595 if (force_invalidate) | |
596 invalidate_after_composite_ = true; | |
597 | |
598 // This method should be called again when any of these conditions change. | |
599 bool need_invalidate = | |
600 compositor_needs_continuous_invalidate_ || invalidate_after_composite_; | |
601 if (!need_invalidate || block_invalidates_) | |
602 return; | |
603 | |
604 if (!compositor_needs_continuous_invalidate_ && invalidate_after_composite_) | |
605 invalidate_after_composite_ = false; | |
606 | |
607 // Always call view invalidate. We rely the Android framework to ignore the | |
608 // invalidate when it's not needed such as when view is not visible. | |
609 client_->PostInvalidate(); | |
610 | |
611 // Stop fallback ticks when one of these is true. | |
612 // 1) Webview is paused. Also need to check we are not in clear view since | |
613 // paused, offscreen still expect clear view to recover. | |
614 // 2) If we are attached to window and the window is not visible (eg when | |
615 // app is in the background). We are sure in this case the webview is used | |
616 // "on-screen" but that updates are not needed when in the background. | |
617 bool throttle_fallback_tick = | |
618 (is_paused_ && !clear_view_) || (attached_to_window_ && !window_visible_); | |
619 if (throttle_fallback_tick) | |
620 return; | |
621 | |
622 block_invalidates_ = compositor_needs_continuous_invalidate_; | |
623 if (skip_reschedule_tick && fallback_tick_pending_) | |
624 return; | |
625 | |
626 // Unretained here is safe because the callbacks are cancelled when | |
627 // they are destroyed. | |
628 post_fallback_tick_.Reset(base::Bind(&BrowserViewRenderer::PostFallbackTick, | |
629 base::Unretained(this))); | |
630 fallback_tick_fired_.Cancel(); | |
631 fallback_tick_pending_ = false; | |
632 | |
633 // No need to reschedule fallback tick if compositor does not need to be | |
634 // ticked. This can happen if this is reached because force_invalidate is | |
635 // true. | |
636 if (compositor_needs_continuous_invalidate_) { | |
637 fallback_tick_pending_ = true; | |
638 ui_task_runner_->PostTask(FROM_HERE, post_fallback_tick_.callback()); | |
639 } | |
640 } | |
641 | |
642 void BrowserViewRenderer::PostFallbackTick() { | |
643 DCHECK(fallback_tick_fired_.IsCancelled()); | |
644 fallback_tick_fired_.Reset(base::Bind(&BrowserViewRenderer::FallbackTickFired, | |
645 base::Unretained(this))); | |
646 if (compositor_needs_continuous_invalidate_) { | |
647 ui_task_runner_->PostDelayedTask( | |
648 FROM_HERE, | |
649 fallback_tick_fired_.callback(), | |
650 base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); | |
651 } else { | |
652 // Pretend we just composited to unblock further invalidates. | |
653 DidComposite(); | |
654 } | |
655 } | |
656 | |
657 void BrowserViewRenderer::FallbackTickFired() { | |
658 TRACE_EVENT1("android_webview", | |
659 "BrowserViewRenderer::FallbackTickFired", | |
660 "compositor_needs_continuous_invalidate_", | |
661 compositor_needs_continuous_invalidate_); | |
662 | |
663 // This should only be called if OnDraw or DrawGL did not come in time, which | |
664 // means block_invalidates_ must still be true. | |
665 DCHECK(block_invalidates_); | |
666 fallback_tick_pending_ = false; | |
667 if (compositor_needs_continuous_invalidate_ && compositor_) { | |
668 if (hardware_enabled_) { | |
669 ReturnResourceFromParent(); | |
670 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | |
671 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | |
672 if (frame.get()) { | |
673 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true); | |
674 } | |
675 } else { | |
676 ForceFakeCompositeSW(); | |
677 } | |
678 } else { | |
679 // Pretend we just composited to unblock further invalidates. | |
680 DidComposite(); | |
681 } | |
682 } | |
683 | |
684 void BrowserViewRenderer::ForceFakeCompositeSW() { | |
685 DCHECK(compositor_); | |
686 SkBitmap bitmap; | |
687 bitmap.allocN32Pixels(1, 1); | |
688 bitmap.eraseColor(0); | |
689 SkCanvas canvas(bitmap); | |
690 CompositeSW(&canvas); | |
691 } | |
692 | |
693 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { | 585 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { |
694 DCHECK(compositor_); | 586 DCHECK(compositor_); |
695 ReturnResourceFromParent(); | 587 ReturnResourceFromParent(); |
696 bool result = compositor_->DemandDrawSw(canvas); | 588 return compositor_->DemandDrawSw(canvas); |
697 DidComposite(); | |
698 return result; | |
699 } | 589 } |
700 | 590 |
701 void BrowserViewRenderer::DidComposite() { | 591 void BrowserViewRenderer::UpdateNeedsVSyncs() { |
702 block_invalidates_ = false; | 592 bool needs_vsyncs = !is_paused_ && IsVisible() && compositor_needs_vsyncs_; |
703 post_fallback_tick_.Cancel(); | |
704 fallback_tick_fired_.Cancel(); | |
705 fallback_tick_pending_ = false; | |
706 EnsureContinuousInvalidation(false, false); | |
707 } | |
708 | 593 |
709 void BrowserViewRenderer::DidSkipCompositeInDraw() { | 594 if (needs_vsyncs_ == needs_vsyncs) |
710 block_invalidates_ = false; | 595 return; |
711 EnsureContinuousInvalidation(true, true); | 596 |
| 597 needs_vsyncs_ = needs_vsyncs; |
| 598 |
| 599 if (needs_vsyncs_) |
| 600 client_->RequestVSyncUpdate(); |
712 } | 601 } |
713 | 602 |
714 std::string BrowserViewRenderer::ToString() const { | 603 std::string BrowserViewRenderer::ToString() const { |
715 std::string str; | 604 std::string str; |
716 base::StringAppendF(&str, "is_paused: %d ", is_paused_); | 605 base::StringAppendF(&str, "is_paused: %d ", is_paused_); |
717 base::StringAppendF(&str, "view_visible: %d ", view_visible_); | 606 base::StringAppendF(&str, "view_visible: %d ", view_visible_); |
718 base::StringAppendF(&str, "window_visible: %d ", window_visible_); | 607 base::StringAppendF(&str, "window_visible: %d ", window_visible_); |
719 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); | 608 base::StringAppendF(&str, "dip_scale: %f ", dip_scale_); |
720 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); | 609 base::StringAppendF(&str, "page_scale_factor: %f ", page_scale_factor_); |
721 base::StringAppendF(&str, | 610 base::StringAppendF(&str, |
722 "compositor_needs_continuous_invalidate: %d ", | 611 "compositor_needs_vsyncs_: %d ", |
723 compositor_needs_continuous_invalidate_); | 612 compositor_needs_vsyncs_); |
724 base::StringAppendF(&str, "block_invalidates: %d ", block_invalidates_); | |
725 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); | 613 base::StringAppendF(&str, "view size: %s ", size_.ToString().c_str()); |
726 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 614 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
727 base::StringAppendF(&str, | 615 base::StringAppendF(&str, |
728 "global visible rect: %s ", | 616 "global visible rect: %s ", |
729 last_on_draw_global_visible_rect_.ToString().c_str()); | 617 last_on_draw_global_visible_rect_.ToString().c_str()); |
730 base::StringAppendF( | 618 base::StringAppendF( |
731 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); | 619 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); |
732 base::StringAppendF(&str, | 620 base::StringAppendF(&str, |
733 "overscroll_rounding_error_: %s ", | 621 "overscroll_rounding_error_: %s ", |
734 overscroll_rounding_error_.ToString().c_str()); | 622 overscroll_rounding_error_.ToString().c_str()); |
735 base::StringAppendF( | 623 base::StringAppendF( |
736 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 624 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
737 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 625 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
738 return str; | 626 return str; |
739 } | 627 } |
740 | 628 |
741 } // namespace android_webview | 629 } // namespace android_webview |
OLD | NEW |