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

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: roll aosp 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));
610 JNIEnv* env = AttachCurrentThread(); 609 JNIEnv* env = AttachCurrentThread();
611 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 610 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
612 if (obj.is_null()) 611 if (obj.is_null())
613 return false; 612 return false;
614 return Java_AwContents_requestDrawGL(env, obj.obj(), canvas); 613 return Java_AwContents_requestDrawGL(
614 env, obj.obj(), canvas, wait_for_completion);
615 } 615 }
616 616
617 void AwContents::PostInvalidate() { 617 void AwContents::PostInvalidate() {
618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
619 JNIEnv* env = AttachCurrentThread(); 619 JNIEnv* env = AttachCurrentThread();
620 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 620 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
621 if (!obj.is_null()) 621 if (!obj.is_null())
622 Java_AwContents_postInvalidateOnAnimation(env, obj.obj()); 622 Java_AwContents_postInvalidateOnAnimation(env, obj.obj());
623 } 623 }
624 624
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 if (cvc) { 719 if (cvc) {
720 cvc->PauseOrResumeGeolocation(paused); 720 cvc->PauseOrResumeGeolocation(paused);
721 if (paused) { 721 if (paused) {
722 cvc->PauseVideo(); 722 cvc->PauseVideo();
723 } 723 }
724 } 724 }
725 } 725 }
726 726
727 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { 727 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
729 // Add task but don't schedule it. It will run when DrawGL is called for
730 // the first time.
731 shared_renderer_state_.AppendClosure(
732 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread,
733 base::Unretained(this)));
729 browser_view_renderer_.OnAttachedToWindow(w, h); 734 browser_view_renderer_.OnAttachedToWindow(w, h);
730 } 735 }
731 736
737 void AwContents::InitializeHardwareDrawOnRenderThread() {
738 DCHECK(!hardware_renderer_);
739 DCHECK(!shared_renderer_state_.IsHardwareInitialized());
740 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
741 shared_renderer_state_.SetHardwareInitialized(true);
hush (inactive) 2014/05/01 00:35:54 why do we need this? We are resetting hardware_ren
boliu 2014/05/01 00:46:36 Can't query hardware_renderer_ on UI thread since
hush (inactive) 2014/05/01 01:08:04 okay On 2014/05/01 00:46:36, boliu wrote:
742 }
743
732 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { 744 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
733 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 745 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
746
747 shared_renderer_state_.ClearClosureQueue();
748 shared_renderer_state_.AppendClosure(base::Bind(
749 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this)));
750 bool draw_functor_succeeded = RequestDrawGL(NULL, true);
hush (inactive) 2014/05/01 00:35:54 these 3 lines seem like a good candidate for a mem
boliu 2014/05/01 00:46:36 I thought about it, but we have 3 tasks and 3 diff
hush (inactive) 2014/05/01 01:08:04 alright On 2014/05/01 00:46:36, boliu wrote:
751 if (!draw_functor_succeeded &&
752 shared_renderer_state_.IsHardwareInitialized()) {
753 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked";
754 // Calling release on wrong thread intentionally.
755 ReleaseHardwareDrawOnRenderThread();
756 } else {
757 shared_renderer_state_.ClearClosureQueue();
758 }
759
734 browser_view_renderer_.OnDetachedFromWindow(); 760 browser_view_renderer_.OnDetachedFromWindow();
735 } 761 }
736 762
737 void AwContents::ReleaseHardwareDrawOnRenderThread(JNIEnv* env, jobject obj) { 763 void AwContents::ReleaseHardwareDrawOnRenderThread() {
764 DCHECK(hardware_renderer_);
765 DCHECK(shared_renderer_state_.IsHardwareInitialized());
766 // No point in running any other commands if we released hardware already.
767 shared_renderer_state_.ClearClosureQueue();
738 hardware_renderer_.reset(); 768 hardware_renderer_.reset();
769 shared_renderer_state_.SetHardwareInitialized(false);
739 } 770 }
740 771
741 base::android::ScopedJavaLocalRef<jbyteArray> 772 base::android::ScopedJavaLocalRef<jbyteArray>
742 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { 773 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) {
743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 774 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
744 // Required optimization in WebViewClassic to not save any state if 775 // Required optimization in WebViewClassic to not save any state if
745 // there has been no navigations. 776 // there has been no navigations.
746 if (!web_contents_->GetController().GetEntryCount()) 777 if (!web_contents_->GetController().GetEntryCount())
747 return ScopedJavaLocalRef<jbyteArray>(); 778 return ScopedJavaLocalRef<jbyteArray>();
748 779
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 base::Bind(&NotifyClientCertificatesChanged)); 1018 base::Bind(&NotifyClientCertificatesChanged));
988 } 1019 }
989 1020
990 void AwContents::SetJsOnlineProperty(JNIEnv* env, 1021 void AwContents::SetJsOnlineProperty(JNIEnv* env,
991 jobject obj, 1022 jobject obj,
992 jboolean network_up) { 1023 jboolean network_up) {
993 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1024 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
994 render_view_host_ext_->SetJsOnlineProperty(network_up); 1025 render_view_host_ext_->SetJsOnlineProperty(network_up);
995 } 1026 }
996 1027
997 void AwContents::TrimMemoryOnRenderThread(JNIEnv* env, 1028 void AwContents::TrimMemory(JNIEnv* env,
998 jobject obj, 1029 jobject obj,
999 jint level, 1030 jint level,
1000 jboolean visible) { 1031 jboolean visible) {
1001 if (hardware_renderer_) { 1032 if (!shared_renderer_state_.IsHardwareInitialized())
1002 if (hardware_renderer_->TrimMemory(level, visible)) { 1033 return;
1003 content::BrowserThread::PostTask( 1034
1004 content::BrowserThread::UI, 1035 shared_renderer_state_.AppendClosure(
1005 FROM_HERE, 1036 base::Bind(&AwContents::TrimMemoryOnRenderThread,
1006 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_)); 1037 base::Unretained(this),
1007 } 1038 level,
1039 visible));
1040 RequestDrawGL(NULL, true);
1041 }
1042
1043 void AwContents::TrimMemoryOnRenderThread(int level, bool visible) {
1044 if (hardware_renderer_ && hardware_renderer_->TrimMemory(level, visible)) {
1045 content::BrowserThread::PostTask(
1046 content::BrowserThread::UI,
1047 FROM_HERE,
1048 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_));
1008 } 1049 }
1009 } 1050 }
1010 1051
1011 void AwContents::ForceFakeComposite() { 1052 void AwContents::ForceFakeComposite() {
1012 browser_view_renderer_.ForceFakeCompositeSW(); 1053 browser_view_renderer_.ForceFakeCompositeSW();
1013 } 1054 }
1014 1055
1015 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { 1056 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) {
1016 g_should_download_favicons = true; 1057 g_should_download_favicons = true;
1017 } 1058 }
1018 1059
1019 } // namespace android_webview 1060 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698