From 802586ed520fc4eb978e69d7abfe5c1b9b0740af Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 9 Apr 2025 14:58:10 +0300 Subject: [PATCH] Sync surface destruction with main thread (#3368) --- .../renderer/textureview/TextureViewRenderThread.java | 8 ++++++++ .../renderer/textureview/GLTextureViewRenderThread.java | 5 +++++ .../textureview/VulkanTextureViewRenderThread.java | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java index f26b8196d..76c5a0a7d 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java @@ -84,6 +84,14 @@ abstract class TextureViewRenderThread extends Thread implements TextureView.Sur this.destroySurface = true; this.requestRender = false; lock.notifyAll(); + + while (this.hasNativeSurface) { + try { + lock.wait(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } } return true; } diff --git a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java index ecaa3b15d..a8919adc2 100644 --- a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java @@ -73,6 +73,8 @@ public class GLTextureViewRenderThread extends TextureViewRenderThread { if (destroySurface) { eglHolder.destroySurface(); destroySurface = false; + this.hasNativeSurface = false; + lock.notifyAll(); break; } @@ -89,12 +91,14 @@ public class GLTextureViewRenderThread extends TextureViewRenderThread { // Initialize EGL if needed if (eglHolder.eglContext == EGL10.EGL_NO_CONTEXT) { + this.hasNativeSurface = true; initializeEGL = true; break; } // (re-)Initialize EGL Surface if needed if (eglHolder.eglSurface == EGL10.EGL_NO_SURFACE) { + this.hasNativeSurface = true; recreateSurface = true; break; } @@ -195,6 +199,7 @@ public class GLTextureViewRenderThread extends TextureViewRenderThread { // Signal we're done synchronized (lock) { + this.hasNativeSurface = false; this.exited = true; lock.notifyAll(); } diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java index ded021d9f..a77dcebc5 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java @@ -23,6 +23,8 @@ public class VulkanTextureViewRenderThread extends TextureViewRenderThread { mapRenderer.onSurfaceDestroyed(); surface.release(); surface = null; + + hasNativeSurface = false; } // Thread implementation @@ -68,6 +70,7 @@ public class VulkanTextureViewRenderThread extends TextureViewRenderThread { if (surface == null) { surface = new Surface(surfaceTexture); + this.hasNativeSurface = true; createSurface = true; } @@ -111,6 +114,10 @@ public class VulkanTextureViewRenderThread extends TextureViewRenderThread { if (destroySurface) { mapRenderer.onSurfaceDestroyed(); destroySurface = false; + synchronized (lock) { + this.hasNativeSurface = false; + lock.notifyAll(); + } continue; }