Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
Add getFramebufferSize methods to get real framebuffer size without b…
Browse files Browse the repository at this point in the history
…inding or changing state
  • Loading branch information
Lauren Budorick committed Sep 14, 2017
1 parent 615328a commit f0fa915
Show file tree
Hide file tree
Showing 14 changed files with 43 additions and 25 deletions.
2 changes: 2 additions & 0 deletions include/mbgl/renderer/renderer_backend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ class RendererBackend {
// set to the current state.
virtual void bind() = 0;

virtual Size getFramebufferSize() const = 0;

protected:
// Called with the name of an OpenGL extension that should be loaded. RendererBackend implementations
// must call the API-specific version that obtains the function pointer for this function,
Expand Down
8 changes: 4 additions & 4 deletions platform/android/src/native_map_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ void NativeMapView::bind() {
setViewport(0, 0, getFramebufferSize());
}

mbgl::Size NativeMapView::getFramebufferSize() const {
return { static_cast<uint32_t>(fbWidth), static_cast<uint32_t>(fbHeight) };
}

/**
* From mbgl::RendererBackend.
*/
Expand Down Expand Up @@ -1428,10 +1432,6 @@ void NativeMapView::_destroySurface() {
}
}

mbgl::Size NativeMapView::getFramebufferSize() const {
return { static_cast<uint32_t>(fbWidth), static_cast<uint32_t>(fbHeight) };
}

