Index: android_webview/browser/in_process_view_renderer.cc |
diff --git a/android_webview/browser/in_process_view_renderer.cc b/android_webview/browser/in_process_view_renderer.cc |
index 39f88378692f1cbf4ea4a53304630eb81720eba7..55b8201d2a72eca66f61cf0b75c4bf92b3a89acc 100644 |
--- a/android_webview/browser/in_process_view_renderer.cc |
+++ b/android_webview/browser/in_process_view_renderer.cc |
@@ -171,6 +171,21 @@ bool ScopedAllowGL::allow_gl = false; |
base::LazyInstance<GLViewRendererManager>::Leaky g_view_renderer_manager; |
+void RequestProcessGLOnUIThread() { |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, base::Bind(&RequestProcessGLOnUIThread)); |
+ return; |
+ } |
+ |
+ InProcessViewRenderer* renderer = static_cast<InProcessViewRenderer*>( |
+ g_view_renderer_manager.Get().GetMostRecentlyDrawn()); |
+ if (!renderer || !renderer->RequestProcessGL()) { |
+ LOG(ERROR) << "Failed to request GL process. Deadlock likely: " |
+ << !!renderer; |
+ } |
+} |
+ |
} // namespace |
// Called from different threads! |
@@ -178,11 +193,7 @@ static void ScheduleGpuWork() { |
if (ScopedAllowGL::IsAllowed()) { |
gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread(); |
} else { |
- InProcessViewRenderer* renderer = static_cast<InProcessViewRenderer*>( |
- g_view_renderer_manager.Get().GetMostRecentlyDrawn()); |
- if (!renderer || !renderer->RequestProcessGL()) { |
- LOG(ERROR) << "Failed to request DrawGL. Probably going to deadlock."; |
- } |
+ RequestProcessGLOnUIThread(); |
} |
} |
@@ -783,7 +794,8 @@ void InProcessViewRenderer::EnsureContinuousInvalidation( |
// ticked. This can happen if this is reached because |
// invalidate_ignore_compositor is true. |
if (compositor_needs_continuous_invalidate_) { |
- base::MessageLoop::current()->PostDelayedTask( |
+ BrowserThread::PostDelayedTask( |
+ BrowserThread::UI, |
FROM_HERE, |
fallback_tick_.callback(), |
base::TimeDelta::FromMilliseconds( |