From 4ed5b9f62d7850fc5d9b2a006d3c368a9183c16d Mon Sep 17 00:00:00 2001 From: Magnus Jedvert Date: Thu, 15 Sep 2016 15:30:17 +0200 Subject: [PATCH] Android SurfaceViewRenderer: Create EGL context on render thread This CL avoids eglMakeCurrent failing on some problematic Marvel based Jelly Bean devices. BUG=webrtc:6350 R=perkj@webrtc.org, sakal@webrtc.org Review URL: https://codereview.webrtc.org/2339573002 . Cr-Commit-Position: refs/heads/master@{#14234} --- .../java/src/org/webrtc/SurfaceViewRenderer.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java index fd02fd583a..eec6add932 100644 --- a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java +++ b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java @@ -145,8 +145,9 @@ public class SurfaceViewRenderer extends SurfaceView * |drawer|. It is allowed to call init() to reinitialize the renderer after a previous * init()/release() cycle. */ - public void init(EglBase.Context sharedContext, RendererCommon.RendererEvents rendererEvents, - int[] configAttributes, RendererCommon.GlDrawer drawer) { + public void init( + final EglBase.Context sharedContext, RendererCommon.RendererEvents rendererEvents, + final int[] configAttributes, RendererCommon.GlDrawer drawer) { synchronized (handlerLock) { if (renderThreadHandler != null) { throw new IllegalStateException(getResourceName() + "Already initialized"); @@ -156,8 +157,16 @@ public class SurfaceViewRenderer extends SurfaceView this.drawer = drawer; renderThread = new HandlerThread(TAG); renderThread.start(); - eglBase = EglBase.create(sharedContext, configAttributes); renderThreadHandler = new Handler(renderThread.getLooper()); + // Create EGL context on the newly created render thread. It should be possibly to create the + // context on this thread and make it current on the render thread, but this causes failure on + // some Marvel based JB devices. https://bugs.chromium.org/p/webrtc/issues/detail?id=6350. + ThreadUtils.invokeAtFrontUninterruptibly(renderThreadHandler, new Runnable() { + @Override + public void run() { + eglBase = EglBase.create(sharedContext, configAttributes); + } + }); } tryCreateEglSurface(); }