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

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

Issue 288983007: aw: Fix hardware init/tear down in pop up flow (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more fix Created 6 years, 7 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
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 jint GetNativeInstanceCount(JNIEnv* env, jclass) { 319 jint GetNativeInstanceCount(JNIEnv* env, jclass) {
320 return base::subtle::NoBarrier_Load(&g_instance_count); 320 return base::subtle::NoBarrier_Load(&g_instance_count);
321 } 321 }
322 322
323 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { 323 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
325 return reinterpret_cast<intptr_t>(this); 325 return reinterpret_cast<intptr_t>(this);
326 } 326 }
327 327
328 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { 328 void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
329 GLViewRendererManager::GetInstance()->DidDrawGL(renderer_manager_key_); 329 {
330 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
331 base::AutoLock lock(render_thread_lock_);
332 if (renderer_manager_key_ != manager->NullKey()) {
333 manager->DidDrawGL(renderer_manager_key_);
334 }
335 }
330 336
331 ScopedAppGLStateRestore state_restore( 337 ScopedAppGLStateRestore state_restore(
332 draw_info->mode == AwDrawGLInfo::kModeDraw 338 draw_info->mode == AwDrawGLInfo::kModeDraw
333 ? ScopedAppGLStateRestore::MODE_DRAW 339 ? ScopedAppGLStateRestore::MODE_DRAW
334 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); 340 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
335 ScopedAllowGL allow_gl; 341 ScopedAllowGL allow_gl;
336 342
337 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); 343 if (!shared_renderer_state_.IsHardwareAllowed()) {
338 c = shared_renderer_state_.PopFrontClosure()) { 344 hardware_renderer_.reset();
339 c.Run(); 345 shared_renderer_state_.SetHardwareInitialized(false);
346 return;
340 } 347 }
341 348
342 if (!hardware_renderer_) 349 if (draw_info->mode != AwDrawGLInfo::kModeDraw)
343 return; 350 return;
344 351
345 // TODO(boliu): Make this a task as well. 352 if (!hardware_renderer_) {
353 DCHECK(!shared_renderer_state_.IsHardwareInitialized());
354 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
355 shared_renderer_state_.SetHardwareInitialized(true);
356 }
357
346 DrawGLResult result; 358 DrawGLResult result;
347 if (hardware_renderer_->DrawGL(state_restore.stencil_enabled(), 359 if (hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
348 state_restore.framebuffer_binding_ext(), 360 state_restore.framebuffer_binding_ext(),
349 draw_info, 361 draw_info,
350 &result)) { 362 &result)) {
351 browser_view_renderer_.DidDrawGL(result); 363 browser_view_renderer_.DidDrawGL(result);
352 } 364 }
353 } 365 }
354 366
355 namespace { 367 namespace {
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 if (cvc) { 782 if (cvc) {
771 cvc->PauseOrResumeGeolocation(paused); 783 cvc->PauseOrResumeGeolocation(paused);
772 if (paused) { 784 if (paused) {
773 cvc->PauseVideo(); 785 cvc->PauseVideo();
774 } 786 }
775 } 787 }
776 } 788 }
777 789
778 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { 790 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
779 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 791 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
792 shared_renderer_state_.SetHardwareAllowed(true);
780 browser_view_renderer_.OnAttachedToWindow(w, h); 793 browser_view_renderer_.OnAttachedToWindow(w, h);
781 } 794 }
782 795
783 void AwContents::InitializeHardwareDrawIfNeeded() { 796 void AwContents::InitializeHardwareDrawIfNeeded() {
784 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 797 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
798
799 base::AutoLock lock(render_thread_lock_);
785 if (renderer_manager_key_ == manager->NullKey()) { 800 if (renderer_manager_key_ == manager->NullKey()) {
786 // Add task but don't schedule it. It will run when DrawGL is called for
787 // the first time.
788 shared_renderer_state_.AppendClosure(
789 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread,
790 base::Unretained(this)));
791 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_); 801 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_);
792 DeferredGpuCommandService::SetInstance(); 802 DeferredGpuCommandService::SetInstance();
793 } 803 }
794 } 804 }
795 805
796 void AwContents::InitializeHardwareDrawOnRenderThread() {
797 DCHECK(!hardware_renderer_);
798 DCHECK(!shared_renderer_state_.IsHardwareInitialized());
799 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
800 shared_renderer_state_.SetHardwareInitialized(true);
801 }
802
803 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { 806 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
804 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 807 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
808 shared_renderer_state_.SetHardwareAllowed(false);
805 809
806 shared_renderer_state_.ClearClosureQueue(); 810 bool hardware_initialized = shared_renderer_state_.IsHardwareInitialized();
807 shared_renderer_state_.AppendClosure(base::Bind( 811 if (hardware_initialized) {
808 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); 812 bool draw_functor_succeeded = RequestDrawGL(NULL, true);
809 bool draw_functor_succeeded = RequestDrawGL(NULL, true); 813 if (!draw_functor_succeeded && hardware_initialized) {
810 if (!draw_functor_succeeded && 814 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?";
811 shared_renderer_state_.IsHardwareInitialized()) { 815 // Calling release on wrong thread intentionally.
812 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; 816 AwDrawGLInfo info;
813 // Calling release on wrong thread intentionally. 817 info.mode = AwDrawGLInfo::kModeProcess;
814 AwDrawGLInfo info; 818 DrawGL(&info);
815 info.mode = AwDrawGLInfo::kModeProcess; 819 }
816 DrawGL(&info);
817 } else {
818 shared_renderer_state_.ClearClosureQueue();
819 } 820 }
820 821
822 DCHECK(!hardware_renderer_);
821 browser_view_renderer_.OnDetachedFromWindow(); 823 browser_view_renderer_.OnDetachedFromWindow();
822 824
823 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 825 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
824 if (renderer_manager_key_ != manager->NullKey()) { 826
825 manager->Remove(renderer_manager_key_); 827 {
826 renderer_manager_key_ = manager->NullKey(); 828 base::AutoLock lock(render_thread_lock_);
829 if (renderer_manager_key_ != manager->NullKey()) {
830 manager->Remove(renderer_manager_key_);
831 renderer_manager_key_ = manager->NullKey();
832 }
833 }
834
835 if (hardware_initialized) {
836 // Flush any invoke functors that's caused by OnDetachedFromWindow.
837 RequestDrawGL(NULL, true);
827 } 838 }
828 } 839 }
829 840
830 void AwContents::ReleaseHardwareDrawOnRenderThread() {
831 // No point in running any other commands if we released hardware already.
832 shared_renderer_state_.ClearClosureQueue();
833 if (!shared_renderer_state_.IsHardwareInitialized())
834 return;
835
836 hardware_renderer_.reset();
837 shared_renderer_state_.SetHardwareInitialized(false);
838 }
839
840 base::android::ScopedJavaLocalRef<jbyteArray> 841 base::android::ScopedJavaLocalRef<jbyteArray>
841 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { 842 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) {
842 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 843 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
843 // Required optimization in WebViewClassic to not save any state if 844 // Required optimization in WebViewClassic to not save any state if
844 // there has been no navigations. 845 // there has been no navigations.
845 if (!web_contents_->GetController().GetEntryCount()) 846 if (!web_contents_->GetController().GetEntryCount())
846 return ScopedJavaLocalRef<jbyteArray>(); 847 return ScopedJavaLocalRef<jbyteArray>();
847 848
848 Pickle pickle; 849 Pickle pickle;
849 if (!WriteToPickle(*web_contents_, &pickle)) { 850 if (!WriteToPickle(*web_contents_, &pickle)) {
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 return; 1084 return;
1084 1085
1085 browser_view_renderer_.TrimMemory(level, visible); 1086 browser_view_renderer_.TrimMemory(level, visible);
1086 } 1087 }
1087 1088
1088 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { 1089 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) {
1089 g_should_download_favicons = true; 1090 g_should_download_favicons = true;
1090 } 1091 }
1091 1092
1092 } // namespace android_webview 1093 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698