Chromium Code Reviews| Index: android_webview/native/aw_contents.cc |
| diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc |
| index 6ca3ac5fe524bd1eb41f5468078cf113c4faa9af..2cfdcd580b0d7697a3de6a1a5b6ee7a4f17a4702 100644 |
| --- a/android_webview/native/aw_contents.cc |
| +++ b/android_webview/native/aw_contents.cc |
| @@ -10,10 +10,12 @@ |
| #include "android_webview/browser/aw_browser_main_parts.h" |
| #include "android_webview/browser/aw_resource_context.h" |
| #include "android_webview/browser/browser_view_renderer.h" |
| +#include "android_webview/browser/deferred_gpu_command_service.h" |
| #include "android_webview/browser/gpu_memory_buffer_factory_impl.h" |
| #include "android_webview/browser/hardware_renderer.h" |
| #include "android_webview/browser/net_disk_cache_remover.h" |
| #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h" |
| +#include "android_webview/browser/scoped_app_gl_state_restore.h" |
| #include "android_webview/common/aw_hit_test_data.h" |
| #include "android_webview/common/devtools_instrumentation.h" |
| #include "android_webview/native/aw_autofill_manager_delegate.h" |
| @@ -159,7 +161,8 @@ AwContents::AwContents(scoped_ptr<WebContents> web_contents) |
| this, |
| &shared_renderer_state_, |
| web_contents_.get(), |
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)) { |
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), |
| + renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { |
| base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); |
| icon_helper_.reset(new IconHelper(web_contents_.get())); |
| icon_helper_->SetListener(this); |
| @@ -324,14 +327,28 @@ jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { |
| } |
| void AwContents::DrawGL(AwDrawGLInfo* draw_info) { |
| + GLViewRendererManager::GetInstance()->DidDrawGL(renderer_manager_key_); |
| + |
| + ScopedAppGLStateRestore state_restore( |
| + draw_info->mode == AwDrawGLInfo::kModeDraw |
| + ? ScopedAppGLStateRestore::MODE_DRAW |
| + : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); |
| + ScopedAllowGL allow_gl; |
| + |
| for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); |
| c = shared_renderer_state_.PopFrontClosure()) { |
| c.Run(); |
| } |
| + if (!hardware_renderer_) |
| + return; |
| + |
| // TODO(boliu): Make this a task as well. |
| DrawGLResult result; |
| - if (hardware_renderer_ && hardware_renderer_->DrawGL(draw_info, &result)) { |
| + if (hardware_renderer_->DrawGL(state_restore.stencil_enabled(), |
| + state_restore.framebuffer_binding_ext(), |
| + draw_info, |
| + &result)) { |
| content::BrowserThread::PostTask( |
| content::BrowserThread::UI, |
| FROM_HERE, |
| @@ -759,14 +776,22 @@ void AwContents::SetIsPaused(JNIEnv* env, jobject obj, bool paused) { |
| void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - // Add task but don't schedule it. It will run when DrawGL is called for |
| - // the first time. |
| - shared_renderer_state_.AppendClosure( |
| - base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, |
| - base::Unretained(this))); |
| browser_view_renderer_.OnAttachedToWindow(w, h); |
| } |
| +void AwContents::InitializeHardwareDrawIfNeeded() { |
| + GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); |
| + if (renderer_manager_key_ == manager->NullKey()) { |
| + // Add task but don't schedule it. It will run when DrawGL is called for |
| + // the first time. |
| + shared_renderer_state_.AppendClosure( |
| + base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, |
| + base::Unretained(this))); |
| + renderer_manager_key_ = manager->PushBack(&shared_renderer_state_); |
| + DeferredGpuCommandService::SetInstance(); |
| + } |
| +} |
| + |
| void AwContents::InitializeHardwareDrawOnRenderThread() { |
| DCHECK(!hardware_renderer_); |
| DCHECK(!shared_renderer_state_.IsHardwareInitialized()); |
| @@ -783,14 +808,22 @@ void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
| bool draw_functor_succeeded = RequestDrawGL(NULL, true); |
| if (!draw_functor_succeeded && |
| shared_renderer_state_.IsHardwareInitialized()) { |
| - LOG(ERROR) << "Unable to free GL resources. Has the Window leaked"; |
| + LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; |
| // Calling release on wrong thread intentionally. |
| - ReleaseHardwareDrawOnRenderThread(); |
| + AwDrawGLInfo info; |
| + info.mode = AwDrawGLInfo::kModeProcess; |
| + DrawGL(&info); |
| } else { |
| shared_renderer_state_.ClearClosureQueue(); |
| } |
| browser_view_renderer_.OnDetachedFromWindow(); |
| + |
| + GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); |
| + if (renderer_manager_key_ != manager->NullKey()) { |
| + manager->Remove(renderer_manager_key_); |
| + renderer_manager_key_ = manager->NullKey(); |
| + } |
| } |
| void AwContents::ReleaseHardwareDrawOnRenderThread() { |
| @@ -850,6 +883,8 @@ bool AwContents::OnDraw(JNIEnv* env, |
| jint clip_right, |
| jint clip_bottom) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + 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
|
| + InitializeHardwareDrawIfNeeded(); |
| return browser_view_renderer_.OnDraw( |
| canvas, |
| is_hardware_accelerated, |