Skip to content

Commit b4a69f0

Browse files
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 flutter/flutter#163235
1 parent 882c421 commit b4a69f0

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public long id() {
5252
@Override
5353
public void release() {
5454
texture.release();
55+
surface.release();
56+
surface = null;
5557
released = true;
5658
}
5759

engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import static io.flutter.Build.API_LEVELS;
88
import static org.junit.Assert.assertEquals;
9+
import static org.junit.Assert.assertFalse;
10+
import static org.junit.Assert.assertTrue;
911
import static org.mockito.Mockito.mock;
1012
import static org.robolectric.Shadows.shadowOf;
1113

@@ -67,4 +69,19 @@ public void createsSurfaceTextureOfGivenSizeAndResizesWhenRequested() {
6769
fakeJNI.detachFromNativeAndReleaseResources();
6870
producer.release();
6971
}
72+
73+
@Test
74+
public void releaseWillReleaseSurface() {
75+
final FlutterRenderer flutterRenderer = new FlutterRenderer(fakeJNI);
76+
77+
// Create a surface and set the initial size.
78+
final Handler handler = new Handler(Looper.getMainLooper());
79+
final SurfaceTextureSurfaceProducer producer =
80+
new SurfaceTextureSurfaceProducer(
81+
0, handler, fakeJNI, flutterRenderer.registerSurfaceTexture(new SurfaceTexture(0)));
82+
final Surface surface = producer.getSurface();
83+
assertTrue(surface.isValid());
84+
producer.release();
85+
assertFalse(surface.isValid());
86+
}
7087
}

0 commit comments

Comments
 (0)