summaryrefslogtreecommitdiff
path: root/platform/default/src/mbgl/gl/headless_backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/src/mbgl/gl/headless_backend.cpp')
-rw-r--r--platform/default/src/mbgl/gl/headless_backend.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/platform/default/src/mbgl/gl/headless_backend.cpp b/platform/default/src/mbgl/gl/headless_backend.cpp
new file mode 100644
index 0000000000..ba08aecab7
--- /dev/null
+++ b/platform/default/src/mbgl/gl/headless_backend.cpp
@@ -0,0 +1,85 @@
+#include <mbgl/gl/headless_backend.hpp>
+#include <mbgl/gl/context.hpp>
+#include <mbgl/renderer/backend_scope.hpp>
+
+#include <cassert>
+#include <stdexcept>
+#include <type_traits>
+
+namespace mbgl {
+
+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();
+}
+
+gl::ProcAddress HeadlessBackend::getExtensionFunctionPointer(const char* name) {
+ assert(impl);
+ return impl->getExtensionFunctionPointer(name);
+}
+
+void HeadlessBackend::activate() {
+ active = true;
+
+ if (!impl) {
+ createImpl();
+ }
+
+ assert(impl);
+ impl->activateContext();
+}
+
+void HeadlessBackend::deactivate() {
+ 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::setSize(Size size_) {
+ size = size_;
+ view.reset();
+}
+
+PremultipliedImage HeadlessBackend::readStillImage() {
+ return getContext().readFramebuffer<PremultipliedImage>(size);
+}
+
+} // namespace mbgl