diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2017-07-21 16:36:31 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2017-07-26 09:50:38 -0700 |
commit | 32bd1d54fa777035920b58e653905e4592ef187c (patch) | |
tree | 3f6fa84d6c9369bdd312ba630538a0c7504fce3a /platform/default | |
parent | 11933f6ab81248a884db3b1f69be714a60b6a86c (diff) | |
download | qtlocation-mapboxgl-32bd1d54fa777035920b58e653905e4592ef187c.tar.gz |
[node, tests] Consolidate headless rendering logic in HeadlessFrontend
Diffstat (limited to 'platform/default')
-rw-r--r-- | platform/default/mbgl/gl/headless_backend.cpp | 39 | ||||
-rw-r--r-- | platform/default/mbgl/gl/headless_backend.hpp | 14 | ||||
-rw-r--r-- | platform/default/mbgl/gl/headless_frontend.cpp | 86 | ||||
-rw-r--r-- | platform/default/mbgl/gl/headless_frontend.hpp | 47 | ||||
-rw-r--r-- | platform/default/mbgl/gl/offscreen_view.cpp | 65 | ||||
-rw-r--r-- | platform/default/mbgl/gl/offscreen_view.hpp | 28 | ||||
-rw-r--r-- | platform/default/mbgl/renderer/async_renderer_frontend.cpp | 41 | ||||
-rw-r--r-- | platform/default/mbgl/renderer/async_renderer_frontend.hpp | 36 |
8 files changed, 183 insertions, 173 deletions
diff --git a/platform/default/mbgl/gl/headless_backend.cpp b/platform/default/mbgl/gl/headless_backend.cpp index 82660331fa..a854fe9731 100644 --- a/platform/default/mbgl/gl/headless_backend.cpp +++ b/platform/default/mbgl/gl/headless_backend.cpp @@ -9,10 +9,26 @@ namespace mbgl { -HeadlessBackend::HeadlessBackend() = default; +class HeadlessBackend::View { +public: + View(gl::Context& context, Size size) + : color(context.createRenderbuffer<gl::RenderbufferType::RGBA>(size)), + depthStencil(context.createRenderbuffer<gl::RenderbufferType::DepthStencil>(size)), + framebuffer(context.createFramebuffer(color, depthStencil)) { + } + + gl::Renderbuffer<gl::RenderbufferType::RGBA> color; + gl::Renderbuffer<gl::RenderbufferType::DepthStencil> depthStencil; + gl::Framebuffer framebuffer; +}; + +HeadlessBackend::HeadlessBackend(Size size_) + : size(size_) { +} HeadlessBackend::~HeadlessBackend() { BackendScope guard { *this }; + view.reset(); context.reset(); } @@ -36,8 +52,29 @@ void HeadlessBackend::deactivate() { active = false; } +void HeadlessBackend::bind() { + gl::Context& context_ = getContext(); + + if (!view) { + view = std::make_unique<View>(context_, size); + } + + context_.bindFramebuffer = view->framebuffer.framebuffer; + context_.scissorTest = false; + context_.viewport = { 0, 0, size }; +} + void HeadlessBackend::updateAssumedState() { // no-op } +void HeadlessBackend::setSize(Size size_) { + size = size_; + view.reset(); +} + +PremultipliedImage HeadlessBackend::readStillImage() { + return getContext().readFramebuffer<PremultipliedImage>(size); +} + } // namespace mbgl diff --git a/platform/default/mbgl/gl/headless_backend.hpp b/platform/default/mbgl/gl/headless_backend.hpp index 5f39eb9f00..d845e9930c 100644 --- a/platform/default/mbgl/gl/headless_backend.hpp +++ b/platform/default/mbgl/gl/headless_backend.hpp @@ -1,5 +1,6 @@ #pragma once +#include <mbgl/map/view.hpp> #include <mbgl/renderer/renderer_backend.hpp> #include <memory> @@ -9,13 +10,17 @@ namespace mbgl { class HeadlessDisplay; -class HeadlessBackend : public RendererBackend { +class HeadlessBackend : public View, public RendererBackend { public: - HeadlessBackend(); + HeadlessBackend(Size = { 256, 256 }); ~HeadlessBackend() override; + void bind() override; void updateAssumedState() override; + void setSize(Size); + PremultipliedImage readStillImage(); + struct Impl { virtual ~Impl() = default; virtual void activateContext() = 0; @@ -37,7 +42,12 @@ private: std::shared_ptr<HeadlessDisplay> display; std::unique_ptr<Impl> impl; + Size size; + float pixelRatio; bool active = false; + + class View; + std::unique_ptr<View> view; }; } // namespace mbgl diff --git a/platform/default/mbgl/gl/headless_frontend.cpp b/platform/default/mbgl/gl/headless_frontend.cpp new file mode 100644 index 0000000000..3f34d8eeba --- /dev/null +++ b/platform/default/mbgl/gl/headless_frontend.cpp @@ -0,0 +1,86 @@ +#include <mbgl/gl/headless_frontend.hpp> +#include <mbgl/renderer/renderer.hpp> +#include <mbgl/map/map.hpp> +#include <mbgl/util/run_loop.hpp> + +namespace mbgl { + +HeadlessFrontend::HeadlessFrontend(float pixelRatio_, FileSource& fileSource, Scheduler& scheduler) + : HeadlessFrontend({ 256, 256 }, pixelRatio_, fileSource, scheduler) { +} + +HeadlessFrontend::HeadlessFrontend(Size size_, float pixelRatio_, FileSource& fileSource, Scheduler& scheduler) + : size(size_), + pixelRatio(pixelRatio_), + backend({ static_cast<uint32_t>(size.width * pixelRatio), + static_cast<uint32_t>(size.height * pixelRatio) }), + asyncInvalidate([this] { + if (renderer && updateParameters) { + mbgl::BackendScope guard { backend }; + renderer->render(backend, *updateParameters); + } + }), + renderer(std::make_unique<Renderer>(backend, pixelRatio, fileSource, scheduler)) { +} + +HeadlessFrontend::~HeadlessFrontend() = default; + +void HeadlessFrontend::reset() { + assert(renderer); + renderer.reset(); +} + +void HeadlessFrontend::update(std::shared_ptr<UpdateParameters> updateParameters_) { + updateParameters = updateParameters_; + asyncInvalidate.send(); +} + +void HeadlessFrontend::setObserver(RendererObserver& observer_) { + assert(renderer); + renderer->setObserver(&observer_); +} + +Size HeadlessFrontend::getSize() const { + return size; +} + +Renderer* HeadlessFrontend::getRenderer() { + assert(renderer); + return renderer.get(); +} + +RendererBackend* HeadlessFrontend::getBackend() { + return &backend; +} + +void HeadlessFrontend::setSize(Size size_) { + if (size != size_) { + size = size_; + backend.setSize({ static_cast<uint32_t>(size_.width * pixelRatio), + static_cast<uint32_t>(size_.height * pixelRatio) }); + } +} + +PremultipliedImage HeadlessFrontend::readStillImage() { + return backend.readStillImage(); +} + +PremultipliedImage HeadlessFrontend::render(Map& map) { + PremultipliedImage result; + + map.renderStill([&](std::exception_ptr error) { + if (error) { + std::rethrow_exception(error); + } else { + result = backend.readStillImage(); + } + }); + + while (!result.valid()) { + util::RunLoop::Get()->runOnce(); + } + + return result; +} + +} // namespace mbgl diff --git a/platform/default/mbgl/gl/headless_frontend.hpp b/platform/default/mbgl/gl/headless_frontend.hpp new file mode 100644 index 0000000000..18d0d2527b --- /dev/null +++ b/platform/default/mbgl/gl/headless_frontend.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include <mbgl/renderer/renderer_frontend.hpp> +#include <mbgl/gl/headless_backend.hpp> +#include <mbgl/util/async_task.hpp> + +#include <memory> + +namespace mbgl { + +class FileSource; +class Scheduler; +class Renderer; +class RendererBackend; +class Map; + +class HeadlessFrontend : public RendererFrontend { +public: + HeadlessFrontend(float pixelRatio_, FileSource&, Scheduler&); + HeadlessFrontend(Size, float pixelRatio_, FileSource&, Scheduler&); + ~HeadlessFrontend() override; + + void reset() override; + void update(std::shared_ptr<UpdateParameters>) override; + void setObserver(RendererObserver&) override; + + Size getSize() const; + void setSize(Size); + + Renderer* getRenderer(); + RendererBackend* getBackend(); + + PremultipliedImage readStillImage(); + PremultipliedImage render(Map&); + +private: + Size size; + float pixelRatio; + + HeadlessBackend backend; + util::AsyncTask asyncInvalidate; + + std::unique_ptr<Renderer> renderer; + std::shared_ptr<UpdateParameters> updateParameters; +}; + +} // namespace mbgl diff --git a/platform/default/mbgl/gl/offscreen_view.cpp b/platform/default/mbgl/gl/offscreen_view.cpp deleted file mode 100644 index e7cf7cffe5..0000000000 --- a/platform/default/mbgl/gl/offscreen_view.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include <mbgl/gl/offscreen_view.hpp> -#include <mbgl/gl/context.hpp> -#include <mbgl/gl/framebuffer.hpp> -#include <mbgl/gl/renderbuffer.hpp> -#include <mbgl/util/optional.hpp> - -#include <cstring> -#include <cassert> - -namespace mbgl { - -class OffscreenView::Impl { -public: - Impl(gl::Context& context_, const Size size_) : context(context_), size(std::move(size_)) { - assert(!size.isEmpty()); - } - - void bind() { - if (!framebuffer) { - color = context.createRenderbuffer<gl::RenderbufferType::RGBA>(size); - depthStencil = context.createRenderbuffer<gl::RenderbufferType::DepthStencil>(size); - framebuffer = context.createFramebuffer(*color, *depthStencil); - } else { - context.bindFramebuffer = framebuffer->framebuffer; - } - - context.scissorTest = false; - context.viewport = { 0, 0, size }; - } - - PremultipliedImage readStillImage() { - return context.readFramebuffer<PremultipliedImage>(size); - } - - const Size& getSize() const { - return size; - } - -private: - gl::Context& context; - const Size size; - optional<gl::Framebuffer> framebuffer; - optional<gl::Renderbuffer<gl::RenderbufferType::RGBA>> color; - optional<gl::Renderbuffer<gl::RenderbufferType::DepthStencil>> depthStencil; -}; - -OffscreenView::OffscreenView(gl::Context& context, const Size size) - : impl(std::make_unique<Impl>(context, std::move(size))) { -} - -OffscreenView::~OffscreenView() = default; - -void OffscreenView::bind() { - impl->bind(); -} - -PremultipliedImage OffscreenView::readStillImage() { - return impl->readStillImage(); -} - -const Size& OffscreenView::getSize() const { - return impl->getSize(); -} - -} // namespace mbgl diff --git a/platform/default/mbgl/gl/offscreen_view.hpp b/platform/default/mbgl/gl/offscreen_view.hpp deleted file mode 100644 index eb888272e5..0000000000 --- a/platform/default/mbgl/gl/offscreen_view.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include <mbgl/map/view.hpp> -#include <mbgl/util/image.hpp> - -namespace mbgl { - -namespace gl { -class Context; -} // namespace gl - -class OffscreenView : public View { -public: - OffscreenView(gl::Context&, Size size = { 256, 256 }); - ~OffscreenView() override; - - void bind() override; - - PremultipliedImage readStillImage(); - - const Size& getSize() const; - -private: - class Impl; - const std::unique_ptr<Impl> impl; -}; - -} // namespace mbgl diff --git a/platform/default/mbgl/renderer/async_renderer_frontend.cpp b/platform/default/mbgl/renderer/async_renderer_frontend.cpp deleted file mode 100644 index 230d0bb820..0000000000 --- a/platform/default/mbgl/renderer/async_renderer_frontend.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "async_renderer_frontend.hpp" - -#include <mbgl/renderer/backend_scope.hpp> -#include <mbgl/renderer/renderer.hpp> - -namespace mbgl { - -AsyncRendererFrontend::AsyncRendererFrontend(std::unique_ptr<Renderer> renderer_, RendererBackend& backend, View& view_) - : renderer(std::move(renderer_)) - , view(view_) - , asyncInvalidate([&] { - if (renderer && updateParameters) { - BackendScope guard { backend }; - renderer->render(view, *updateParameters); - } - }) { -} - -AsyncRendererFrontend::~AsyncRendererFrontend() = default; - -void AsyncRendererFrontend::reset() { - assert(renderer); - renderer.reset(); -} - -void AsyncRendererFrontend::update(std::shared_ptr<UpdateParameters> updateParameters_) { - updateParameters = updateParameters_; - asyncInvalidate.send(); -} - -void AsyncRendererFrontend::setObserver(RendererObserver& observer_) { - assert(renderer); - renderer->setObserver(&observer_); -} - -Renderer* AsyncRendererFrontend::getRenderer() { - assert(renderer); - return renderer.get(); -} - -} // namespace mbgl diff --git a/platform/default/mbgl/renderer/async_renderer_frontend.hpp b/platform/default/mbgl/renderer/async_renderer_frontend.hpp deleted file mode 100644 index e1b2f780cd..0000000000 --- a/platform/default/mbgl/renderer/async_renderer_frontend.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include <mbgl/map/view.hpp> -#include <mbgl/renderer/renderer_frontend.hpp> -#include <mbgl/util/async_task.hpp> - -#include <memory> -#include <vector> - -namespace mbgl { - -class Renderer; -class RendererBackend; - -// Default implementation for RendererFrontend -class AsyncRendererFrontend : public mbgl::RendererFrontend { -public: - AsyncRendererFrontend(std::unique_ptr<Renderer>, RendererBackend&, View&); - ~AsyncRendererFrontend() override; - - void reset() override; - - void update(std::shared_ptr<UpdateParameters> updateParameters_) override; - - void setObserver(RendererObserver& observer_) override; - - Renderer* getRenderer(); - -private: - std::unique_ptr<Renderer> renderer; - View& view; - std::shared_ptr<UpdateParameters> updateParameters; - util::AsyncTask asyncInvalidate; -}; - -} // namespace mbgl |