Expose Metal texture from headless backend (#4267)

This commit is contained in:
Sargun Vohra
2026-04-28 18:15:26 -07:00
committed by GitHub
parent 80686f477c
commit 647636bf61
2 changed files with 18 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
#pragma once
#include <mbgl/gfx/headless_backend.hpp>
#include <mbgl/mtl/mtl_fwd.hpp>
#include <mbgl/mtl/renderer_backend.hpp>
#include <memory>
#include <functional>
@@ -17,12 +18,14 @@ public:
void updateAssumedState() override;
gfx::Renderable& getDefaultRenderable() override;
PremultipliedImage readStillImage() override;
MTL::Texture* getMetalTexture();
RendererBackend* getRendererBackend() override;
SwapBehaviour getSwapBehaviour();
private:
void activate() override;
void deactivate() override;
void ensureResource();
private:
bool active = false;

View File

@@ -2,6 +2,7 @@
#include <mbgl/mtl/renderable_resource.hpp>
#include <mbgl/mtl/offscreen_texture.hpp>
#include <mbgl/mtl/context.hpp>
#include <mbgl/mtl/texture2d.hpp>
#include <mbgl/gfx/backend_scope.hpp>
#include <Metal/Metal.hpp>
@@ -29,6 +30,10 @@ public:
PremultipliedImage readStillImage() { return offscreenTexture->readStillImage(); }
MTL::Texture* getMetalTexture() {
return static_cast<Texture2D*>(offscreenTexture->getTexture().get())->getMetalTexture();
}
const RendererBackend& getBackend() const override { return context.getBackend(); }
const MTLCommandBufferPtr& getCommandBuffer() const override {
@@ -72,10 +77,14 @@ void HeadlessBackend::deactivate() {
}
gfx::Renderable& HeadlessBackend::getDefaultRenderable() {
ensureResource();
return *this;
}
void HeadlessBackend::ensureResource() {
if (!resource) {
resource = std::make_unique<HeadlessRenderableResource>(*this, static_cast<mtl::Context&>(getContext()), size);
}
return *this;
}
void HeadlessBackend::updateAssumedState() {
@@ -86,6 +95,11 @@ PremultipliedImage HeadlessBackend::readStillImage() {
return getResource<HeadlessRenderableResource>().readStillImage();
}
MTL::Texture* HeadlessBackend::getMetalTexture() {
ensureResource();
return getResource<HeadlessRenderableResource>().getMetalTexture();
}
RendererBackend* HeadlessBackend::getRendererBackend() {
return this;
}