diff --git a/engine/src/flutter/shell/platform/android/android_external_texture_gl.cc b/engine/src/flutter/shell/platform/android/android_external_texture_gl.cc index ead73ccddef..0d21841338a 100644 --- a/engine/src/flutter/shell/platform/android/android_external_texture_gl.cc +++ b/engine/src/flutter/shell/platform/android/android_external_texture_gl.cc @@ -16,7 +16,11 @@ AndroidExternalTextureGL::AndroidExternalTextureGL( const fml::jni::JavaObjectWeakGlobalRef& surfaceTexture) : Texture(id), surface_texture_(surfaceTexture), transform(SkMatrix::I()) {} -AndroidExternalTextureGL::~AndroidExternalTextureGL() = default; +AndroidExternalTextureGL::~AndroidExternalTextureGL() { + if (state_ == AttachmentState::attached) { + glDeleteTextures(1, &texture_name_); + } +} void AndroidExternalTextureGL::OnGrContextCreated() { state_ = AttachmentState::uninitialized; diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index 6048cd4ab59..130f04d6e45 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -134,8 +134,8 @@ public class FlutterRenderer implements TextureRegistry { if (released) { return; } - unregisterTexture(id); surfaceTexture.release(); + unregisterTexture(id); released = true; } } diff --git a/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java b/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java index 14c4c42cefb..6fcdc0a3850 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java @@ -1128,11 +1128,16 @@ public class FlutterView extends SurfaceView return; } released = true; - mNativeView.getFlutterJNI().unregisterTexture(id); + + // The ordering of the next 3 calls is important: + // First we remove the frame listener, then we release the SurfaceTexture, and only after we unregister + // the texture which actually deletes the GL texture. + // Otherwise onFrameAvailableListener might be called after mNativeView==null // (https://github.com/flutter/flutter/issues/20951). See also the check in onFrameAvailable. surfaceTexture.setOnFrameAvailableListener(null); surfaceTexture.release(); + mNativeView.getFlutterJNI().unregisterTexture(id); } } }