diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-14 21:23:07 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-09-22 23:33:56 +0300 |
commit | 5d12503302dff168137d6f3b1444e4dc32ad44dd (patch) | |
tree | 98128bdddb287c30b2c1445eb88d44e9a97d57ab /platform/android/src/android_renderer_frontend.cpp | |
parent | 15a47d116a0fc15d249b37574fcd932ce88909df (diff) | |
download | qtlocation-mapboxgl-5d12503302dff168137d6f3b1444e4dc32ad44dd.tar.gz |
[android] self-contained map renderer
- Isolates the GL thread in a MapRenderer class with a native peer
Diffstat (limited to 'platform/android/src/android_renderer_frontend.cpp')
-rw-r--r-- | platform/android/src/android_renderer_frontend.cpp | 92 |
1 files changed, 12 insertions, 80 deletions
diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index 0619ba4cb5..38b1ff252b 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -54,124 +54,62 @@ private: ActorRef<RendererObserver> delegate; }; -AndroidRendererFrontend::AndroidRendererFrontend(float pixelRatio, - FileSource& fileSource, - Scheduler& scheduler, - std::string programCacheDir, - RequestRenderCallback requestRender, - RequestProcessingCallback requestProcessing) - : backend(std::make_unique<AndroidRendererBackend>()) - , glThread(std::make_unique<AndroidGLThread>( - std::move(requestProcessing), - *backend, - pixelRatio, - fileSource, - scheduler, - GLContextMode::Unique, - programCacheDir - )) - , asyncInvalidate([requestRender=std::move(requestRender)]() { - requestRender(); - }) +AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_) + : mapRenderer(mapRenderer_) , mapRunLoop(util::RunLoop::Get()) { } AndroidRendererFrontend::~AndroidRendererFrontend() = default; void AndroidRendererFrontend::reset() { - assert(glThread); - glThread.reset(); + mapRenderer.reset(); + rendererObserver.reset(); } void AndroidRendererFrontend::setObserver(RendererObserver& observer) { - assert (glThread); assert (util::RunLoop::Get()); rendererObserver = std::make_unique<ForwardingRendererObserver>(*mapRunLoop, observer); - glThread->actor().invoke(&Renderer::setObserver, rendererObserver.get()); + mapRenderer.actor().invoke(&Renderer::setObserver, rendererObserver.get()); } void AndroidRendererFrontend::update(std::shared_ptr<UpdateParameters> params) { - { - // Lock on the parameters - std::lock_guard<std::mutex> lock(updateMutex); - updateParameters = std::move(params); - } - asyncInvalidate.send(); -} - -// Called on OpenGL thread -void AndroidRendererFrontend::render() { - assert (glThread); - - std::shared_ptr<UpdateParameters> params; - { - // Lock on the parameters - std::unique_lock<std::mutex> lock(updateMutex); - if (!updateParameters) return; - - // Hold on to the update parameters during render - params = updateParameters; - } - - // Activate the backend - BackendScope backendGuard { *backend }; - - // Ensure that the "current" scheduler on the render thread is - // actually the scheduler from the orchestration thread - Scheduler::SetCurrent(glThread.get()); - - if (framebufferSizeChanged) { - backend->updateViewPort(); - framebufferSizeChanged = false; - } - - glThread->renderer->render(*params); -} - -void AndroidRendererFrontend::process() { - // Process the gl thread mailbox - glThread->process(); + mapRenderer.update(std::move(params)); + mapRenderer.requestRender(); } void AndroidRendererFrontend::onLowMemory() { - assert (glThread); - glThread->actor().invoke(&Renderer::onLowMemory); + mapRenderer.actor().invoke(&Renderer::onLowMemory); } std::vector<Feature> AndroidRendererFrontend::querySourceFeatures(const std::string& sourceID, const SourceQueryOptions& options) const { - assert (glThread); // Waits for the result from the orchestration thread and returns - return glThread->actor().ask(&Renderer::querySourceFeatures, sourceID, options).get(); + return mapRenderer.actor().ask(&Renderer::querySourceFeatures, sourceID, options).get(); } std::vector<Feature> AndroidRendererFrontend::queryRenderedFeatures(const ScreenBox& box, const RenderedQueryOptions& options) const { - assert (glThread); // Select the right overloaded method std::vector<Feature> (Renderer::*fn)(const ScreenBox&, const RenderedQueryOptions&) const = &Renderer::queryRenderedFeatures; // Waits for the result from the orchestration thread and returns - return glThread->actor().ask(fn, box, options).get(); + return mapRenderer.actor().ask(fn, box, options).get(); } std::vector<Feature> AndroidRendererFrontend::queryRenderedFeatures(const ScreenCoordinate& point, const RenderedQueryOptions& options) const { - assert (glThread); // Select the right overloaded method std::vector<Feature> (Renderer::*fn)(const ScreenCoordinate&, const RenderedQueryOptions&) const = &Renderer::queryRenderedFeatures; // Waits for the result from the orchestration thread and returns - return glThread->actor().ask(fn, point, options).get(); + return mapRenderer.actor().ask(fn, point, options).get(); } AnnotationIDs AndroidRendererFrontend::queryPointAnnotations(const ScreenBox& box) const { - assert (glThread); - // Waits for the result from the orchestration thread and returns - return glThread->actor().ask(&Renderer::queryPointAnnotations, box).get(); + return mapRenderer.actor().ask(&Renderer::queryPointAnnotations, box).get(); } void AndroidRendererFrontend::requestSnapshot(SnapshotCallback callback_) { @@ -182,12 +120,6 @@ void AndroidRendererFrontend::requestSnapshot(SnapshotCallback callback_) { }); } -void AndroidRendererFrontend::resizeFramebuffer(int width, int height) { - backend->resizeFramebuffer(width, height); - framebufferSizeChanged = true; - asyncInvalidate.send(); -} - } // namespace android } // namespace mbgl |