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

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

Issue 255023004: Add synchronous requestDrawGL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: DCHECK 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
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 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 jint GetNativeInstanceCount(JNIEnv* env, jclass) { 309 jint GetNativeInstanceCount(JNIEnv* env, jclass) {
310 return base::subtle::NoBarrier_Load(&g_instance_count); 310 return base::subtle::NoBarrier_Load(&g_instance_count);
311 } 311 }
312 312
313 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { 313 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
315 return reinterpret_cast<intptr_t>(this); 315 return reinterpret_cast<intptr_t>(this);
316 } 316 }
317 317
318 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { 318 void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
319 if (!hardware_renderer_) { 319 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null();
320 // TODO(boliu): Use executeHardwareAction to synchronously initialize 320 c = shared_renderer_state_.PopFrontClosure()) {
321 // hardware on first functor request. Then functor can point directly 321 c.Run();
322 // to HardwareRenderer.
323 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
324 } 322 }
325 323
324 // TODO(boliu): Make this a task as well.
326 DrawGLResult result; 325 DrawGLResult result;
327 if (hardware_renderer_->DrawGL(draw_info, &result)) { 326 if (hardware_renderer_ && hardware_renderer_->DrawGL(draw_info, &result)) {
328 content::BrowserThread::PostTask( 327 content::BrowserThread::PostTask(
329 content::BrowserThread::UI, 328 content::BrowserThread::UI,
330 FROM_HERE, 329 FROM_HERE,
331 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); 330 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result));
332 } 331 }
333 } 332 }
334 333
335 void AwContents::DidDrawGL(const DrawGLResult& result) { 334 void AwContents::DidDrawGL(const DrawGLResult& result) {
336 browser_view_renderer_.DidDrawGL(result); 335 browser_view_renderer_.DidDrawGL(result);
337 } 336 }
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
599 JNIEnv* env = AttachCurrentThread(); 598 JNIEnv* env = AttachCurrentThread();
600 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 599 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
601 if (obj.is_null()) 600 if (obj.is_null())
602 return; 601 return;
603 602
604 Java_AwContents_onReceivedTouchIconUrl( 603 Java_AwContents_onReceivedTouchIconUrl(
605 env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed); 604 env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed);
606 } 605 }
607 606
608 bool AwContents::RequestDrawGL(jobject canvas) { 607 bool AwContents::RequestDrawGL(jobject canvas, bool wait_for_completion) {
609 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
609 DCHECK(!canvas || !wait_for_completion);
610 JNIEnv* env = AttachCurrentThread(); 610 JNIEnv* env = AttachCurrentThread();
611 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 611 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
612 if (obj.is_null()) 612 if (obj.is_null())
613 return false; 613 return false;
614 return Java_AwContents_requestDrawGL(env, obj.obj(), canvas); 614 return Java_AwContents_requestDrawGL(
615 env, obj.obj(), canvas, wait_for_completion);
615 } 616 }
616 617
617 void AwContents::PostInvalidate() { 618 void AwContents::PostInvalidate() {
618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 619 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
619 JNIEnv* env = AttachCurrentThread(); 620 JNIEnv* env = AttachCurrentThread();
620 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 621 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
621 if (!obj.is_null()) 622 if (!obj.is_null())
622 Java_AwContents_postInvalidateOnAnimation(env, obj.obj()); 623 Java_AwContents_postInvalidateOnAnimation(env, obj.obj());
623 } 624 }
624 625
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 if (cvc) { 720 if (cvc) {
720 cvc->PauseOrResumeGeolocation(paused); 721 cvc->PauseOrResumeGeolocation(paused);
721 if (paused) { 722 if (paused) {
722 cvc->PauseVideo(); 723 cvc->PauseVideo();
723 } 724 }
724 } 725 }
725 } 726 }
726 727
727 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { 728 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 729 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
730 // Add task but don't schedule it. It will run when DrawGL is called for
731 // the first time.
732 shared_renderer_state_.AppendClosure(
733 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread,
734 base::Unretained(this)));
729 browser_view_renderer_.OnAttachedToWindow(w, h); 735 browser_view_renderer_.OnAttachedToWindow(w, h);
730 } 736 }
731 737
738 void AwContents::InitializeHardwareDrawOnRenderThread() {
739 DCHECK(!hardware_renderer_);
740 DCHECK(!shared_renderer_state_.IsHardwareInitialized());
741 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
742 shared_renderer_state_.SetHardwareInitialized(true);
743 }
744
732 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { 745 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
733 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 746 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
747
748 shared_renderer_state_.ClearClosureQueue();
749 shared_renderer_state_.AppendClosure(base::Bind(
750 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this)));
751 bool draw_functor_succeeded = RequestDrawGL(NULL, true);
752 if (!draw_functor_succeeded &&
753 shared_renderer_state_.IsHardwareInitialized()) {
754 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked";
755 // Calling release on wrong thread intentionally.
756 ReleaseHardwareDrawOnRenderThread();
757 } else {
758 shared_renderer_state_.ClearClosureQueue();
759 }
760
734 browser_view_renderer_.OnDetachedFromWindow(); 761 browser_view_renderer_.OnDetachedFromWindow();
735 } 762 }
736 763
737 void AwContents::ReleaseHardwareDrawOnRenderThread(JNIEnv* env, jobject obj) { 764 void AwContents::ReleaseHardwareDrawOnRenderThread() {
765 DCHECK(hardware_renderer_);
766 DCHECK(shared_renderer_state_.IsHardwareInitialized());
767 // No point in running any other commands if we released hardware already.
768 shared_renderer_state_.ClearClosureQueue();
738 hardware_renderer_.reset(); 769 hardware_renderer_.reset();
770 shared_renderer_state_.SetHardwareInitialized(false);
739 } 771 }
740 772
741 base::android::ScopedJavaLocalRef<jbyteArray> 773 base::android::ScopedJavaLocalRef<jbyteArray>
742 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { 774 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) {
743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 775 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
744 // Required optimization in WebViewClassic to not save any state if 776 // Required optimization in WebViewClassic to not save any state if
745 // there has been no navigations. 777 // there has been no navigations.
746 if (!web_contents_->GetController().GetEntryCount()) 778 if (!web_contents_->GetController().GetEntryCount())
747 return ScopedJavaLocalRef<jbyteArray>(); 779 return ScopedJavaLocalRef<jbyteArray>();
748 780
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 base::Bind(&NotifyClientCertificatesChanged)); 1019 base::Bind(&NotifyClientCertificatesChanged));
988 } 1020 }
989 1021
990 void AwContents::SetJsOnlineProperty(JNIEnv* env, 1022 void AwContents::SetJsOnlineProperty(JNIEnv* env,
991 jobject obj, 1023 jobject obj,
992 jboolean network_up) { 1024 jboolean network_up) {
993 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1025 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
994 render_view_host_ext_->SetJsOnlineProperty(network_up); 1026 render_view_host_ext_->SetJsOnlineProperty(network_up);
995 } 1027 }
996 1028
997 void AwContents::TrimMemoryOnRenderThread(JNIEnv* env, 1029 void AwContents::TrimMemory(JNIEnv* env,
998 jobject obj, 1030 jobject obj,
999 jint level, 1031 jint level,
1000 jboolean visible) { 1032 jboolean visible) {
1001 if (hardware_renderer_) { 1033 if (!shared_renderer_state_.IsHardwareInitialized())
1002 if (hardware_renderer_->TrimMemory(level, visible)) { 1034 return;
1003 content::BrowserThread::PostTask( 1035
1004 content::BrowserThread::UI, 1036 shared_renderer_state_.AppendClosure(
1005 FROM_HERE, 1037 base::Bind(&AwContents::TrimMemoryOnRenderThread,
1006 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_)); 1038 base::Unretained(this),
1007 } 1039 level,
1040 visible));
1041 RequestDrawGL(NULL, true);
1042 }
1043
1044 void AwContents::TrimMemoryOnRenderThread(int level, bool visible) {
1045 if (hardware_renderer_ && hardware_renderer_->TrimMemory(level, visible)) {
1046 content::BrowserThread::PostTask(
1047 content::BrowserThread::UI,
1048 FROM_HERE,
1049 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_));
1008 } 1050 }
1009 } 1051 }
1010 1052
1011 void AwContents::ForceFakeComposite() { 1053 void AwContents::ForceFakeComposite() {
1012 browser_view_renderer_.ForceFakeCompositeSW(); 1054 browser_view_renderer_.ForceFakeCompositeSW();
1013 } 1055 }
1014 1056
1015 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { 1057 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) {
1016 g_should_download_favicons = true; 1058 g_should_download_favicons = true;
1017 } 1059 }
1018 1060
1019 } // namespace android_webview 1061 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698