From 729066fbd6481ae2944264e26f246926cb813c83 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Mon, 6 Mar 2023 14:10:15 +0000 Subject: [PATCH] GL: Delete frame buffers after use. Before, we used to never call glDeleteFramebuffers, which could in theory lead to leaks in the number of frame buffers available and make releasing the GL context more expensive. PiperOrigin-RevId: 514387847 --- .../src/main/java/androidx/media3/common/util/GlUtil.java | 8 ++++++++ .../androidx/media3/effect/FrameCacheGlShaderProgram.java | 1 + .../media3/effect/SingleFrameGlShaderProgram.java | 2 ++ 3 files changed, 11 insertions(+) diff --git a/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java index 38cf24299b..ac349145e2 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java @@ -645,6 +645,14 @@ public final class GlUtil { return fboId[0]; } + /** Deletes a framebuffer. */ + public static void deleteFbo(int fboId) throws GlException { + int[] fboIdArray = new int[1]; + fboIdArray[0] = fboId; + GLES20.glDeleteFramebuffers(/* n= */ 1, fboIdArray, /* offset= */ 0); + checkGlError(); + } + /** * Throws a {@link GlException} with the given message if {@code expression} evaluates to {@code * false}. diff --git a/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java index 781bbaa9d0..1e1fd5d55e 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java @@ -205,6 +205,7 @@ import java.util.concurrent.Executor; while (allTextures.hasNext()) { TextureInfo textureInfo = allTextures.next(); GlUtil.deleteTexture(textureInfo.texId); + GlUtil.deleteFbo(textureInfo.fboId); } freeOutputTextures.clear(); inUseOutputTextures.clear(); diff --git a/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java index 46ec6506dd..f4b2e86d73 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java @@ -156,6 +156,7 @@ public abstract class SingleFrameGlShaderProgram implements GlShaderProgram { || outputSize.getHeight() != outputTexture.height) { if (outputTexture != null) { GlUtil.deleteTexture(outputTexture.texId); + GlUtil.deleteFbo(outputTexture.fboId); } int outputTexId = GlUtil.createTexture(outputSize.getWidth(), outputSize.getHeight(), useHdr); int outputFboId = GlUtil.createFboForTexture(outputTexId); @@ -189,6 +190,7 @@ public abstract class SingleFrameGlShaderProgram implements GlShaderProgram { if (outputTexture != null) { try { GlUtil.deleteTexture(outputTexture.texId); + GlUtil.deleteFbo(outputTexture.fboId); } catch (GlUtil.GlException e) { throw new VideoFrameProcessingException(e); }