From b4a69f00f93f33240d646a6db053481d4afedc38 Mon Sep 17 00:00:00 2001 From: Jason Simmons <jason-simmons@users.noreply.github.com> Date: Tue, 25 Mar 2025 21:10:58 +0000 Subject: [PATCH] Release the SurfaceTextureSurfaceProducer's surface in the release method (#165835) The TextureRegistry.SurfaceProducer interface specifies that callers of getSurface should not cache the returned surface. Therefore, it should be safe for SurfaceTextureSurfaceProducer to release this surface when releasing the texture. Fixes https://github.com/flutter/flutter/issues/163235 --- .../renderer/SurfaceTextureSurfaceProducer.java | 2 ++ .../SurfaceTextureSurfaceProducerTest.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java index 6f522a65c37..ed18f804768 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java @@ -52,6 +52,8 @@ final class SurfaceTextureSurfaceProducer @Override public void release() { texture.release(); + surface.release(); + surface = null; released = true; } diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java index c4491c50921..e451ca51b49 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java @@ -6,6 +6,8 @@ package io.flutter.embedding.engine.renderer; import static io.flutter.Build.API_LEVELS; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.robolectric.Shadows.shadowOf; @@ -67,4 +69,19 @@ public final class SurfaceTextureSurfaceProducerTest { fakeJNI.detachFromNativeAndReleaseResources(); producer.release(); } + + @Test + public void releaseWillReleaseSurface() { + final FlutterRenderer flutterRenderer = new FlutterRenderer(fakeJNI); + + // Create a surface and set the initial size. + final Handler handler = new Handler(Looper.getMainLooper()); + final SurfaceTextureSurfaceProducer producer = + new SurfaceTextureSurfaceProducer( + 0, handler, fakeJNI, flutterRenderer.registerSurfaceTexture(new SurfaceTexture(0))); + final Surface surface = producer.getSurface(); + assertTrue(surface.isValid()); + producer.release(); + assertFalse(surface.isValid()); + } } -- GitLab