diff options
Diffstat (limited to 'platform/default/mbgl/gl/headless_backend.cpp')
-rw-r--r-- | platform/default/mbgl/gl/headless_backend.cpp | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/platform/default/mbgl/gl/headless_backend.cpp b/platform/default/mbgl/gl/headless_backend.cpp index df3a517823..ba08aecab7 100644 --- a/platform/default/mbgl/gl/headless_backend.cpp +++ b/platform/default/mbgl/gl/headless_backend.cpp @@ -1,7 +1,6 @@ #include <mbgl/gl/headless_backend.hpp> -#include <mbgl/gl/headless_display.hpp> #include <mbgl/gl/context.hpp> -#include <mbgl/map/backend_scope.hpp> +#include <mbgl/renderer/backend_scope.hpp> #include <cassert> #include <stdexcept> @@ -9,43 +8,78 @@ 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(std::shared_ptr<HeadlessDisplay> display_) - : display(std::move(display_)) { +HeadlessBackend::HeadlessBackend(Size size_) + : size(size_) { } HeadlessBackend::~HeadlessBackend() { - BackendScope scope(*this); + BackendScope guard { *this }; + view.reset(); context.reset(); } +gl::ProcAddress HeadlessBackend::getExtensionFunctionPointer(const char* name) { + assert(impl); + return impl->getExtensionFunctionPointer(name); +} + void HeadlessBackend::activate() { active = true; - if (!hasContext()) { - if (!hasDisplay()) { - throw std::runtime_error("Display is not set"); - } - createContext(); + if (!impl) { + createImpl(); } - assert(hasContext()); + assert(impl); impl->activateContext(); } void HeadlessBackend::deactivate() { - assert(hasContext()); + assert(impl); impl->deactivateContext(); 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 }; +} + +Size HeadlessBackend::getFramebufferSize() const { + return size; +} + void HeadlessBackend::updateAssumedState() { // no-op } -void HeadlessBackend::invalidate() { - assert(false); +void HeadlessBackend::setSize(Size size_) { + size = size_; + view.reset(); +} + +PremultipliedImage HeadlessBackend::readStillImage() { + return getContext().readFramebuffer<PremultipliedImage>(size); } } // namespace mbgl |