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

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

Issue 273703008: aw: Refactor hardware init (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more refactoring 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"
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
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
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
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
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
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
OLDNEW
« android_webview/browser/gl_view_renderer_manager.cc ('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