Index: android_webview/native/aw_contents.cc |
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc |
index 37e05a588c0e6b0a7255f557b1981848b15de928..32cc8d1a4de9b85bde117fc05a2975615f2e386b 100644 |
--- a/android_webview/native/aw_contents.cc |
+++ b/android_webview/native/aw_contents.cc |
@@ -356,7 +356,7 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) { |
: ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); |
ScopedAllowGL allow_gl; |
- if (!shared_renderer_state_.IsHardwareAllowed()) { |
+ if (shared_renderer_state_.IsInsideHardwareRelease()) { |
hardware_renderer_.reset(); |
return; |
} |
@@ -843,7 +843,6 @@ void AwContents::SetIsPaused(JNIEnv* env, jobject obj, bool paused) { |
void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- shared_renderer_state_.SetHardwareAllowed(true); |
browser_view_renderer_.OnAttachedToWindow(w, h); |
} |
@@ -859,7 +858,12 @@ void AwContents::InitializeHardwareDrawIfNeeded() { |
void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- shared_renderer_state_.SetHardwareAllowed(false); |
+ ReleaseHardwareDrawIfNeeded(); |
+ browser_view_renderer_.OnDetachedFromWindow(); |
+} |
+ |
+void AwContents::ReleaseHardwareDrawIfNeeded() { |
+ InsideHardwareReleaseReset inside_reset(&shared_renderer_state_); |
bool hardware_initialized = browser_view_renderer_.hardware_enabled(); |
if (hardware_initialized) { |
@@ -871,10 +875,9 @@ void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
info.mode = AwDrawGLInfo::kModeProcess; |
DrawGL(&info); |
} |
+ browser_view_renderer_.ReleaseHardware(); |
} |
- |
DCHECK(!hardware_renderer_); |
- browser_view_renderer_.OnDetachedFromWindow(); |
GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); |
@@ -1132,6 +1135,14 @@ void AwContents::TrimMemory(JNIEnv* env, |
jint level, |
jboolean visible) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ enum { |
+ TRIM_MEMORY_MODERATE = 60, |
+ }; |
+ if (level >= TRIM_MEMORY_MODERATE) { |
+ ReleaseHardwareDrawIfNeeded(); |
+ return; |
+ } |
+ |
browser_view_renderer_.TrimMemory(level, visible); |
} |