Chromium Code Reviews| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 105 // This function updates the resource allocation in GlobalTileManager. | 105 // This function updates the resource allocation in GlobalTileManager. |
| 106 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { | 106 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| 107 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 107 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
| 108 // Constants from Android ComponentCallbacks2. | 108 // Constants from Android ComponentCallbacks2. |
| 109 enum { | 109 enum { |
| 110 TRIM_MEMORY_RUNNING_LOW = 10, | 110 TRIM_MEMORY_RUNNING_LOW = 10, |
| 111 TRIM_MEMORY_UI_HIDDEN = 20, | 111 TRIM_MEMORY_UI_HIDDEN = 20, |
| 112 TRIM_MEMORY_BACKGROUND = 40, | 112 TRIM_MEMORY_BACKGROUND = 40, |
| 113 }; | 113 }; |
| 114 | 114 |
| 115 if (!compositor_ || !hardware_enabled_) | |
| 116 return; | |
|
hush (inactive)
2014/10/18 01:34:01
ideally, (memory_policy_ != zero_policy) means com
boliu
2014/10/18 17:08:15
Done.
| |
| 117 | |
| 115 // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because | 118 // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because |
| 116 // it does not indicate memory pressure, but merely that the app is | 119 // it does not indicate memory pressure, but merely that the app is |
| 117 // backgrounded. | 120 // backgrounded. |
| 118 if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN) | 121 if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN) |
| 119 return; | 122 return; |
| 120 | 123 |
| 121 // Do not release resources on view we expect to get DrawGL soon. | 124 // Do not release resources on view we expect to get DrawGL soon. |
| 122 if (level < TRIM_MEMORY_BACKGROUND && visible) | 125 if (level < TRIM_MEMORY_BACKGROUND && visible) |
| 123 return; | 126 return; |
| 124 | 127 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 152 // is also kTileAllocationStep. | 155 // is also kTileAllocationStep. |
| 153 tiles = (tiles / kTileAllocationStep + 1) * kTileAllocationStep; | 156 tiles = (tiles / kTileAllocationStep + 1) * kTileAllocationStep; |
| 154 policy.num_resources_limit = tiles; | 157 policy.num_resources_limit = tiles; |
| 155 return policy; | 158 return policy; |
| 156 } | 159 } |
| 157 | 160 |
| 158 // This function updates the cached memory policy in shared renderer state, as | 161 // This function updates the cached memory policy in shared renderer state, as |
| 159 // well as the tile resource allocation in GlobalTileManager. | 162 // well as the tile resource allocation in GlobalTileManager. |
| 160 void BrowserViewRenderer::RequestMemoryPolicy( | 163 void BrowserViewRenderer::RequestMemoryPolicy( |
| 161 SynchronousCompositorMemoryPolicy& new_policy) { | 164 SynchronousCompositorMemoryPolicy& new_policy) { |
| 165 DCHECK(compositor_); | |
| 162 GlobalTileManager* manager = GlobalTileManager::GetInstance(); | 166 GlobalTileManager* manager = GlobalTileManager::GetInstance(); |
| 163 | 167 |
| 164 // The following line will call BrowserViewRenderer::SetMemoryPolicy(). | 168 // The following line will call BrowserViewRenderer::SetMemoryPolicy(). |
| 165 manager->RequestTiles(new_policy, tile_manager_key_); | 169 manager->RequestTiles(new_policy, tile_manager_key_); |
| 166 } | 170 } |
| 167 | 171 |
| 168 void BrowserViewRenderer::SetMemoryPolicy( | 172 void BrowserViewRenderer::SetMemoryPolicy( |
| 169 SynchronousCompositorMemoryPolicy new_policy, | 173 SynchronousCompositorMemoryPolicy new_policy, |
| 170 bool effective_immediately) { | 174 bool effective_immediately) { |
| 171 memory_policy_ = new_policy; | 175 memory_policy_ = new_policy; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 237 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); | 241 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |
| 238 if (!frame.get()) | 242 if (!frame.get()) |
| 239 return false; | 243 return false; |
| 240 | 244 |
| 241 shared_renderer_state_->SetCompositorFrame(frame.Pass(), false); | 245 shared_renderer_state_->SetCompositorFrame(frame.Pass(), false); |
| 242 GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); | 246 GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); |
| 243 return client_->RequestDrawGL(java_canvas, false); | 247 return client_->RequestDrawGL(java_canvas, false); |
| 244 } | 248 } |
| 245 | 249 |
| 246 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { | 250 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { |
| 247 SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); | 251 SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); |
|
hush (inactive)
2014/10/18 01:34:01
what is the policy to add DCHECK(compositor_)?
if
boliu
2014/10/18 17:08:15
Generally only DCHECK public methods that rely on
| |
| 248 RequestMemoryPolicy(new_policy); | 252 RequestMemoryPolicy(new_policy); |
| 249 compositor_->SetMemoryPolicy(memory_policy_); | 253 compositor_->SetMemoryPolicy(memory_policy_); |
| 250 | 254 |
| 251 parent_draw_constraints_ = shared_renderer_state_->ParentDrawConstraints(); | 255 parent_draw_constraints_ = shared_renderer_state_->ParentDrawConstraints(); |
| 252 gfx::Size surface_size(width_, height_); | 256 gfx::Size surface_size(width_, height_); |
| 253 gfx::Rect viewport(surface_size); | 257 gfx::Rect viewport(surface_size); |
| 254 gfx::Rect clip = viewport; | 258 gfx::Rect clip = viewport; |
| 255 gfx::Transform transform_for_tile_priority = | 259 gfx::Transform transform_for_tile_priority = |
| 256 parent_draw_constraints_.transform; | 260 parent_draw_constraints_.transform; |
| 257 | 261 |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 288 } | 292 } |
| 289 | 293 |
| 290 void BrowserViewRenderer::ReturnUnusedResource( | 294 void BrowserViewRenderer::ReturnUnusedResource( |
| 291 scoped_ptr<cc::CompositorFrame> frame) { | 295 scoped_ptr<cc::CompositorFrame> frame) { |
| 292 if (!frame.get()) | 296 if (!frame.get()) |
| 293 return; | 297 return; |
| 294 | 298 |
| 295 cc::CompositorFrameAck frame_ack; | 299 cc::CompositorFrameAck frame_ack; |
| 296 cc::TransferableResource::ReturnResources( | 300 cc::TransferableResource::ReturnResources( |
| 297 frame->delegated_frame_data->resource_list, &frame_ack.resources); | 301 frame->delegated_frame_data->resource_list, &frame_ack.resources); |
| 298 if (!frame_ack.resources.empty()) | 302 if (compositor_ && !frame_ack.resources.empty()) |
| 299 compositor_->ReturnResources(frame_ack); | 303 compositor_->ReturnResources(frame_ack); |
| 300 } | 304 } |
| 301 | 305 |
| 302 void BrowserViewRenderer::ReturnResourceFromParent() { | 306 void BrowserViewRenderer::ReturnResourceFromParent() { |
| 303 cc::CompositorFrameAck frame_ack; | 307 cc::CompositorFrameAck frame_ack; |
| 304 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources); | 308 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources); |
| 305 if (!frame_ack.resources.empty()) { | 309 if (compositor_ && !frame_ack.resources.empty()) { |
| 306 compositor_->ReturnResources(frame_ack); | 310 compositor_->ReturnResources(frame_ack); |
| 307 } | 311 } |
| 308 } | 312 } |
| 309 | 313 |
| 310 bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) { | 314 bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) { |
| 311 if (!compositor_) { | 315 if (!compositor_) { |
| 312 TRACE_EVENT_INSTANT0( | 316 TRACE_EVENT_INSTANT0( |
| 313 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); | 317 "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD); |
| 314 return false; | 318 return false; |
| 315 } | 319 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 425 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); | 429 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
| 426 attached_to_window_ = false; | 430 attached_to_window_ = false; |
| 427 DCHECK(!hardware_enabled_); | 431 DCHECK(!hardware_enabled_); |
| 428 } | 432 } |
| 429 | 433 |
| 430 void BrowserViewRenderer::ReleaseHardware() { | 434 void BrowserViewRenderer::ReleaseHardware() { |
| 431 DCHECK(hardware_enabled_); | 435 DCHECK(hardware_enabled_); |
| 432 ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); | 436 ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); |
| 433 ReturnResourceFromParent(); | 437 ReturnResourceFromParent(); |
| 434 DCHECK(shared_renderer_state_->ReturnedResourcesEmpty()); | 438 DCHECK(shared_renderer_state_->ReturnedResourcesEmpty()); |
| 439 hardware_enabled_ = false; | |
| 440 GlobalTileManager::GetInstance()->Remove(tile_manager_key_); | |
|
boliu
2014/10/18 17:08:15
Woo this is wrong. Ned to request 0 policy *before
| |
| 441 | |
| 442 if (!compositor_) | |
| 443 return; | |
| 435 | 444 |
| 436 compositor_->ReleaseHwDraw(); | 445 compositor_->ReleaseHwDraw(); |
| 437 hardware_enabled_ = false; | |
| 438 | |
| 439 SynchronousCompositorMemoryPolicy zero_policy; | 446 SynchronousCompositorMemoryPolicy zero_policy; |
| 440 RequestMemoryPolicy(zero_policy); | 447 RequestMemoryPolicy(zero_policy); |
| 441 GlobalTileManager::GetInstance()->Remove(tile_manager_key_); | |
| 442 } | 448 } |
| 443 | 449 |
| 444 bool BrowserViewRenderer::IsVisible() const { | 450 bool BrowserViewRenderer::IsVisible() const { |
| 445 // Ignore |window_visible_| if |attached_to_window_| is false. | 451 // Ignore |window_visible_| if |attached_to_window_| is false. |
| 446 return view_visible_ && (!attached_to_window_ || window_visible_); | 452 return view_visible_ && (!attached_to_window_ || window_visible_); |
| 447 } | 453 } |
| 448 | 454 |
| 449 gfx::Rect BrowserViewRenderer::GetScreenRect() const { | 455 gfx::Rect BrowserViewRenderer::GetScreenRect() const { |
| 450 return gfx::Rect(client_->GetLocationOnScreen(), gfx::Size(width_, height_)); | 456 return gfx::Rect(client_->GetLocationOnScreen(), gfx::Size(width_, height_)); |
| 451 } | 457 } |
| 452 | 458 |
| 453 void BrowserViewRenderer::DidInitializeCompositor( | 459 void BrowserViewRenderer::DidInitializeCompositor( |
| 454 content::SynchronousCompositor* compositor) { | 460 content::SynchronousCompositor* compositor) { |
| 455 TRACE_EVENT0("android_webview", | 461 TRACE_EVENT0("android_webview", |
| 456 "BrowserViewRenderer::DidInitializeCompositor"); | 462 "BrowserViewRenderer::DidInitializeCompositor"); |
| 457 DCHECK(compositor); | 463 DCHECK(compositor); |
| 458 DCHECK(!compositor_); | 464 DCHECK(!compositor_); |
| 459 compositor_ = compositor; | 465 compositor_ = compositor; |
| 460 } | 466 } |
| 461 | 467 |
| 462 void BrowserViewRenderer::DidDestroyCompositor( | 468 void BrowserViewRenderer::DidDestroyCompositor( |
| 463 content::SynchronousCompositor* compositor) { | 469 content::SynchronousCompositor* compositor) { |
| 464 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); | 470 TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); |
| 465 DCHECK(compositor_); | 471 DCHECK(compositor_); |
| 472 SynchronousCompositorMemoryPolicy zero_policy; | |
| 473 RequestMemoryPolicy(zero_policy); | |
| 466 compositor_ = NULL; | 474 compositor_ = NULL; |
|
hush (inactive)
2014/10/18 01:34:01
since didDestroyCompositor could be called before
boliu
2014/10/18 17:08:15
We do already, both OnDrawHardware and will skip i
| |
| 467 SynchronousCompositorMemoryPolicy zero_policy; | |
| 468 DCHECK(memory_policy_ == zero_policy); | |
| 469 } | 475 } |
| 470 | 476 |
| 471 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { | 477 void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) { |
| 472 if (compositor_needs_continuous_invalidate_ == invalidate) | 478 if (compositor_needs_continuous_invalidate_ == invalidate) |
| 473 return; | 479 return; |
| 474 | 480 |
| 475 TRACE_EVENT_INSTANT1("android_webview", | 481 TRACE_EVENT_INSTANT1("android_webview", |
| 476 "BrowserViewRenderer::SetContinuousInvalidate", | 482 "BrowserViewRenderer::SetContinuousInvalidate", |
| 477 TRACE_EVENT_SCOPE_THREAD, | 483 TRACE_EVENT_SCOPE_THREAD, |
| 478 "invalidate", | 484 "invalidate", |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 782 base::StringAppendF(&str, | 788 base::StringAppendF(&str, |
| 783 "overscroll_rounding_error_: %s ", | 789 "overscroll_rounding_error_: %s ", |
| 784 overscroll_rounding_error_.ToString().c_str()); | 790 overscroll_rounding_error_.ToString().c_str()); |
| 785 base::StringAppendF( | 791 base::StringAppendF( |
| 786 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 792 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 787 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 793 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 788 return str; | 794 return str; |
| 789 } | 795 } |
| 790 | 796 |
| 791 } // namespace android_webview | 797 } // namespace android_webview |
| OLD | NEW |