From f355e1a0f6fef72fdc5934fe3512a7fa25f2c1c9 Mon Sep 17 00:00:00 2001 From: Magnus Jedvert Date: Tue, 21 Apr 2020 13:52:38 +0200 Subject: [PATCH] Add glUseProgram to the list of GL functions requiring synchronization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We have observed an internal deadlock in libGLESv2_adreno where one thread is in eglCreateContext and another thread in glUseProgram. We have observed similar deadlocks before and started to synchronize all access to the offending GL functions. Calls to eglCreateContext are already synchronized, and this CL synchronizes calls to glUseProgram as well. Bug: b/153513005 Change-Id: I576e564aab44c9e429f2b1407105ed72942c309e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/173742 Reviewed-by: Sami Kalliomäki Commit-Queue: Magnus Jedvert Cr-Commit-Position: refs/heads/master@{#31118} --- sdk/android/api/org/webrtc/EglRenderer.java | 4 +++- sdk/android/api/org/webrtc/GlShader.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sdk/android/api/org/webrtc/EglRenderer.java b/sdk/android/api/org/webrtc/EglRenderer.java index 9004e7c1da..47bd0cf99e 100644 --- a/sdk/android/api/org/webrtc/EglRenderer.java +++ b/sdk/android/api/org/webrtc/EglRenderer.java @@ -290,7 +290,9 @@ public class EglRenderer implements VideoSink { // Release EGL and GL resources on render thread. renderThreadHandler.postAtFrontOfQueue(() -> { // Detach current shader program. - GLES20.glUseProgram(/* program= */ 0); + synchronized (EglBase.lock) { + GLES20.glUseProgram(/* program= */ 0); + } if (drawer != null) { drawer.release(); drawer = null; diff --git a/sdk/android/api/org/webrtc/GlShader.java b/sdk/android/api/org/webrtc/GlShader.java index db5c630663..8f4cda3ba6 100644 --- a/sdk/android/api/org/webrtc/GlShader.java +++ b/sdk/android/api/org/webrtc/GlShader.java @@ -114,7 +114,9 @@ public class GlShader { if (program == -1) { throw new RuntimeException("The program has been released"); } - GLES20.glUseProgram(program); + synchronized (EglBase.lock) { + GLES20.glUseProgram(program); + } GlUtil.checkNoGLES2Error("glUseProgram"); }