Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: android_webview/native/aw_contents.cc

Issue 408803002: aw: Release hardware onTrimMemory(MODERATE) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: auto reset Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/native/aw_contents.h" 5 #include "android_webview/native/aw_contents.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "android_webview/browser/aw_browser_context.h" 9 #include "android_webview/browser/aw_browser_context.h"
10 #include "android_webview/browser/aw_browser_main_parts.h" 10 #include "android_webview/browser/aw_browser_main_parts.h"
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 manager->DidDrawGL(renderer_manager_key_); 349 manager->DidDrawGL(renderer_manager_key_);
350 } 350 }
351 } 351 }
352 352
353 ScopedAppGLStateRestore state_restore( 353 ScopedAppGLStateRestore state_restore(
354 draw_info->mode == AwDrawGLInfo::kModeDraw 354 draw_info->mode == AwDrawGLInfo::kModeDraw
355 ? ScopedAppGLStateRestore::MODE_DRAW 355 ? ScopedAppGLStateRestore::MODE_DRAW
356 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); 356 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
357 ScopedAllowGL allow_gl; 357 ScopedAllowGL allow_gl;
358 358
359 if (!shared_renderer_state_.IsHardwareAllowed()) { 359 if (shared_renderer_state_.IsInsideHardwareRelease()) {
360 hardware_renderer_.reset(); 360 hardware_renderer_.reset();
361 return; 361 return;
362 } 362 }
363 363
364 if (draw_info->mode != AwDrawGLInfo::kModeDraw) 364 if (draw_info->mode != AwDrawGLInfo::kModeDraw)
365 return; 365 return;
366 366
367 if (!hardware_renderer_) { 367 if (!hardware_renderer_) {
368 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); 368 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
369 } 369 }
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 if (cvc) { 836 if (cvc) {
837 cvc->PauseOrResumeGeolocation(paused); 837 cvc->PauseOrResumeGeolocation(paused);
838 if (paused) { 838 if (paused) {
839 cvc->PauseVideo(); 839 cvc->PauseVideo();
840 } 840 }
841 } 841 }
842 } 842 }
843 843
844 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { 844 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
846 shared_renderer_state_.SetHardwareAllowed(true);
847 browser_view_renderer_.OnAttachedToWindow(w, h); 846 browser_view_renderer_.OnAttachedToWindow(w, h);
848 } 847 }
849 848
850 void AwContents::InitializeHardwareDrawIfNeeded() { 849 void AwContents::InitializeHardwareDrawIfNeeded() {
851 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 850 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
852 851
853 base::AutoLock lock(render_thread_lock_); 852 base::AutoLock lock(render_thread_lock_);
854 if (renderer_manager_key_ == manager->NullKey()) { 853 if (renderer_manager_key_ == manager->NullKey()) {
855 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_); 854 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_);
856 DeferredGpuCommandService::SetInstance(); 855 DeferredGpuCommandService::SetInstance();
857 } 856 }
858 } 857 }
859 858
860 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { 859 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
861 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 860 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
862 shared_renderer_state_.SetHardwareAllowed(false); 861 ReleaseHardwareDrawIfNeeded();
862 browser_view_renderer_.OnDetachedFromWindow();
863 }
864
865 void AwContents::ReleaseHardwareDrawIfNeeded() {
866 InsideHardwareReleaseReset inside_reset(&shared_renderer_state_);
863 867
864 bool hardware_initialized = browser_view_renderer_.hardware_enabled(); 868 bool hardware_initialized = browser_view_renderer_.hardware_enabled();
865 if (hardware_initialized) { 869 if (hardware_initialized) {
866 bool draw_functor_succeeded = RequestDrawGL(NULL, true); 870 bool draw_functor_succeeded = RequestDrawGL(NULL, true);
867 if (!draw_functor_succeeded) { 871 if (!draw_functor_succeeded) {
868 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; 872 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?";
869 // Calling release on wrong thread intentionally. 873 // Calling release on wrong thread intentionally.
870 AwDrawGLInfo info; 874 AwDrawGLInfo info;
871 info.mode = AwDrawGLInfo::kModeProcess; 875 info.mode = AwDrawGLInfo::kModeProcess;
872 DrawGL(&info); 876 DrawGL(&info);
873 } 877 }
878 browser_view_renderer_.ReleaseHardware();
874 } 879 }
875
876 DCHECK(!hardware_renderer_); 880 DCHECK(!hardware_renderer_);
877 browser_view_renderer_.OnDetachedFromWindow();
878 881
879 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 882 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
880 883
881 { 884 {
882 base::AutoLock lock(render_thread_lock_); 885 base::AutoLock lock(render_thread_lock_);
883 if (renderer_manager_key_ != manager->NullKey()) { 886 if (renderer_manager_key_ != manager->NullKey()) {
884 manager->Remove(renderer_manager_key_); 887 manager->Remove(renderer_manager_key_);
885 renderer_manager_key_ = manager->NullKey(); 888 renderer_manager_key_ = manager->NullKey();
886 } 889 }
887 } 890 }
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 jboolean network_up) { 1128 jboolean network_up) {
1126 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1127 render_view_host_ext_->SetJsOnlineProperty(network_up); 1130 render_view_host_ext_->SetJsOnlineProperty(network_up);
1128 } 1131 }
1129 1132
1130 void AwContents::TrimMemory(JNIEnv* env, 1133 void AwContents::TrimMemory(JNIEnv* env,
1131 jobject obj, 1134 jobject obj,
1132 jint level, 1135 jint level,
1133 jboolean visible) { 1136 jboolean visible) {
1134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1138 enum {
1139 TRIM_MEMORY_MODERATE = 60,
1140 };
1141 if (level >= TRIM_MEMORY_MODERATE) {
1142 ReleaseHardwareDrawIfNeeded();
1143 return;
1144 }
1145
1135 browser_view_renderer_.TrimMemory(level, visible); 1146 browser_view_renderer_.TrimMemory(level, visible);
1136 } 1147 }
1137 1148
1138 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { 1149 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) {
1139 g_should_download_favicons = true; 1150 g_should_download_favicons = true;
1140 } 1151 }
1141 1152
1142 } // namespace android_webview 1153 } // namespace android_webview
OLDNEW
« android_webview/browser/shared_renderer_state.h ('K') | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698