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}
This commit is contained in:
Magnus Jedvert 2016-09-15 15:30:17 +02:00
parent ec62374ccd
commit 4ed5b9f62d

View File

@ -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();
}