From 5c022103053cb3e127685f2177a456cffc68aecc Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Thu, 27 Apr 2023 19:48:18 +0100 Subject: [PATCH] Effect: glFlush instead of glFinish on tex output This is much faster (~2-3x) than glFlush. While there's a risk that GL commands queued to the GL server may not be complete by the time non-GL commands access the texture, this should be unlikely as we only access the texture from GL. PiperOrigin-RevId: 527641520 --- .../androidx/media3/effect/FinalShaderProgramWrapper.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/effect/src/main/java/androidx/media3/effect/FinalShaderProgramWrapper.java b/libraries/effect/src/main/java/androidx/media3/effect/FinalShaderProgramWrapper.java index 4fffc8a3fb..71070c3806 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/FinalShaderProgramWrapper.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/FinalShaderProgramWrapper.java @@ -360,7 +360,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; outputTexture.fboId, outputTexture.width, outputTexture.height); GlUtil.clearOutputFrame(); checkNotNull(defaultShaderProgram).drawFrame(inputTexture.texId, presentationTimeUs); - GLES20.glFinish(); + + // glFlush is used here instead of glFinish due to the performance regression that blocking this + // thread would do when calling glFinish. As glFlush is non-blocking, it's possible that non-GL + // access to the output texture may read stale data (ex. from the prior frame). If we see issues + // (ex. flakiness) from glFlush, consider requiring apps reading the texture to call glFinish, + // or reconsider using glFinish here. + GLES20.glFlush(); checkNotNull(textureOutputListener).onTextureRendered(outputTexture, presentationTimeUs); }