| 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 "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 "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 if (level < TRIM_MEMORY_BACKGROUND && visible) | 122 if (level < TRIM_MEMORY_BACKGROUND && visible) |
| 123 return; | 123 return; |
| 124 | 124 |
| 125 // Just set the memory limit to 0 and drop all tiles. This will be reset to | 125 // Just set the memory limit to 0 and drop all tiles. This will be reset to |
| 126 // normal levels in the next DrawGL call. | 126 // normal levels in the next DrawGL call. |
| 127 SynchronousCompositorMemoryPolicy zero_policy; | 127 SynchronousCompositorMemoryPolicy zero_policy; |
| 128 if (memory_policy_ == zero_policy) | 128 if (memory_policy_ == zero_policy) |
| 129 return; | 129 return; |
| 130 | 130 |
| 131 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); | 131 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); |
| 132 DCHECK(hardware_enabled_); |
| 133 DCHECK(compositor_); |
| 132 | 134 |
| 133 RequestMemoryPolicy(zero_policy); | 135 RequestMemoryPolicy(zero_policy); |
| 134 EnforceMemoryPolicyImmediately(zero_policy); | 136 EnforceMemoryPolicyImmediately(zero_policy); |
| 135 } | 137 } |
| 136 | 138 |
| 137 SynchronousCompositorMemoryPolicy | 139 SynchronousCompositorMemoryPolicy |
| 138 BrowserViewRenderer::CalculateDesiredMemoryPolicy() { | 140 BrowserViewRenderer::CalculateDesiredMemoryPolicy() { |
| 139 SynchronousCompositorMemoryPolicy policy; | 141 SynchronousCompositorMemoryPolicy policy; |
| 140 size_t width = last_on_draw_global_visible_rect_.width(); | 142 size_t width = last_on_draw_global_visible_rect_.width(); |
| 141 size_t height = last_on_draw_global_visible_rect_.height(); | 143 size_t height = last_on_draw_global_visible_rect_.height(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 152 // is also kTileAllocationStep. | 154 // is also kTileAllocationStep. |
| 153 tiles = (tiles / kTileAllocationStep + 1) * kTileAllocationStep; | 155 tiles = (tiles / kTileAllocationStep + 1) * kTileAllocationStep; |
| 154 policy.num_resources_limit = tiles; | 156 policy.num_resources_limit = tiles; |
| 155 return policy; | 157 return policy; |
| 156 } | 158 } |
| 157 | 159 |
| 158 // This function updates the cached memory policy in shared renderer state, as | 160 // This function updates the cached memory policy in shared renderer state, as |
| 159 // well as the tile resource allocation in GlobalTileManager. | 161 // well as the tile resource allocation in GlobalTileManager. |
| 160 void BrowserViewRenderer::RequestMemoryPolicy( | 162 void BrowserViewRenderer::RequestMemoryPolicy( |
| 161 SynchronousCompositorMemoryPolicy& new_policy) { | 163 SynchronousCompositorMemoryPolicy& new_policy) { |
| 164 DCHECK(compositor_); |
| 162 GlobalTileManager* manager = GlobalTileManager::GetInstance(); | 165 GlobalTileManager* manager = GlobalTileManager::GetInstance(); |
| 163 | 166 |
| 164 // The following line will call BrowserViewRenderer::SetMemoryPolicy(). | 167 // The following line will call BrowserViewRenderer::SetMemoryPolicy(). |
| 165 manager->RequestTiles(new_policy, tile_manager_key_); | 168 manager->RequestTiles(new_policy, tile_manager_key_); |
| 166 } | 169 } |
| 167 | 170 |
| 168 void BrowserViewRenderer::SetMemoryPolicy( | 171 void BrowserViewRenderer::SetMemoryPolicy( |
| 169 SynchronousCompositorMemoryPolicy new_policy, | 172 SynchronousCompositorMemoryPolicy new_policy, |
| 170 bool effective_immediately) { | 173 bool effective_immediately) { |
| 171 memory_policy_ = new_policy; | 174 memory_policy_ = new_policy; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 } | 291 } |
| 289 | 292 |
| 290 void BrowserViewRenderer::ReturnUnusedResource( | 293 void BrowserViewRenderer::ReturnUnusedResource( |
| 291 scoped_ptr<cc::CompositorFrame> frame) { | 294 scoped_ptr<cc::CompositorFrame> frame) { |
| 292 if (!frame.get()) | 295 if (!frame.get()) |
| 293 return; | 296 return; |
| 294 | 297 |
| 295 cc::CompositorFrameAck frame_ack; | 298 cc::CompositorFrameAck frame_ack; |
| 296 cc::TransferableResource::ReturnResources( | 299 cc::TransferableResource::ReturnResources( |
| 297 frame->delegated_frame_data->resource_list, &frame_ack.resources); | 300 frame->delegated_frame_data->resource_list, &frame_ack.resources); |
| 298 if (!frame_ack.resources.empty()) | 301 if (compositor_ && !frame_ack.resources.empty()) |
| 299 compositor_->ReturnResources(frame_ack); | 302 compositor_->ReturnResources(frame_ack); |
| 300 } | 303 } |
| 301 | 304 |
| 302 void BrowserViewRenderer::ReturnResourceFromParent() { | 305 void BrowserViewRenderer::ReturnResourceFromParent() { |
| 303 cc::CompositorFrameAck frame_ack; | 306 cc::CompositorFrameAck frame_ack; |
| 304 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources); | 307 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources); |
| 305 if (!frame_ack.resources.empty()) { | 308 if (compositor_ && !frame_ack.resources.empty()) { |
| 306 compositor_->ReturnResources(frame_ack); | 309 compositor_->ReturnResources(frame_ack); |
| 307 } | 310 } |
| 308 } | 311 } |
| 309 | 312 |
| 310 bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) { | 313 bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) { |
| 311 if (!compositor_) { | 314 if (!compositor_) { |
| 312 TRACE_EVENT_INSTANT0( | 315 TRACE_EVENT_INSTANT0( |
| 313 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); | 316 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); |
| 314 return false; | 317 return false; |
| 315 } | 318 } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 attached_to_window_ = false; | 429 attached_to_window_ = false; |
| 427 DCHECK(!hardware_enabled_); | 430 DCHECK(!hardware_enabled_); |
| 428 } | 431 } |
| 429 | 432 |
| 430 void BrowserViewRenderer::ReleaseHardware() { | 433 void BrowserViewRenderer::ReleaseHardware() { |
| 431 DCHECK(hardware_enabled_); | 434 DCHECK(hardware_enabled_); |
| 432 ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); | 435 ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); |
| 433 ReturnResourceFromParent(); | 436 ReturnResourceFromParent(); |
| 434 DCHECK(shared_renderer_state_->ReturnedResourcesEmpty()); | 437 DCHECK(shared_renderer_state_->ReturnedResourcesEmpty()); |
| 435 | 438 |
| 436 compositor_->ReleaseHwDraw(); | 439 if (compositor_) { |
| 440 compositor_->ReleaseHwDraw(); |
| 441 SynchronousCompositorMemoryPolicy zero_policy; |
| 442 RequestMemoryPolicy(zero_policy); |
| 443 } |
| 444 |
| 437 hardware_enabled_ = false; | 445 hardware_enabled_ = false; |
| 438 | |
| 439 SynchronousCompositorMemoryPolicy zero_policy; | |
| 440 RequestMemoryPolicy(zero_policy); | |
| 441 GlobalTileManager::GetInstance()->Remove(tile_manager_key_); | 446 GlobalTileManager::GetInstance()->Remove(tile_manager_key_); |
| 442 } | 447 } |
| 443 | 448 |
| 444 bool BrowserViewRenderer::IsVisible() const { | 449 bool BrowserViewRenderer::IsVisible() const { |
| 445 // Ignore |window_visible_| if |attached_to_window_| is false. | 450 // Ignore |window_visible_| if |attached_to_window_| is false. |
| 446 return view_visible_ && (!attached_to_window_ || window_visible_); | 451 return view_visible_ && (!attached_to_window_ || window_visible_); |
| 447 } | 452 } |
| 448 | 453 |
| 449 gfx::Rect BrowserViewRenderer::GetScreenRect() const { | 454 gfx::Rect BrowserViewRenderer::GetScreenRect() const { |
| 450 return gfx::Rect(client_->GetLocationOnScreen(), gfx::Size(width_, height_)); | 455 return gfx::Rect(client_->GetLocationOnScreen(), gfx::Size(width_, height_)); |
| 451 } | 456 } |
| 452 | 457 |
| 453 void BrowserViewRenderer::DidInitializeCompositor( | 458 void BrowserViewRenderer::DidInitializeCompositor( |
| 454 content::SynchronousCompositor* compositor) { | 459 content::SynchronousCompositor* compositor) { |
| 455 TRACE_EVENT0("android_webview", | 460 TRACE_EVENT0("android_webview", |
| 456 "BrowserViewRenderer::DidInitializeCompositor"); | 461 "BrowserViewRenderer::DidInitializeCompositor"); |
| 457 DCHECK(compositor); | 462 DCHECK(compositor); |
| 458 DCHECK(!compositor_); | 463 DCHECK(!compositor_); |
| 459 compositor_ = compositor; | 464 compositor_ = compositor; |
| 460 } | 465 } |
| 461 | 466 |
| 462 void BrowserViewRenderer::DidDestroyCompositor( | 467 void BrowserViewRenderer::DidDestroyCompositor( |
| 463 content::SynchronousCompositor* compositor) { | 468 content::SynchronousCompositor* compositor) { |
| 464 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); | 469 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); |
| 465 DCHECK(compositor_); | 470 DCHECK(compositor_); |
| 471 SynchronousCompositorMemoryPolicy zero_policy; |
| 472 if (hardware_enabled_) { |
| 473 RequestMemoryPolicy(zero_policy); |
| 474 } |
| 475 DCHECK(memory_policy_ == zero_policy); |
| 466 compositor_ = NULL; | 476 compositor_ = NULL; |
| 467 SynchronousCompositorMemoryPolicy zero_policy; | |
| 468 DCHECK(memory_policy_ == zero_policy); | |
| 469 } | 477 } |
| 470 | 478 |
| 471 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { | 479 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { |
| 472 if (compositor_needs_continuous_invalidate_ == invalidate) | 480 if (compositor_needs_continuous_invalidate_ == invalidate) |
| 473 return; | 481 return; |
| 474 | 482 |
| 475 TRACE_EVENT_INSTANT1("android_webview", | 483 TRACE_EVENT_INSTANT1("android_webview", |
| 476 "BrowserViewRenderer::SetContinuousInvalidate", | 484 "BrowserViewRenderer::SetContinuousInvalidate", |
| 477 TRACE_EVENT_SCOPE_THREAD, | 485 TRACE_EVENT_SCOPE_THREAD, |
| 478 "invalidate", | 486 "invalidate", |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 base::StringAppendF(&str, | 790 base::StringAppendF(&str, |
| 783 "overscroll_rounding_error_: %s ", | 791 "overscroll_rounding_error_: %s ", |
| 784 overscroll_rounding_error_.ToString().c_str()); | 792 overscroll_rounding_error_.ToString().c_str()); |
| 785 base::StringAppendF( | 793 base::StringAppendF( |
| 786 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 794 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 787 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 795 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 788 return str; | 796 return str; |
| 789 } | 797 } |
| 790 | 798 |
| 791 } // namespace android_webview | 799 } // namespace android_webview |
| OLD | NEW |