Add asynchronous deletion option for Android renderer backend (#4287)

This commit is contained in:
Adrian Cojocaru
2026-05-13 17:07:13 +03:00
committed by GitHub
parent 6b9b342bf3
commit bccfcddfcf
9 changed files with 68 additions and 8 deletions

View File

@@ -37,13 +37,7 @@ AndroidGLRendererBackend::AndroidGLRendererBackend()
: gl::RendererBackend(gfx::ContextMode::Unique),
mbgl::gfx::Renderable({64, 64}, std::make_unique<AndroidGLRenderableResource>(*this)) {}
AndroidGLRendererBackend::~AndroidGLRendererBackend() {
#ifndef NDEBUG
if (context && static_cast<gl::Context&>(*context).getCleanupOnDestruction()) {
assert(eglGetCurrentContext() != EGL_NO_CONTEXT);
}
#endif
}
AndroidGLRendererBackend::~AndroidGLRendererBackend() = default;
gl::ProcAddress AndroidGLRendererBackend::getExtensionFunctionPointer(const char* name) {
assert(gfx::BackendScope::exists());

View File

@@ -196,7 +196,11 @@ void MapRenderer::requestSnapshot(SnapshotCallback callback) {
void MapRenderer::resetRenderer() {
renderer.reset();
backend.reset();
if (!asyncRendererCleanup) {
backend.reset();
}
window.reset();
swapBehaviorFlush = false;
}

View File

@@ -92,6 +92,8 @@ public:
AndroidRendererBackend& getRendererBackend() const { return *backend; }
const TaggedScheduler& getThreadPool() const { return threadPool; }
void SetAsyncRendererCleanup(bool value) { asyncRendererCleanup = value; }
protected:
// Called from the GL Thread //
@@ -156,6 +158,7 @@ private:
bool framebufferSizeChanged = false;
bool swapBehaviorFlush = false;
bool asyncRendererCleanup = false;
mapbox::base::WeakPtrFactory<Scheduler> weakFactory{this};
// Do not add members here, see `WeakPtrFactory`

View File

@@ -41,5 +41,11 @@ bool NativeMapOptions::crossSourceCollisions(jni::JNIEnv &env, const jni::Object
return obj.Get(env, crossSourceCollisionsField);
}
bool NativeMapOptions::asyncRendererCleanup(jni::JNIEnv &env, const jni::Object<NativeMapOptions> &obj) {
auto &javaClass = jni::Class<NativeMapOptions>::Singleton(env);
auto asyncRendererCleanupField = javaClass.GetField<jni::jboolean>(env, "asyncRendererCleanup");
return obj.Get(env, asyncRendererCleanupField);
}
} // namespace android
} // namespace mbgl

View File

@@ -19,6 +19,7 @@ public:
static util::ActionJournalOptions getActionJournalOptions(jni::JNIEnv&, const jni::Object<NativeMapOptions>&);
static float pixelRatio(jni::JNIEnv&, const jni::Object<NativeMapOptions>&);
static bool crossSourceCollisions(jni::JNIEnv&, const jni::Object<NativeMapOptions>&);
static bool asyncRendererCleanup(jni::JNIEnv&, const jni::Object<NativeMapOptions>&);
};
} // namespace android

View File

@@ -74,6 +74,8 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env,
return;
}
mapRenderer.SetAsyncRendererCleanup(NativeMapOptions::asyncRendererCleanup(_env, jNativeMapOptions));
// Create a renderer frontend
rendererFrontend = AndroidRendererFrontend::create(_env, jMapRenderer);