summaryrefslogtreecommitdiffstats
path: root/android_webview/browser
diff options
context:
space:
mode:
Diffstat (limited to 'android_webview/browser')
-rw-r--r--android_webview/browser/browser_view_renderer.h3
-rw-r--r--android_webview/browser/in_process_view_renderer.cc78
-rw-r--r--android_webview/browser/in_process_view_renderer.h7
-rw-r--r--android_webview/browser/scoped_app_gl_state_restore.cc23
-rw-r--r--android_webview/browser/scoped_app_gl_state_restore.h2
5 files changed, 95 insertions, 18 deletions
diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h
index 0ae9538..73c48b9 100644
--- a/android_webview/browser/browser_view_renderer.h
+++ b/android_webview/browser/browser_view_renderer.h
@@ -140,6 +140,9 @@ class BrowserViewRenderer {
virtual bool IsVisible() = 0;
virtual gfx::Rect GetScreenRect() = 0;
+ // ComponentCallbacks2.onTrimMemory callback.
+ virtual void TrimMemory(int level) = 0;
+
virtual ~BrowserViewRenderer() {}
};
diff --git a/android_webview/browser/in_process_view_renderer.cc b/android_webview/browser/in_process_view_renderer.cc
index 39bd2f6..a41644d 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) {
diff --git a/android_webview/browser/in_process_view_renderer.h b/android_webview/browser/in_process_view_renderer.h
index ce5c584..42eac24 100644
--- a/android_webview/browser/in_process_view_renderer.h
+++ b/android_webview/browser/in_process_view_renderer.h
@@ -10,6 +10,7 @@
#include "android_webview/browser/browser_view_renderer.h"
#include "android_webview/browser/gl_view_renderer_manager.h"
#include "base/cancelable_callback.h"
+#include "content/public/browser/android/synchronous_compositor.h"
#include "content/public/browser/android/synchronous_compositor_client.h"
#include "ui/gfx/vector2d_f.h"
@@ -71,6 +72,7 @@ class InProcessViewRenderer : public BrowserViewRenderer,
virtual bool IsAttachedToWindow() OVERRIDE;
virtual bool IsVisible() OVERRIDE;
virtual gfx::Rect GetScreenRect() OVERRIDE;
+ virtual void TrimMemory(int level) OVERRIDE;
// SynchronousCompositorClient overrides
virtual void DidInitializeCompositor(
@@ -108,6 +110,7 @@ class InProcessViewRenderer : public BrowserViewRenderer,
// If we call up view invalidate and OnDraw is not called before a deadline,
// then we keep ticking the SynchronousCompositor so it can make progress.
void FallbackTickFired();
+ void ForceFakeCompositeSW();
void NoLongerExpectsDrawGL();
@@ -115,6 +118,8 @@ class InProcessViewRenderer : public BrowserViewRenderer,
gfx::Vector2d max_scroll_offset() const;
+ void SetMemoryPolicy(content::SynchronousCompositorMemoryPolicy& new_policy);
+
// For debug tracing or logging. Return the string representation of this
// view renderer's state and the |draw_info| if provided.
std::string ToString(AwDrawGLInfo* draw_info) const;
@@ -176,6 +181,8 @@ class InProcessViewRenderer : public BrowserViewRenderer,
GLViewRendererManager::Key manager_key_;
+ content::SynchronousCompositorMemoryPolicy memory_policy_;
+
DISALLOW_COPY_AND_ASSIGN(InProcessViewRenderer);
};
diff --git a/android_webview/browser/scoped_app_gl_state_restore.cc b/android_webview/browser/scoped_app_gl_state_restore.cc
index f72c1b4..6f71eee 100644
--- a/android_webview/browser/scoped_app_gl_state_restore.cc
+++ b/android_webview/browser/scoped_app_gl_state_restore.cc
@@ -64,7 +64,7 @@ ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) : mode_(mode) {
DCHECK_EQ(0, vertex_array_buffer_binding_);
DCHECK_EQ(0, index_array_buffer_binding_);
break;
- case MODE_DETACH_FROM_WINDOW:
+ case MODE_RESOURCE_MANAGEMENT:
glGetBooleanv(GL_BLEND, &blend_enabled_);
glGetIntegerv(GL_BLEND_SRC_RGB, &blend_src_rgb_);
glGetIntegerv(GL_BLEND_SRC_ALPHA, &blend_src_alpha_);
@@ -205,17 +205,22 @@ ScopedAppGLStateRestore::~ScopedAppGLStateRestore() {
enable_sample_alpha_to_coverage_);
GLEnableDisable(GL_SAMPLE_COVERAGE, enable_sample_coverage_);
- if (mode_ == MODE_DETACH_FROM_WINDOW) {
- GLEnableDisable(GL_BLEND, blend_enabled_);
- glBlendFuncSeparate(
- blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_);
+ switch(mode_) {
+ case MODE_DRAW:
+ // No-op.
+ break;
+ case MODE_RESOURCE_MANAGEMENT:
+ GLEnableDisable(GL_BLEND, blend_enabled_);
+ glBlendFuncSeparate(
+ blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_);
- glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]);
+ glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]);
- GLEnableDisable(GL_SCISSOR_TEST, scissor_test_);
+ GLEnableDisable(GL_SCISSOR_TEST, scissor_test_);
- glScissor(
- scissor_box_[0], scissor_box_[1], scissor_box_[2], scissor_box_[3]);
+ glScissor(
+ scissor_box_[0], scissor_box_[1], scissor_box_[2], scissor_box_[3]);
+ break;
}
GLEnableDisable(GL_STENCIL_TEST, stencil_test_);
diff --git a/android_webview/browser/scoped_app_gl_state_restore.h b/android_webview/browser/scoped_app_gl_state_restore.h
index 93b5ad5..a6e1b93 100644
--- a/android_webview/browser/scoped_app_gl_state_restore.h
+++ b/android_webview/browser/scoped_app_gl_state_restore.h
@@ -18,7 +18,7 @@ class ScopedAppGLStateRestore {
public:
enum CallMode {
MODE_DRAW,
- MODE_DETACH_FROM_WINDOW
+ MODE_RESOURCE_MANAGEMENT,
};
ScopedAppGLStateRestore(CallMode mode);