diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2019-04-01 16:56:24 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2019-04-05 11:49:17 +0200 |
commit | 66c020034e8260e5e071481e68ab61cd264723ba (patch) | |
tree | b5263772d72175474d91ce2daa9dc037b99fab0d /platform/default | |
parent | a782a6d15b80dd83105604f3f779f6c83ba222e5 (diff) | |
download | qtlocation-mapboxgl-66c020034e8260e5e071481e68ab61cd264723ba.tar.gz |
[core] refactor RendererBackend
Diffstat (limited to 'platform/default')
4 files changed, 40 insertions, 28 deletions
diff --git a/platform/default/include/mbgl/gl/headless_backend.hpp b/platform/default/include/mbgl/gl/headless_backend.hpp index 7757037533..9135c269be 100644 --- a/platform/default/include/mbgl/gl/headless_backend.hpp +++ b/platform/default/include/mbgl/gl/headless_backend.hpp @@ -1,19 +1,22 @@ #pragma once -#include <mbgl/renderer/renderer_backend.hpp> +#include <mbgl/gfx/renderable.hpp> +#include <mbgl/gl/renderer_backend.hpp> #include <memory> #include <functional> namespace mbgl { +namespace gl { -class HeadlessBackend : public RendererBackend { +class HeadlessBackend final : public gl::RendererBackend, public gfx::Renderable { public: HeadlessBackend(Size = { 256, 256 }); ~HeadlessBackend() override; - void bind() override; - Size getFramebufferSize() const override; + gfx::Renderable& getDefaultRenderable() override; + + Size getFramebufferSize() const; void updateAssumedState() override; void setSize(Size); @@ -39,12 +42,9 @@ private: private: std::unique_ptr<Impl> impl; - Size size; float pixelRatio; bool active = false; - - class View; - std::unique_ptr<View> view; }; +} // namespace gl } // namespace mbgl diff --git a/platform/default/include/mbgl/gl/headless_frontend.hpp b/platform/default/include/mbgl/gl/headless_frontend.hpp index ca3230a809..2e9378bf8f 100644 --- a/platform/default/include/mbgl/gl/headless_frontend.hpp +++ b/platform/default/include/mbgl/gl/headless_frontend.hpp @@ -13,10 +13,13 @@ namespace mbgl { class Scheduler; class Renderer; -class RendererBackend; class Map; class TransformState; +namespace gfx { +class RendererBackend; +} // namespace gfx + class HeadlessFrontend : public RendererFrontend { public: HeadlessFrontend(float pixelRatio_, Scheduler&, const optional<std::string> programCacheDir = {}, GLContextMode mode = GLContextMode::Unique, const optional<std::string> localFontFamily = {}); @@ -31,7 +34,7 @@ public: void setSize(Size); Renderer* getRenderer(); - RendererBackend* getBackend(); + gfx::RendererBackend* getBackend(); CameraOptions getCameraOptions(); bool hasImage(const std::string&); @@ -50,7 +53,7 @@ private: Size size; float pixelRatio; - HeadlessBackend backend; + gl::HeadlessBackend backend; util::AsyncTask asyncInvalidate; std::unique_ptr<Renderer> renderer; diff --git a/platform/default/src/mbgl/gl/headless_backend.cpp b/platform/default/src/mbgl/gl/headless_backend.cpp index 4d05be1675..cbf451d80b 100644 --- a/platform/default/src/mbgl/gl/headless_backend.cpp +++ b/platform/default/src/mbgl/gl/headless_backend.cpp @@ -1,4 +1,5 @@ #include <mbgl/gl/headless_backend.hpp> +#include <mbgl/gl/renderable_resource.hpp> #include <mbgl/gl/context.hpp> #include <mbgl/gfx/backend_scope.hpp> @@ -7,27 +8,38 @@ #include <type_traits> namespace mbgl { +namespace gl { -class HeadlessBackend::View { +class HeadlessRenderableResource final : public gl::RenderableResource { public: - View(gl::Context& context, Size size_) - : color(context.createRenderbuffer<gfx::RenderbufferPixelType::RGBA>(size_)), + HeadlessRenderableResource(gl::Context& context_, Size size_) + : context(context_), + color(context.createRenderbuffer<gfx::RenderbufferPixelType::RGBA>(size_)), depthStencil(context.createRenderbuffer<gfx::RenderbufferPixelType::DepthStencil>(size_)), framebuffer(context.createFramebuffer(color, depthStencil)) { } + void bind() override { + context.bindFramebuffer = framebuffer.framebuffer; + context.scissorTest = false; + context.viewport = { 0, 0, framebuffer.size }; + } + + gl::Context& context; gfx::Renderbuffer<gfx::RenderbufferPixelType::RGBA> color; gfx::Renderbuffer<gfx::RenderbufferPixelType::DepthStencil> depthStencil; gl::Framebuffer framebuffer; }; HeadlessBackend::HeadlessBackend(Size size_) - : size(size_) { + : mbgl::gfx::Renderable(size_, nullptr) { } HeadlessBackend::~HeadlessBackend() { gfx::BackendScope guard { *this }; - view.reset(); + resource.reset(); + // Explicitly reset the context so that it is destructed and cleaned up before we destruct + // the impl object. context.reset(); } @@ -53,16 +65,11 @@ void HeadlessBackend::deactivate() { active = false; } -void HeadlessBackend::bind() { - gl::Context& context_ = getContext(); - - if (!view) { - view = std::make_unique<View>(context_, size); +gfx::Renderable& HeadlessBackend::getDefaultRenderable() { + if (!resource) { + resource = std::make_unique<HeadlessRenderableResource>(static_cast<gl::Context&>(getContext()), size); } - - context_.bindFramebuffer = view->framebuffer.framebuffer; - context_.scissorTest = false; - context_.viewport = { 0, 0, size }; + return *this; } Size HeadlessBackend::getFramebufferSize() const { @@ -75,11 +82,12 @@ void HeadlessBackend::updateAssumedState() { void HeadlessBackend::setSize(Size size_) { size = size_; - view.reset(); + resource.reset(); } PremultipliedImage HeadlessBackend::readStillImage() { - return getContext().readFramebuffer<PremultipliedImage>(size); + return static_cast<gl::Context&>(getContext()).readFramebuffer<PremultipliedImage>(size); } +} // namespace gl } // namespace mbgl diff --git a/platform/default/src/mbgl/gl/headless_frontend.cpp b/platform/default/src/mbgl/gl/headless_frontend.cpp index 3c8188c8a3..406c197904 100644 --- a/platform/default/src/mbgl/gl/headless_frontend.cpp +++ b/platform/default/src/mbgl/gl/headless_frontend.cpp @@ -1,4 +1,5 @@ #include <mbgl/gl/headless_frontend.hpp> +#include <mbgl/gfx/backend_scope.hpp> #include <mbgl/renderer/renderer.hpp> #include <mbgl/renderer/renderer_state.hpp> #include <mbgl/renderer/update_parameters.hpp> @@ -58,7 +59,7 @@ Renderer* HeadlessFrontend::getRenderer() { return renderer.get(); } -RendererBackend* HeadlessFrontend::getBackend() { +gfx::RendererBackend* HeadlessFrontend::getBackend() { return &backend; } |