From 3cef33215c6c6191e27e12a02d2975ee8204d894 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 25 Aug 2025 22:24:06 +0300 Subject: [PATCH] Fix Android backend cleanup (#3681) --- .../src/cpp/android_gl_renderer_backend.cpp | 8 +++++++- .../android/MapLibreAndroid/src/cpp/map_renderer.cpp | 5 +++++ .../renderer/surfaceview/MapLibreGLSurfaceView.java | 11 ++++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp index 49aadd27e..8bed72649 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp @@ -37,7 +37,13 @@ AndroidGLRendererBackend::AndroidGLRendererBackend() : gl::RendererBackend(gfx::ContextMode::Unique), mbgl::gfx::Renderable({64, 64}, std::make_unique(*this)) {} -AndroidGLRendererBackend::~AndroidGLRendererBackend() = default; +AndroidGLRendererBackend::~AndroidGLRendererBackend() { +#ifndef NDEBUG + if (context && static_cast(*context).getCleanupOnDestruction()) { + assert(eglGetCurrentContext() != EGL_NO_CONTEXT); + } +#endif +} gl::ProcAddress AndroidGLRendererBackend::getExtensionFunctionPointer(const char* name) { assert(gfx::BackendScope::exists()); diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index e17874ba1..8a2cfbd31 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -196,6 +196,11 @@ void MapRenderer::requestSnapshot(SnapshotCallback callback) { void MapRenderer::resetRenderer() { renderer.reset(); +#if MLN_RENDER_BACKEND_OPENGL + // GL requires the context managed by the java surface for cleanup + // Vulkan resources can be released on any thread (finalizer in this case) + backend.reset(); +#endif swapBehaviorFlush = false; } diff --git a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java index e446e1351..301e3197e 100644 --- a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java +++ b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java @@ -272,9 +272,7 @@ public class MapLibreGLSurfaceView extends MapLibreSurfaceView { private void destroySurfaceImp() { if (mEglSurface != null && mEglSurface != EGL10.EGL_NO_SURFACE) { - mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, - EGL10.EGL_NO_SURFACE, - EGL10.EGL_NO_CONTEXT); + mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, mEglContext); MapLibreGLSurfaceView view = mGLSurfaceViewWeakRef.get(); if (view != null) { view.eglWindowSurfaceFactory.destroySurface(mEgl, mEglDisplay, mEglSurface); @@ -284,6 +282,13 @@ public class MapLibreGLSurfaceView extends MapLibreSurfaceView { } public void finish() { + if (mEglDisplay != null) { + mEgl.eglMakeCurrent(mEglDisplay, + EGL10.EGL_NO_SURFACE, + EGL10.EGL_NO_SURFACE, + EGL10.EGL_NO_CONTEXT); + } + if (mEglContext != null) { MapLibreGLSurfaceView view = mGLSurfaceViewWeakRef.get(); if (view != null) {