Chromium Code Reviews| Index: android_webview/browser/browser_view_renderer.cc |
| diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc |
| index 7e229bc2f8c534ba41fde486c64ea8f276483d5f..065b58d9494e70f9b594a9c6b64580abe619aeb9 100644 |
| --- a/android_webview/browser/browser_view_renderer.cc |
| +++ b/android_webview/browser/browser_view_renderer.cc |
| @@ -118,7 +118,6 @@ bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { |
| return client_->RequestDrawGL(wait_for_completion); |
| } |
| -// This function updates the resource allocation in GlobalTileManager. |
| void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
| // Constants from Android ComponentCallbacks2. |
| @@ -145,7 +144,14 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); |
| - // Drop everything in hardware. |
| + // If offscreen pre-raster is disabled, drop everything in hardware. Otherwise |
| + // keep the tiles and just delete the HardwareRenderer. |
| + if (offscreen_pre_raster_) { |
| + if (level >= TRIM_MEMORY_MODERATE) |
| + shared_renderer_state_.DeleteHardwareRendererOnUI(); |
| + return; |
| + } |
|
boliu
2015/04/16 01:58:39
Can we do
if (>= MODERATE) {
if (offscreen_pre_
hush (inactive)
2015/04/16 04:06:25
Yes. Done
|
| + |
| if (level >= TRIM_MEMORY_MODERATE) { |
| shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
| return; |
| @@ -154,23 +160,30 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| // Just set the memory limit to 0 and drop all tiles. This will be reset to |
| // normal levels in the next DrawGL call. |
| compositor_->SetMemoryPolicy(0u); |
| - ForceFakeCompositeSW(); |
| } |
| -size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { |
| - if (g_memory_override_in_bytes) |
| - return static_cast<size_t>(g_memory_override_in_bytes); |
| +void BrowserViewRenderer::UpdateMemoryPolicy() { |
| + if (!hardware_enabled_) { |
| + compositor_->SetMemoryPolicy(0u); |
| + return; |
| + } |
| + |
| + size_t bytes_limit = 0u; |
| + if (g_memory_override_in_bytes) { |
| + bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); |
| + } else { |
| + gfx::Rect interest_rect = offscreen_pre_raster_ |
| + ? gfx::Rect(size_) |
| + : last_on_draw_global_visible_rect_; |
| + size_t width = interest_rect.width(); |
| + size_t height = interest_rect.height(); |
| + bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; |
| + // Round up to a multiple of kMemoryAllocationStep. |
| + bytes_limit = |
| + (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; |
| + } |
| - gfx::Rect interest_rect = offscreen_pre_raster_ |
| - ? gfx::Rect(size_) |
| - : last_on_draw_global_visible_rect_; |
| - size_t width = interest_rect.width(); |
| - size_t height = interest_rect.height(); |
| - size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; |
| - // Round up to a multiple of kMemoryAllocationStep. |
| - bytes_limit = |
| - (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; |
| - return bytes_limit; |
| + compositor_->SetMemoryPolicy(bytes_limit); |
| } |
| void BrowserViewRenderer::PrepareToDraw(const gfx::Vector2d& scroll, |
| @@ -213,7 +226,7 @@ bool BrowserViewRenderer::CompositeHw() { |
| CancelFallbackTick(); |
| ReturnResourceFromParent(); |
| - compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); |
| + UpdateMemoryPolicy(); |
| ParentCompositorDrawConstraints parent_draw_constraints = |
| shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| @@ -337,7 +350,9 @@ void BrowserViewRenderer::ClearView() { |
| } |
| void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { |
| - // TODO(hush): anything to do when the setting is toggled? |
| + if (offscreen_pre_raster_ != enable && compositor_) |
| + UpdateMemoryPolicy(); |
| + |
| offscreen_pre_raster_ = enable; |
| } |