OLD | NEW |
---|---|
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" |
11 #include "android_webview/browser/aw_resource_context.h" | 11 #include "android_webview/browser/aw_resource_context.h" |
12 #include "android_webview/browser/browser_view_renderer.h" | 12 #include "android_webview/browser/browser_view_renderer.h" |
13 #include "android_webview/browser/deferred_gpu_command_service.h" | |
13 #include "android_webview/browser/gpu_memory_buffer_factory_impl.h" | 14 #include "android_webview/browser/gpu_memory_buffer_factory_impl.h" |
14 #include "android_webview/browser/hardware_renderer.h" | 15 #include "android_webview/browser/hardware_renderer.h" |
15 #include "android_webview/browser/net_disk_cache_remover.h" | 16 #include "android_webview/browser/net_disk_cache_remover.h" |
16 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_dele gate.h" | 17 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_dele gate.h" |
18 #include "android_webview/browser/scoped_app_gl_state_restore.h" | |
17 #include "android_webview/common/aw_hit_test_data.h" | 19 #include "android_webview/common/aw_hit_test_data.h" |
18 #include "android_webview/common/devtools_instrumentation.h" | 20 #include "android_webview/common/devtools_instrumentation.h" |
19 #include "android_webview/native/aw_autofill_manager_delegate.h" | 21 #include "android_webview/native/aw_autofill_manager_delegate.h" |
20 #include "android_webview/native/aw_browser_dependency_factory.h" | 22 #include "android_webview/native/aw_browser_dependency_factory.h" |
21 #include "android_webview/native/aw_contents_client_bridge.h" | 23 #include "android_webview/native/aw_contents_client_bridge.h" |
22 #include "android_webview/native/aw_contents_io_thread_client_impl.h" | 24 #include "android_webview/native/aw_contents_io_thread_client_impl.h" |
23 #include "android_webview/native/aw_pdf_exporter.h" | 25 #include "android_webview/native/aw_pdf_exporter.h" |
24 #include "android_webview/native/aw_picture.h" | 26 #include "android_webview/native/aw_picture.h" |
25 #include "android_webview/native/aw_web_contents_delegate.h" | 27 #include "android_webview/native/aw_web_contents_delegate.h" |
26 #include "android_webview/native/java_browser_view_renderer_helper.h" | 28 #include "android_webview/native/java_browser_view_renderer_helper.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
152 : weak_factory_on_ui_thread_(this), | 154 : weak_factory_on_ui_thread_(this), |
153 ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()), | 155 ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()), |
154 web_contents_(web_contents.Pass()), | 156 web_contents_(web_contents.Pass()), |
155 shared_renderer_state_( | 157 shared_renderer_state_( |
156 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | 158 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |
157 this), | 159 this), |
158 browser_view_renderer_( | 160 browser_view_renderer_( |
159 this, | 161 this, |
160 &shared_renderer_state_, | 162 &shared_renderer_state_, |
161 web_contents_.get(), | 163 web_contents_.get(), |
162 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)) { | 164 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), |
165 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { | |
163 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); | 166 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); |
164 icon_helper_.reset(new IconHelper(web_contents_.get())); | 167 icon_helper_.reset(new IconHelper(web_contents_.get())); |
165 icon_helper_->SetListener(this); | 168 icon_helper_->SetListener(this); |
166 web_contents_->SetUserData(kAwContentsUserDataKey, | 169 web_contents_->SetUserData(kAwContentsUserDataKey, |
167 new AwContentsUserData(this)); | 170 new AwContentsUserData(this)); |
168 render_view_host_ext_.reset( | 171 render_view_host_ext_.reset( |
169 new AwRenderViewHostExt(this, web_contents_.get())); | 172 new AwRenderViewHostExt(this, web_contents_.get())); |
170 | 173 |
171 permission_request_handler_.reset(new PermissionRequestHandler(this)); | 174 permission_request_handler_.reset(new PermissionRequestHandler(this)); |
172 | 175 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
317 jint GetNativeInstanceCount(JNIEnv* env, jclass) { | 320 jint GetNativeInstanceCount(JNIEnv* env, jclass) { |
318 return base::subtle::NoBarrier_Load(&g_instance_count); | 321 return base::subtle::NoBarrier_Load(&g_instance_count); |
319 } | 322 } |
320 | 323 |
321 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { | 324 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { |
322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 325 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
323 return reinterpret_cast<intptr_t>(this); | 326 return reinterpret_cast<intptr_t>(this); |
324 } | 327 } |
325 | 328 |
326 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { | 329 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { |
330 GLViewRendererManager::GetInstance()->DidDrawGL(renderer_manager_key_); | |
331 | |
332 ScopedAppGLStateRestore state_restore( | |
333 draw_info->mode == AwDrawGLInfo::kModeDraw | |
334 ? ScopedAppGLStateRestore::MODE_DRAW | |
335 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); | |
336 ScopedAllowGL allow_gl; | |
337 | |
327 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); | 338 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); |
328 c = shared_renderer_state_.PopFrontClosure()) { | 339 c = shared_renderer_state_.PopFrontClosure()) { |
329 c.Run(); | 340 c.Run(); |
330 } | 341 } |
331 | 342 |
343 if (!hardware_renderer_) | |
344 return; | |
345 | |
332 // TODO(boliu): Make this a task as well. | 346 // TODO(boliu): Make this a task as well. |
333 DrawGLResult result; | 347 DrawGLResult result; |
334 if (hardware_renderer_ && hardware_renderer_->DrawGL(draw_info, &result)) { | 348 if (hardware_renderer_->DrawGL(state_restore.stencil_enabled(), |
349 state_restore.framebuffer_binding_ext(), | |
350 draw_info, | |
351 &result)) { | |
335 content::BrowserThread::PostTask( | 352 content::BrowserThread::PostTask( |
336 content::BrowserThread::UI, | 353 content::BrowserThread::UI, |
337 FROM_HERE, | 354 FROM_HERE, |
338 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); | 355 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); |
339 } | 356 } |
340 } | 357 } |
341 | 358 |
342 void AwContents::DidDrawGL(const DrawGLResult& result) { | 359 void AwContents::DidDrawGL(const DrawGLResult& result) { |
343 browser_view_renderer_.DidDrawGL(result); | 360 browser_view_renderer_.DidDrawGL(result); |
344 } | 361 } |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
752 if (cvc) { | 769 if (cvc) { |
753 cvc->PauseOrResumeGeolocation(paused); | 770 cvc->PauseOrResumeGeolocation(paused); |
754 if (paused) { | 771 if (paused) { |
755 cvc->PauseVideo(); | 772 cvc->PauseVideo(); |
756 } | 773 } |
757 } | 774 } |
758 } | 775 } |
759 | 776 |
760 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { | 777 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { |
761 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 778 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
762 // Add task but don't schedule it. It will run when DrawGL is called for | |
763 // the first time. | |
764 shared_renderer_state_.AppendClosure( | |
765 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, | |
766 base::Unretained(this))); | |
767 browser_view_renderer_.OnAttachedToWindow(w, h); | 779 browser_view_renderer_.OnAttachedToWindow(w, h); |
768 } | 780 } |
769 | 781 |
782 void AwContents::InitializeHardwareDrawIfNeeded() { | |
783 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); | |
784 if (renderer_manager_key_ == manager->NullKey()) { | |
785 // Add task but don't schedule it. It will run when DrawGL is called for | |
786 // the first time. | |
787 shared_renderer_state_.AppendClosure( | |
788 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, | |
789 base::Unretained(this))); | |
790 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_); | |
791 DeferredGpuCommandService::SetInstance(); | |
792 } | |
793 } | |
794 | |
770 void AwContents::InitializeHardwareDrawOnRenderThread() { | 795 void AwContents::InitializeHardwareDrawOnRenderThread() { |
771 DCHECK(!hardware_renderer_); | 796 DCHECK(!hardware_renderer_); |
772 DCHECK(!shared_renderer_state_.IsHardwareInitialized()); | 797 DCHECK(!shared_renderer_state_.IsHardwareInitialized()); |
773 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); | 798 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); |
774 shared_renderer_state_.SetHardwareInitialized(true); | 799 shared_renderer_state_.SetHardwareInitialized(true); |
775 } | 800 } |
776 | 801 |
777 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { | 802 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
778 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 803 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
779 | 804 |
780 shared_renderer_state_.ClearClosureQueue(); | 805 shared_renderer_state_.ClearClosureQueue(); |
781 shared_renderer_state_.AppendClosure(base::Bind( | 806 shared_renderer_state_.AppendClosure(base::Bind( |
782 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); | 807 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); |
783 bool draw_functor_succeeded = RequestDrawGL(NULL, true); | 808 bool draw_functor_succeeded = RequestDrawGL(NULL, true); |
784 if (!draw_functor_succeeded && | 809 if (!draw_functor_succeeded && |
785 shared_renderer_state_.IsHardwareInitialized()) { | 810 shared_renderer_state_.IsHardwareInitialized()) { |
786 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked"; | 811 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; |
787 // Calling release on wrong thread intentionally. | 812 // Calling release on wrong thread intentionally. |
788 ReleaseHardwareDrawOnRenderThread(); | 813 AwDrawGLInfo info; |
814 info.mode = AwDrawGLInfo::kModeProcess; | |
815 DrawGL(&info); | |
789 } else { | 816 } else { |
790 shared_renderer_state_.ClearClosureQueue(); | 817 shared_renderer_state_.ClearClosureQueue(); |
791 } | 818 } |
792 | 819 |
793 browser_view_renderer_.OnDetachedFromWindow(); | 820 browser_view_renderer_.OnDetachedFromWindow(); |
821 | |
822 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); | |
823 if (renderer_manager_key_ != manager->NullKey()) { | |
824 manager->Remove(renderer_manager_key_); | |
825 renderer_manager_key_ = manager->NullKey(); | |
826 } | |
794 } | 827 } |
795 | 828 |
796 void AwContents::ReleaseHardwareDrawOnRenderThread() { | 829 void AwContents::ReleaseHardwareDrawOnRenderThread() { |
797 // No point in running any other commands if we released hardware already. | 830 // No point in running any other commands if we released hardware already. |
798 shared_renderer_state_.ClearClosureQueue(); | 831 shared_renderer_state_.ClearClosureQueue(); |
799 if (!shared_renderer_state_.IsHardwareInitialized()) | 832 if (!shared_renderer_state_.IsHardwareInitialized()) |
800 return; | 833 return; |
801 | 834 |
802 hardware_renderer_.reset(); | 835 hardware_renderer_.reset(); |
803 shared_renderer_state_.SetHardwareInitialized(false); | 836 shared_renderer_state_.SetHardwareInitialized(false); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
843 jint scroll_y, | 876 jint scroll_y, |
844 jint visible_left, | 877 jint visible_left, |
845 jint visible_top, | 878 jint visible_top, |
846 jint visible_right, | 879 jint visible_right, |
847 jint visible_bottom, | 880 jint visible_bottom, |
848 jint clip_left, | 881 jint clip_left, |
849 jint clip_top, | 882 jint clip_top, |
850 jint clip_right, | 883 jint clip_right, |
851 jint clip_bottom) { | 884 jint clip_bottom) { |
852 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 885 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
886 if (is_hardware_accelerated) | |
sgurun-gerrit only
2014/05/08 22:55:12
why is moving the initialization to here a better
boliu
2014/05/08 23:03:47
It didn't really move, it's just preparation for u
| |
887 InitializeHardwareDrawIfNeeded(); | |
853 return browser_view_renderer_.OnDraw( | 888 return browser_view_renderer_.OnDraw( |
854 canvas, | 889 canvas, |
855 is_hardware_accelerated, | 890 is_hardware_accelerated, |
856 gfx::Vector2d(scroll_x, scroll_y), | 891 gfx::Vector2d(scroll_x, scroll_y), |
857 gfx::Rect(visible_left, | 892 gfx::Rect(visible_left, |
858 visible_top, | 893 visible_top, |
859 visible_right - visible_left, | 894 visible_right - visible_left, |
860 visible_bottom - visible_top), | 895 visible_bottom - visible_top), |
861 gfx::Rect( | 896 gfx::Rect( |
862 clip_left, clip_top, clip_right - clip_left, clip_bottom - clip_top)); | 897 clip_left, clip_top, clip_right - clip_left, clip_bottom - clip_top)); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1062 return; | 1097 return; |
1063 | 1098 |
1064 browser_view_renderer_.TrimMemory(level, visible); | 1099 browser_view_renderer_.TrimMemory(level, visible); |
1065 } | 1100 } |
1066 | 1101 |
1067 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { | 1102 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { |
1068 g_should_download_favicons = true; | 1103 g_should_download_favicons = true; |
1069 } | 1104 } |
1070 | 1105 |
1071 } // namespace android_webview | 1106 } // namespace android_webview |
OLD | NEW |