void NativeMapView::updateAssumedState() {
assumeFramebufferBinding(0);
assumeViewport(0, 0, getFramebufferSize());
Expand Down
5 changes: 3 additions & 2 deletions platform/android/src/native_map_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ class NativeMapView : public RendererBackend, public MapObserver {
// mbgl::RendererBackend //

void bind() override;

mbgl::Size getFramebufferSize() const override;

void updateAssumedState() override;

// Deprecated //
Expand Down Expand Up @@ -282,8 +285,6 @@ class NativeMapView : public RendererBackend, public MapObserver {

EGLConfig chooseConfig(const EGLConfig configs[], EGLint numConfigs);

mbgl::Size getFramebufferSize() const;

void updateFps();

private:
Expand Down
4 changes: 4 additions & 0 deletions platform/default/mbgl/gl/headless_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ void HeadlessBackend::bind() {
context_.viewport = { 0, 0, size };
}

Size HeadlessBackend::getFramebufferSize() const {
return size;
}

void HeadlessBackend::updateAssumedState() {
// no-op
}
Expand Down
1 change: 1 addition & 0 deletions platform/default/mbgl/gl/headless_backend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class HeadlessBackend : public RendererBackend {
~HeadlessBackend() override;

void bind() override;
Size getFramebufferSize() const override;
void updateAssumedState() override;

void setSize(Size);
Expand Down
2 changes: 1 addition & 1 deletion platform/glfw/glfw_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class GLFWView : public mbgl::RendererBackend, public mbgl::MapObserver {
void invalidate();

mbgl::Size getSize() const;
mbgl::Size getFramebufferSize() const;
mbgl::Size getFramebufferSize() const override;

// mbgl::RendererBackend implementation
void bind() override;
Expand Down
4 changes: 4 additions & 0 deletions platform/ios/src/MGLMapView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -5464,6 +5464,10 @@ void bind() override {
}
}

mbgl::Size getFramebufferSize() const override {
return nativeView.framebufferSize;
}

void onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode) override {
bool animated = mode == mbgl::MapObserver::CameraChangeMode::Animated;
[nativeView cameraWillChangeAnimated:animated];
Expand Down
4 changes: 4 additions & 0 deletions platform/macos/src/MGLMapView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -2883,6 +2883,10 @@ void bind() override {
setViewport(0, 0, nativeView.framebufferSize);
}

mbgl::Size getFramebufferSize() const override {
return nativeView.framebufferSize;
}

mbgl::PremultipliedImage readStillImage() {
return readFramebuffer(nativeView.framebufferSize);
}
Expand Down
8 changes: 4 additions & 4 deletions platform/qt/src/qmapboxgl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1505,7 +1505,7 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin
static_cast<mbgl::GLContextMode>(settings.contextMode())),
*this);
connect(frontend.get(), SIGNAL(updated()), this, SLOT(invalidate()));

mapObj = std::make_unique<mbgl::Map>(
*frontend,
*this, sanitizedSize(size),
Expand All @@ -1528,18 +1528,18 @@ QMapboxGLPrivate::~QMapboxGLPrivate()
{
}

mbgl::Size QMapboxGLPrivate::framebufferSize() const {
mbgl::Size QMapboxGLPrivate::getFramebufferSize() const {
return sanitizedSize(fbSize);
}

void QMapboxGLPrivate::updateAssumedState() {
assumeFramebufferBinding(fbObject);
assumeViewport(0, 0, framebufferSize());
assumeViewport(0, 0, getFramebufferSize());
}

void QMapboxGLPrivate::bind() {
setFramebufferBinding(fbObject);
setViewport(0, 0, framebufferSize());
setViewport(0, 0, getFramebufferSize());
}

void QMapboxGLPrivate::invalidate()
Expand Down
2 changes: 1 addition & 1 deletion platform/qt/src/qmapboxgl_p.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ class QMapboxGLPrivate : public QObject, public mbgl::RendererBackend, public mb
explicit QMapboxGLPrivate(QMapboxGL *, const QMapboxGLSettings &, const QSize &size, qreal pixelRatio);
virtual ~QMapboxGLPrivate();

mbgl::Size framebufferSize() const;

// mbgl::RendererBackend implementation.
void bind() final;
mbgl::Size getFramebufferSize() const final;
void updateAssumedState() final;
void activate() final {}
void deactivate() final {}
Expand Down
4 changes: 2 additions & 2 deletions src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
}

if (parameters.pass == RenderPass::Pass3D) {
const auto size = parameters.context.viewport.getCurrentValue().size;
const auto& size = parameters.staticData.backendSize;

if (!renderTexture || renderTexture->getSize() != size) {
renderTexture = OffscreenTexture(parameters.context, size, *parameters.staticData.depthRenderbuffer);
Expand Down Expand Up @@ -125,7 +125,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
} else if (parameters.pass == RenderPass::Translucent) {
parameters.context.bindTexture(renderTexture->getTexture());

const auto size = parameters.context.viewport.getCurrentValue().size;
const auto& size = parameters.staticData.backendSize;

mat4 viewportMat;
matrix::ortho(viewportMat, 0, size.width, size.height, 0, 0, 1);
Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/render_static_data.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class RenderStaticData {

optional<gl::Renderbuffer<gl::RenderbufferType::DepthComponent>> depthRenderbuffer;
bool has3D = false;
Size backendSize;

Programs programs;

Expand Down
11 changes: 4 additions & 7 deletions src/mbgl/renderer/renderer_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,16 +390,15 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
// Renders any 3D layers bottom-to-top to unique FBOs with texture attachments, but share the same
// depth rbo between them.
if (parameters.staticData.has3D) {
parameters.backend.bind();
parameters.staticData.backendSize = parameters.backend.getFramebufferSize();

MBGL_DEBUG_GROUP(parameters.context, "3d");
parameters.pass = RenderPass::Pass3D;

const auto size = parameters.context.viewport.getCurrentValue().size;

if (!parameters.staticData.depthRenderbuffer ||
parameters.staticData.depthRenderbuffer->size != size) {
parameters.staticData.depthRenderbuffer->size != parameters.staticData.backendSize) {
parameters.staticData.depthRenderbuffer =
parameters.context.createRenderbuffer<gl::RenderbufferType::DepthComponent>(size);
parameters.context.createRenderbuffer<gl::RenderbufferType::DepthComponent>(parameters.staticData.backendSize);
}
parameters.staticData.depthRenderbuffer->shouldClear(true);

Expand All @@ -411,8 +410,6 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
it->layer.render(parameters, it->source);
}
}

// The main backend/framebuffer will be rebound in the clear step.
}

// - CLEAR -------------------------------------------------------------------------------------
Expand Down
12 changes: 8 additions & 4 deletions test/renderer/backend_scope.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ class StubRendererBackend: public RendererBackend {
void bind() override {
}

mbgl::Size getFramebufferSize() const override {
return mbgl::Size{};
}

void activate() override {
if (activateFunction) activateFunction();
}
Expand Down Expand Up @@ -87,15 +91,15 @@ TEST(BackendScope, NestedScopes) {
TEST(BackendScope, ChainedScopes) {
bool activatedA = false;
bool activatedB = false;

StubRendererBackend backendA;
backendA.activateFunction = [&] { activatedA = true; };
backendA.deactivateFunction = [&] { activatedA = false; };

StubRendererBackend backendB;
backendB.activateFunction = [&] { activatedB = true; };
backendB.deactivateFunction = [&] { activatedB = false; };

{
BackendScope scopeA { backendA };
ASSERT_TRUE(activatedA);
Expand All @@ -107,7 +111,7 @@ TEST(BackendScope, ChainedScopes) {
ASSERT_FALSE(activatedB);
ASSERT_TRUE(activatedA);
}

ASSERT_FALSE(activatedA);
ASSERT_FALSE(activatedB);
}

0 comments on commit f0fa915

Please sign in to comment.