Add asynchronous deletion option for Android renderer backend (#4287)
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -196,7 +196,11 @@ void MapRenderer::requestSnapshot(SnapshotCallback callback) {
|
||||
|
||||
void MapRenderer::resetRenderer() {
|
||||
renderer.reset();
|
||||
backend.reset();
|
||||
|
||||
if (!asyncRendererCleanup) {
|
||||
backend.reset();
|
||||
}
|
||||
|
||||
window.reset();
|
||||
swapBehaviorFlush = false;
|
||||
}
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user