From 906fc0421aa85308460586023cfe727501c9bbb5 Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Tue, 25 Jul 2017 14:10:31 +0200 Subject: [android] - hook into onGlobalLayout to start creating the surface and as a result create the map object --- .../main/java/com/mapbox/mapboxsdk/maps/MapView.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index bb8771b5dd..1f31e3b5a3 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.PointF; import android.graphics.SurfaceTexture; +import android.os.Build; import android.os.Bundle; import android.support.annotation.CallSuper; import android.support.annotation.IntDef; @@ -21,6 +22,7 @@ import android.view.SurfaceView; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ZoomButtonsController; @@ -122,6 +124,18 @@ public class MapView extends FrameLayout { // add accessibility support setContentDescription(context.getString(R.string.mapbox_mapActionDescription)); setWillNotDraw(false); + + getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + initialiseDrawingSurface(mapboxMapOptions.getTextureMode()); + } + }); } private void initialiseMap() { @@ -553,9 +567,6 @@ public class MapView extends FrameLayout { if (isInEditMode()) { return; } - if (visibility == View.VISIBLE && nativeMapView == null) { - initialiseDrawingSurface(mapboxMapOptions.getTextureMode()); - } if (mapZoomButtonController != null && nativeMapView != null) { mapZoomButtonController.setVisible(visibility == View.VISIBLE); -- cgit v1.2.1 From 27343c6a75aba9c4d04b0362fc0e50889f0e2e69 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 10:44:19 +0300 Subject: [core] fix backend scope handling on render, cleanup and lowmemory - Make renderer frontend responsible for creating a BackendScope on render - encapsulate backend scope handling on cleanup and low memory in renderer impl --- include/mbgl/renderer/renderer_backend.hpp | 4 ---- src/mbgl/renderer/renderer_impl.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/include/mbgl/renderer/renderer_backend.hpp b/include/mbgl/renderer/renderer_backend.hpp index a383329395..c12e162fd1 100644 --- a/include/mbgl/renderer/renderer_backend.hpp +++ b/include/mbgl/renderer/renderer_backend.hpp @@ -30,10 +30,6 @@ public: // Called prior to rendering to update the internally assumed OpenGL state. virtual void updateAssumedState() = 0; - virtual BackendScope::ScopeType getScopeType() const { - return BackendScope::ScopeType::Explicit; - } - protected: // Called with the name of an OpenGL extension that should be loaded. RendererBackend implementations // must call the API-specific version that obtains the function pointer for this function, diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 981c09e806..4c45ab167d 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -35,7 +35,7 @@ Renderer::Impl::Impl(RendererBackend& backend_, } Renderer::Impl::~Impl() { - BackendScope guard { backend, backend.getScopeType()}; + BackendScope guard { backend }; renderStyle.reset(); staticData.reset(); }; @@ -47,8 +47,8 @@ void Renderer::Impl::setObserver(RendererObserver* observer_) { void Renderer::Impl::render(View& view, const UpdateParameters& updateParameters) { // Don't load/render anyting in still mode until explicitly requested. if (updateParameters.mode == MapMode::Still && !updateParameters.stillImageRequest) return; - - BackendScope guard { backend, backend.getScopeType() }; + + assert(BackendScope::exists()); renderStyle->update(updateParameters); transformState = updateParameters.transformState; @@ -348,7 +348,7 @@ void Renderer::Impl::onResourceError(std::exception_ptr ptr) { } void Renderer::Impl::onLowMemory() { - BackendScope guard { backend, backend.getScopeType() }; + BackendScope guard { backend }; backend.getContext().performCleanup(); renderStyle->onLowMemory(); observer->onInvalidate(); -- cgit v1.2.1 From 66e1429460b0aad6b295773db6e6fe965831ff3c Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 10:56:00 +0300 Subject: [ios][macos] manage backendscope in renderer frontend --- platform/darwin/src/MGLRendererFrontend.h | 12 +++++++++--- platform/ios/src/MGLMapView.mm | 6 +----- platform/macos/src/MGLMapView.mm | 6 +----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/platform/darwin/src/MGLRendererFrontend.h b/platform/darwin/src/MGLRendererFrontend.h index 839d3be773..3611577f2e 100644 --- a/platform/darwin/src/MGLRendererFrontend.h +++ b/platform/darwin/src/MGLRendererFrontend.h @@ -1,4 +1,6 @@ +#include #include +#include #include #include #include @@ -11,9 +13,10 @@ class MGLRenderFrontend : public mbgl::RendererFrontend { public: - MGLRenderFrontend(std::unique_ptr renderer_, MGLMapView* nativeView_, mbgl::View* mbglView_, bool async = false) + MGLRenderFrontend(std::unique_ptr renderer_, MGLMapView* nativeView_, mbgl::RendererBackend& mbglBackend_, mbgl::View& mbglView_, bool async = false) : renderer(std::move(renderer_)) , nativeView(nativeView_) + , mbglBackend(mbglBackend_) , mbglView(mbglView_) { if (async) { @@ -46,7 +49,9 @@ public: void render() { if (!renderer || !updateParameters) return; - renderer->render(*mbglView, *updateParameters); + mbgl::BackendScope guard { mbglBackend, mbgl::BackendScope::ScopeType::Implicit }; + + renderer->render(mbglView, *updateParameters); } mbgl::Renderer* getRenderer() { @@ -61,7 +66,8 @@ public: private: std::unique_ptr renderer; __weak MGLMapView *nativeView = nullptr; - mbgl::View *mbglView = nullptr; + mbgl::RendererBackend& mbglBackend; + mbgl::View& mbglView; std::shared_ptr updateParameters; mbgl::optional asyncInvalidate; }; diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index 1800332e42..83ea4a8d8f 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -455,7 +455,7 @@ public: _mbglThreadPool = mbgl::sharedThreadPool(); auto renderer = std::make_unique(*_mbglView, scaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::GLContextMode::Unique); - _rendererFrontend = std::make_unique(std::move(renderer), self, _mbglView); + _rendererFrontend = std::make_unique(std::move(renderer), self, *_mbglView, *_mbglView); _mbglMap = new mbgl::Map(*_rendererFrontend, *_mbglView, self.size, scaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::MapMode::Continuous, mbgl::ConstrainMode::None, mbgl::ViewportMode::Default); // start paused if in IB @@ -5528,10 +5528,6 @@ public: return reinterpret_cast(symbol); } - - mbgl::BackendScope::ScopeType getScopeType() const override { - return mbgl::BackendScope::ScopeType::Implicit; - } void activate() override { diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm index 10afdc6e5f..6707f59628 100644 --- a/platform/macos/src/MGLMapView.mm +++ b/platform/macos/src/MGLMapView.mm @@ -275,7 +275,7 @@ public: _mbglThreadPool = mbgl::sharedThreadPool(); auto renderer = std::make_unique(*_mbglView, [NSScreen mainScreen].backingScaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::GLContextMode::Unique); - _rendererFrontend = std::make_unique(std::move(renderer), self, _mbglView, true); + _rendererFrontend = std::make_unique(std::move(renderer), self, *_mbglView, *_mbglView, true); _mbglMap = new mbgl::Map(*_rendererFrontend, *_mbglView, self.size, [NSScreen mainScreen].backingScaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::MapMode::Continuous, mbgl::ConstrainMode::None, mbgl::ViewportMode::Default); // Install the OpenGL layer. Interface Builder’s synchronous drawing means @@ -2878,10 +2878,6 @@ public: assumeFramebufferBinding(fbo); assumeViewport(0, 0, nativeView.framebufferSize); } - - mbgl::BackendScope::ScopeType getScopeType() const override { - return mbgl::BackendScope::ScopeType::Implicit; - } void bind() override { setFramebufferBinding(fbo); -- cgit v1.2.1 From f69997a19cf74a125c46a60e6004aa84e24c0b68 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:01:35 +0300 Subject: [default] manage backendscope in renderer frontend --- platform/default/mbgl/gl/headless_backend.cpp | 2 +- platform/default/mbgl/renderer/async_renderer_frontend.cpp | 7 +++++-- platform/default/mbgl/renderer/async_renderer_frontend.hpp | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/platform/default/mbgl/gl/headless_backend.cpp b/platform/default/mbgl/gl/headless_backend.cpp index 9076be4cbb..82660331fa 100644 --- a/platform/default/mbgl/gl/headless_backend.cpp +++ b/platform/default/mbgl/gl/headless_backend.cpp @@ -12,7 +12,7 @@ namespace mbgl { HeadlessBackend::HeadlessBackend() = default; HeadlessBackend::~HeadlessBackend() { - BackendScope guard { *this, getScopeType() }; + BackendScope guard { *this }; context.reset(); } diff --git a/platform/default/mbgl/renderer/async_renderer_frontend.cpp b/platform/default/mbgl/renderer/async_renderer_frontend.cpp index 37b4e60cf6..230d0bb820 100644 --- a/platform/default/mbgl/renderer/async_renderer_frontend.cpp +++ b/platform/default/mbgl/renderer/async_renderer_frontend.cpp @@ -1,13 +1,16 @@ #include "async_renderer_frontend.hpp" + +#include #include namespace mbgl { -AsyncRendererFrontend::AsyncRendererFrontend(std::unique_ptr renderer_, View& view_) +AsyncRendererFrontend::AsyncRendererFrontend(std::unique_ptr renderer_, RendererBackend& backend, View& view_) : renderer(std::move(renderer_)) , view(view_) - , asyncInvalidate([this] { + , asyncInvalidate([&] { if (renderer && updateParameters) { + BackendScope guard { backend }; renderer->render(view, *updateParameters); } }) { diff --git a/platform/default/mbgl/renderer/async_renderer_frontend.hpp b/platform/default/mbgl/renderer/async_renderer_frontend.hpp index 00cf3a480c..e1b2f780cd 100644 --- a/platform/default/mbgl/renderer/async_renderer_frontend.hpp +++ b/platform/default/mbgl/renderer/async_renderer_frontend.hpp @@ -10,11 +10,12 @@ namespace mbgl { class Renderer; +class RendererBackend; // Default implementation for RendererFrontend class AsyncRendererFrontend : public mbgl::RendererFrontend { public: - AsyncRendererFrontend(std::unique_ptr, View&); + AsyncRendererFrontend(std::unique_ptr, RendererBackend&, View&); ~AsyncRendererFrontend() override; void reset() override; -- cgit v1.2.1 From e75fdf10758d0a3dc419e3fa4edafafea904a96d Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:01:55 +0300 Subject: [render] manage backendscope in renderer frontend --- bin/render.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/render.cpp b/bin/render.cpp index 59461e5183..0214d3310c 100644 --- a/bin/render.cpp +++ b/bin/render.cpp @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) { OffscreenView view(backend.getContext(), { static_cast(width * pixelRatio), static_cast(height * pixelRatio) }); ThreadPool threadPool(4); - AsyncRendererFrontend rendererFrontend(std::make_unique(backend, pixelRatio, fileSource, threadPool), view); + AsyncRendererFrontend rendererFrontend(std::make_unique(backend, pixelRatio, fileSource, threadPool), backend, view); Map map(rendererFrontend, MapObserver::nullObserver(), mbgl::Size { width, height }, pixelRatio, fileSource, threadPool, MapMode::Still); if (style_path.find("://") == std::string::npos) { -- cgit v1.2.1 From 8fef2b65319e2fe896ab5276ab7be97a9ff51798 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:04:18 +0300 Subject: [android] manage backendscope in renderer frontend --- platform/android/src/android_renderer_frontend.cpp | 5 +++++ platform/android/src/android_renderer_frontend.hpp | 4 +++- platform/android/src/native_map_view.cpp | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index acb1c74557..41e44d297a 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -1,6 +1,7 @@ #include "android_renderer_frontend.hpp" #include +#include #include namespace mbgl { @@ -8,8 +9,10 @@ namespace android { AndroidRendererFrontend::AndroidRendererFrontend( std::unique_ptr renderer_, + RendererBackend& backend_, InvalidateCallback invalidate) : renderer(std::move(renderer_)) + , backend(backend_) , asyncInvalidate([=, invalidate=std::move(invalidate)]() { invalidate(); }) { @@ -38,6 +41,8 @@ void AndroidRendererFrontend::render(View& view) { assert (renderer); if (!updateParameters) return; + BackendScope guard { backend }; + renderer->render(view, *updateParameters); } diff --git a/platform/android/src/android_renderer_frontend.hpp b/platform/android/src/android_renderer_frontend.hpp index 95513a7682..59ece88f19 100644 --- a/platform/android/src/android_renderer_frontend.hpp +++ b/platform/android/src/android_renderer_frontend.hpp @@ -2,6 +2,7 @@ #pragma once #include +#include #include #include #include @@ -23,7 +24,7 @@ namespace android { class AndroidRendererFrontend : public RendererFrontend { public: using InvalidateCallback = std::function; - AndroidRendererFrontend(std::unique_ptr, InvalidateCallback); + AndroidRendererFrontend(std::unique_ptr, RendererBackend&, InvalidateCallback); ~AndroidRendererFrontend() override; void reset() override; @@ -43,6 +44,7 @@ public: private: std::unique_ptr renderer; + RendererBackend& backend; std::shared_ptr updateParameters; util::AsyncTask asyncInvalidate; }; diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 5f89217485..17f55d9827 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -78,6 +78,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, // Create a renderer frontend rendererFrontend = std::make_unique(std::move(renderer), + *this, [this] { this->invalidate(); }); // Create the core map -- cgit v1.2.1 From 9893b3d071d41373507913d59babeeb651579136 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:14:11 +0300 Subject: [glfw] manage backendscope in renderer frontend --- platform/glfw/glfw_renderer_frontend.cpp | 2 ++ platform/glfw/glfw_view.cpp | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/glfw/glfw_renderer_frontend.cpp b/platform/glfw/glfw_renderer_frontend.cpp index 99f409e338..d0fefadf14 100644 --- a/platform/glfw/glfw_renderer_frontend.cpp +++ b/platform/glfw/glfw_renderer_frontend.cpp @@ -29,6 +29,8 @@ void GLFWRendererFrontend::render() { assert(renderer); if (!updateParameters) return; + + mbgl::BackendScope guard { glfwView, mbgl::BackendScope::ScopeType::Implicit }; renderer->render(glfwView, *updateParameters); } diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 7a65dc9117..784e908878 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -503,7 +503,6 @@ void GLFWView::run() { animateRouteCallback(map); activate(); - mbgl::BackendScope guard { *this, getScopeType() }; rendererFrontend->render(); -- cgit v1.2.1 From 4dee3a0d8d527bd48d09cfb52c7b9c50cb50b602 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:16:39 +0300 Subject: [qt] manage backendscope in renderer frontend --- platform/qt/src/qmapboxgl.cpp | 4 +--- platform/qt/src/qmapboxgl_p.hpp | 3 --- platform/qt/src/qmapboxgl_renderer_frontend_p.cpp | 8 +++++++- platform/qt/src/qmapboxgl_renderer_frontend_p.hpp | 4 +++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/qmapboxgl.cpp index b79630b3df..6faffb5ffb 100644 --- a/platform/qt/src/qmapboxgl.cpp +++ b/platform/qt/src/qmapboxgl.cpp @@ -1446,9 +1446,6 @@ void QMapboxGL::render() } #endif - // The OpenGL implementation automatically enables the OpenGL context for us. - mbgl::BackendScope scope { *d_ptr, mbgl::BackendScope::ScopeType::Implicit }; - d_ptr->dirty = false; d_ptr->render(); } @@ -1505,6 +1502,7 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin frontend = std::make_unique( std::make_unique(*this, pixelRatio, *fileSourceObj, *threadPool, static_cast(settings.contextMode())), + *this, *this); connect(frontend.get(), SIGNAL(updated()), this, SLOT(invalidate())); diff --git a/platform/qt/src/qmapboxgl_p.hpp b/platform/qt/src/qmapboxgl_p.hpp index e7eb1c2c2b..0fa9f6e8e4 100644 --- a/platform/qt/src/qmapboxgl_p.hpp +++ b/platform/qt/src/qmapboxgl_p.hpp @@ -31,9 +31,6 @@ public: void updateAssumedState() final; void activate() final {} void deactivate() final {} - mbgl::BackendScope::ScopeType getScopeType() const final { - return mbgl::BackendScope::ScopeType::Implicit; - } // mbgl::MapObserver implementation. void onCameraWillChange(mbgl::MapObserver::CameraChangeMode) final; diff --git a/platform/qt/src/qmapboxgl_renderer_frontend_p.cpp b/platform/qt/src/qmapboxgl_renderer_frontend_p.cpp index fd57168df6..d7d9e9c7b7 100644 --- a/platform/qt/src/qmapboxgl_renderer_frontend_p.cpp +++ b/platform/qt/src/qmapboxgl_renderer_frontend_p.cpp @@ -3,8 +3,9 @@ #include #include -QMapboxGLRendererFrontend::QMapboxGLRendererFrontend(std::unique_ptr renderer_, mbgl::View& view_) +QMapboxGLRendererFrontend::QMapboxGLRendererFrontend(std::unique_ptr renderer_, mbgl::RendererBackend& backend_, mbgl::View& view_) : renderer(std::move(renderer_)) + , backend(backend_) , view(view_) { } @@ -23,10 +24,15 @@ void QMapboxGLRendererFrontend::update(std::shared_ptr u void QMapboxGLRendererFrontend::setObserver(mbgl::RendererObserver& observer_) { if (!renderer) return; + renderer->setObserver(&observer_); } void QMapboxGLRendererFrontend::render() { if (!renderer || !updateParameters) return; + + // The OpenGL implementation automatically enables the OpenGL context for us. + mbgl::BackendScope scope { backend, mbgl::BackendScope::ScopeType::Implicit }; + renderer->render(view, *updateParameters); } diff --git a/platform/qt/src/qmapboxgl_renderer_frontend_p.hpp b/platform/qt/src/qmapboxgl_renderer_frontend_p.hpp index 0a0546042a..d7e414e5f9 100644 --- a/platform/qt/src/qmapboxgl_renderer_frontend_p.hpp +++ b/platform/qt/src/qmapboxgl_renderer_frontend_p.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -14,7 +15,7 @@ class QMapboxGLRendererFrontend : public QObject, public mbgl::RendererFrontend Q_OBJECT public: - explicit QMapboxGLRendererFrontend(std::unique_ptr, mbgl::View&); + explicit QMapboxGLRendererFrontend(std::unique_ptr, mbgl::RendererBackend&, mbgl::View&); ~QMapboxGLRendererFrontend() override; void reset() override; @@ -30,6 +31,7 @@ signals: private: std::unique_ptr renderer; + mbgl::RendererBackend& backend; mbgl::View& view; std::shared_ptr updateParameters; }; -- cgit v1.2.1 From d2a437d0486dc262f0615b7d14e35a5c4b168742 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:25:19 +0300 Subject: [node] manage backendscope in renderer frontend --- platform/node/src/node_map.cpp | 4 ++-- platform/node/src/node_renderer_frontend.cpp | 7 +++++-- platform/node/src/node_renderer_frontend.hpp | 5 +++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 079112b4c8..0b87a86210 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -526,7 +526,7 @@ void NodeMap::cancel() { map.reset(); auto renderer = std::make_unique(backend, pixelRatio, *this, threadpool); - rendererFrontend = std::make_unique(std::move(renderer), [this] { return view.get(); }); + rendererFrontend = std::make_unique(std::move(renderer), backend, [this] { return view.get(); }); map = std::make_unique(*rendererFrontend, mapObserver, mbgl::Size{ 256, 256 }, pixelRatio, *this, threadpool, mbgl::MapMode::Still); @@ -985,7 +985,7 @@ NodeMap::NodeMap(v8::Local options) : 1.0; }()) , mapObserver(NodeMapObserver()) - , rendererFrontend(std::make_unique(std::make_unique(backend, pixelRatio, *this, threadpool), [this] { return view.get(); })) + , rendererFrontend(std::make_unique(std::make_unique(backend, pixelRatio, *this, threadpool), backend, [this] { return view.get(); })) , map(std::make_unique(*rendererFrontend, mapObserver, mbgl::Size { 256, 256 }, diff --git a/platform/node/src/node_renderer_frontend.cpp b/platform/node/src/node_renderer_frontend.cpp index ca9d0af7e6..5ebb92717b 100644 --- a/platform/node/src/node_renderer_frontend.cpp +++ b/platform/node/src/node_renderer_frontend.cpp @@ -1,13 +1,16 @@ #include "node_renderer_frontend.hpp" + #include +#include #include namespace node_mbgl { -NodeRendererFrontend::NodeRendererFrontend(std::unique_ptr renderer_, ViewAccessorFunction getView) +NodeRendererFrontend::NodeRendererFrontend(std::unique_ptr renderer_, mbgl::RendererBackend& backend_, ViewAccessorFunction getView) : renderer(std::move(renderer_)) - , asyncInvalidate([&, this, getView] { + , asyncInvalidate([&, getView] { if (renderer && updateParameters) { + mbgl::BackendScope guard { backend_ }; renderer->render(*getView(), *updateParameters); } }) { diff --git a/platform/node/src/node_renderer_frontend.hpp b/platform/node/src/node_renderer_frontend.hpp index 238c7363ae..c70291317b 100644 --- a/platform/node/src/node_renderer_frontend.hpp +++ b/platform/node/src/node_renderer_frontend.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -12,6 +11,8 @@ namespace mbgl { class Renderer; + class RendererBackend; + class View; } // namespace mbgl namespace node_mbgl { @@ -19,7 +20,7 @@ namespace node_mbgl { class NodeRendererFrontend : public mbgl::RendererFrontend { public: using ViewAccessorFunction = std::function; - NodeRendererFrontend(std::unique_ptr, ViewAccessorFunction); + NodeRendererFrontend(std::unique_ptr, mbgl::RendererBackend&, ViewAccessorFunction); ~NodeRendererFrontend(); -- cgit v1.2.1 From 565dfc91833fbac4d40ac13293225720919a0773 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 25 Jul 2017 11:25:33 +0300 Subject: [benchmark] manage backendscope in renderer frontend --- benchmark/api/query.benchmark.cpp | 2 +- benchmark/api/render.benchmark.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmark/api/query.benchmark.cpp b/benchmark/api/query.benchmark.cpp index db8e597dd3..8b96d02163 100644 --- a/benchmark/api/query.benchmark.cpp +++ b/benchmark/api/query.benchmark.cpp @@ -40,7 +40,7 @@ public: OffscreenView view{ backend.getContext(), { 1000, 1000 } }; DefaultFileSource fileSource{ "benchmark/fixtures/api/cache.db", "." }; ThreadPool threadPool{ 4 }; - AsyncRendererFrontend rendererFrontend { std::make_unique(backend, 1, fileSource, threadPool), view }; + AsyncRendererFrontend rendererFrontend { std::make_unique(backend, 1, fileSource, threadPool), backend, view }; Map map { rendererFrontend, MapObserver::nullObserver(), view.getSize(), 1, fileSource, threadPool, MapMode::Still }; ScreenBox box{{ 0, 0 }, { 1000, 1000 }}; }; diff --git a/benchmark/api/render.benchmark.cpp b/benchmark/api/render.benchmark.cpp index 28e155358b..90667d4ed4 100644 --- a/benchmark/api/render.benchmark.cpp +++ b/benchmark/api/render.benchmark.cpp @@ -47,7 +47,7 @@ static void prepare(Map& map, optional json = {}) { static void API_renderStill_reuse_map(::benchmark::State& state) { RenderBenchmark bench; - AsyncRendererFrontend frontend { std::make_unique(bench.backend, 1, bench.fileSource, bench.threadPool), bench.view }; + AsyncRendererFrontend frontend { std::make_unique(bench.backend, 1, bench.fileSource, bench.threadPool), bench.backend, bench.view }; Map map { frontend, MapObserver::nullObserver(), bench.view.getSize(), 1, bench.fileSource, bench.threadPool, MapMode::Still }; prepare(map); @@ -58,7 +58,7 @@ static void API_renderStill_reuse_map(::benchmark::State& state) { static void API_renderStill_reuse_map_switch_styles(::benchmark::State& state) { RenderBenchmark bench; - AsyncRendererFrontend frontend { std::make_unique(bench.backend, 1, bench.fileSource, bench.threadPool), bench.view }; + AsyncRendererFrontend frontend { std::make_unique(bench.backend, 1, bench.fileSource, bench.threadPool), bench.backend, bench.view }; Map map { frontend, MapObserver::nullObserver(), bench.view.getSize(), 1, bench.fileSource, bench.threadPool, MapMode::Still }; while (state.KeepRunning()) { @@ -73,7 +73,7 @@ static void API_renderStill_recreate_map(::benchmark::State& state) { RenderBenchmark bench; while (state.KeepRunning()) { - AsyncRendererFrontend frontend { std::make_unique(bench.backend, 1, bench.fileSource, bench.threadPool), bench.view }; + AsyncRendererFrontend frontend { std::make_unique(bench.backend, 1, bench.fileSource, bench.threadPool), bench.backend, bench.view }; Map map { frontend, MapObserver::nullObserver(), bench.view.getSize(), 1, bench.fileSource, bench.threadPool, MapMode::Still }; prepare(map); mbgl::benchmark::render(map, bench.view); -- cgit v1.2.1