summaryrefslogtreecommitdiff
path: root/platform/default/mbgl/gl/headless_backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/mbgl/gl/headless_backend.cpp')
-rw-r--r--platform/default/mbgl/gl/headless_backend.cpp39
1 files changed, 38 insertions, 1 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