| Index: android_webview/browser/in_process_view_renderer.cc
|
| diff --git a/android_webview/browser/in_process_view_renderer.cc b/android_webview/browser/in_process_view_renderer.cc
|
| index 39bd2f6b889b0d7338ee44320991b894ca6dca9e..a41644d291a5791dd41430c121398a37a4155a09 100644
|
| --- a/android_webview/browser/in_process_view_renderer.cc
|
| +++ b/android_webview/browser/in_process_view_renderer.cc
|
| @@ -19,7 +19,6 @@
|
| #include "base/logging.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/stringprintf.h"
|
| -#include "content/public/browser/android/synchronous_compositor.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/common/content_switches.h"
|
| @@ -316,6 +315,65 @@ bool InProcessViewRenderer::RequestProcessGL() {
|
| return client_->RequestDrawGL(NULL);
|
| }
|
|
|
| +void InProcessViewRenderer::TrimMemory(int level) {
|
| + // Constants from Android ComponentCallbacks2.
|
| + enum {
|
| + TRIM_MEMORY_RUNNING_LOW = 10,
|
| + TRIM_MEMORY_UI_HIDDEN = 20,
|
| + TRIM_MEMORY_BACKGROUND = 40,
|
| + };
|
| +
|
| + // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because
|
| + // it does not indicate memory pressure, but merely that the app is
|
| + // backgrounded.
|
| + if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN)
|
| + return;
|
| +
|
| + // Nothing to drop.
|
| + if (!attached_to_window_ || !hardware_initialized_ || !compositor_)
|
| + return;
|
| +
|
| + // Do not release resources on view we expect to get DrawGL soon.
|
| + if (level < TRIM_MEMORY_BACKGROUND) {
|
| + client_->UpdateGlobalVisibleRect();
|
| + if (view_visible_ && window_visible_ &&
|
| + !cached_global_visible_rect_.IsEmpty()) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| + if (!eglGetCurrentContext()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + // Just set the memory limit to 0 and drop all tiles. This will be reset to
|
| + // normal levels in the next DrawGL call.
|
| + content::SynchronousCompositorMemoryPolicy policy;
|
| + policy.bytes_limit = 0;
|
| + policy.num_resources_limit = 0;
|
| + if (memory_policy_ == policy)
|
| + return;
|
| +
|
| + TRACE_EVENT0("android_webview", "InProcessViewRenderer::TrimMemory");
|
| + ScopedAppGLStateRestore state_restore(
|
| + ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
|
| + gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread();
|
| + ScopedAllowGL allow_gl;
|
| +
|
| + SetMemoryPolicy(policy);
|
| + ForceFakeCompositeSW();
|
| +}
|
| +
|
| +void InProcessViewRenderer::SetMemoryPolicy(
|
| + content::SynchronousCompositorMemoryPolicy& new_policy) {
|
| + if (memory_policy_ == new_policy)
|
| + return;
|
| +
|
| + memory_policy_ = new_policy;
|
| + compositor_->SetMemoryPolicy(memory_policy_);
|
| +}
|
| +
|
| void InProcessViewRenderer::UpdateCachedGlobalVisibleRect() {
|
| client_->UpdateGlobalVisibleRect();
|
| }
|
| @@ -423,7 +481,7 @@ void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) {
|
| policy.bytes_limit =
|
| (policy.bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep;
|
| policy.num_resources_limit = kMaxNumTilesToFillDisplay * g_memory_multiplier;
|
| - compositor_->SetMemoryPolicy(policy);
|
| + SetMemoryPolicy(policy);
|
|
|
| DCHECK(gl_surface_);
|
| gl_surface_->SetBackingFrameBufferObject(
|
| @@ -638,7 +696,7 @@ void InProcessViewRenderer::OnDetachedFromWindow() {
|
| DCHECK(compositor_);
|
|
|
| ScopedAppGLStateRestore state_restore(
|
| - ScopedAppGLStateRestore::MODE_DETACH_FROM_WINDOW);
|
| + ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
|
| gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread();
|
| ScopedAllowGL allow_gl;
|
| compositor_->ReleaseHwDraw();
|
| @@ -869,11 +927,15 @@ void InProcessViewRenderer::FallbackTickFired() {
|
| // This should only be called if OnDraw or DrawGL did not come in time, which
|
| // means block_invalidates_ must still be true.
|
| DCHECK(block_invalidates_);
|
| - if (compositor_needs_continuous_invalidate_ && compositor_) {
|
| - SkBitmapDevice device(SkBitmap::kARGB_8888_Config, 1, 1);
|
| - SkCanvas canvas(&device);
|
| - CompositeSW(&canvas);
|
| - }
|
| + if (compositor_needs_continuous_invalidate_ && compositor_)
|
| + ForceFakeCompositeSW();
|
| +}
|
| +
|
| +void InProcessViewRenderer::ForceFakeCompositeSW() {
|
| + DCHECK(compositor_);
|
| + SkBitmapDevice device(SkBitmap::kARGB_8888_Config, 1, 1);
|
| + SkCanvas canvas(&device);
|
| + CompositeSW(&canvas);
|
| }
|
|
|
| bool InProcessViewRenderer::CompositeSW(SkCanvas* canvas) {
|
|
|