From 43837843ff1b53af1b7745870c8493f984a06be9 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Tue, 19 Mar 2019 15:55:06 +0200 Subject: [core] Expose a way of flushing the graphics pipeline Useful for apps before going to background that are restricted by the OS of performing any operation. --- include/mbgl/renderer/renderer.hpp | 2 ++ src/mbgl/gl/context.cpp | 4 ++++ src/mbgl/gl/context.hpp | 5 +++++ src/mbgl/renderer/renderer.cpp | 4 ++++ src/mbgl/renderer/renderer_impl.cpp | 6 ++++++ src/mbgl/renderer/renderer_impl.hpp | 2 ++ 6 files changed, 23 insertions(+) diff --git a/include/mbgl/renderer/renderer.hpp b/include/mbgl/renderer/renderer.hpp index 1d92f9c0cb..0bed4cdaa8 100644 --- a/include/mbgl/renderer/renderer.hpp +++ b/include/mbgl/renderer/renderer.hpp @@ -34,6 +34,8 @@ public: void render(const UpdateParameters&); + void flush(); + // Feature queries std::vector queryRenderedFeatures(const ScreenLineString&, const RenderedQueryOptions& options = {}) const; std::vector queryRenderedFeatures(const ScreenCoordinate& point, const RenderedQueryOptions& options = {}) const; diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 5193381251..c5b9422351 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -775,5 +775,9 @@ void Context::performCleanup() { } } +void Context::flush() { + MBGL_CHECK_ERROR(glFinish()); +} + } // namespace gl } // namespace mbgl diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index fe09390cc6..d40f6e0bca 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -116,6 +116,11 @@ public: // Only call this while the OpenGL context is exclusive to this thread. void reset(); + // Flush pending graphics commands. Will block until the pipeline + // is empty. Should be used only with a very good reason because + // it will have a performance impact. + void flush(); + bool empty() const { return pooledTextures.empty() && abandonedPrograms.empty() diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index fbd9049207..4da7b78374 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -34,6 +34,10 @@ void Renderer::render(const UpdateParameters& updateParameters) { impl->render(updateParameters); } +void Renderer::flush() { + impl->flush(); +} + std::vector Renderer::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const { return impl->queryRenderedFeatures(geometry, options); } diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 471536cf40..987e241c4a 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -614,6 +614,12 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { parameters.context.performCleanup(); } +void Renderer::Impl::flush() { + assert(BackendScope::exists()); + + backend.getContext().flush(); +} + std::vector Renderer::Impl::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const { std::vector layers; if (options.layerIDs) { diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index 05bf2e9b2b..a036bfc7ff 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -48,6 +48,8 @@ public: void render(const UpdateParameters&); + void flush(); + std::vector queryRenderedFeatures(const ScreenLineString&, const RenderedQueryOptions&) const; std::vector querySourceFeatures(const std::string& sourceID, const SourceQueryOptions&) const; std::vector queryShapeAnnotations(const ScreenLineString&) const; -- cgit v1.2.1