diff options
-rw-r--r-- | benchmark/api/query.benchmark.cpp | 2 | ||||
-rw-r--r-- | platform/default/mbgl/gl/offscreen_view.cpp | 60 | ||||
-rw-r--r-- | platform/default/mbgl/gl/offscreen_view.hpp | 13 | ||||
-rw-r--r-- | platform/node/src/node_map.cpp | 2 | ||||
-rw-r--r-- | test/api/annotations.test.cpp | 8 | ||||
-rw-r--r-- | test/api/api_misuse.test.cpp | 4 | ||||
-rw-r--r-- | test/api/custom_layer.test.cpp | 2 | ||||
-rw-r--r-- | test/api/query.test.cpp | 2 | ||||
-rw-r--r-- | test/api/render_missing.test.cpp | 2 | ||||
-rw-r--r-- | test/api/repeated_render.test.cpp | 2 | ||||
-rw-r--r-- | test/map/map.test.cpp | 44 |
11 files changed, 85 insertions, 56 deletions
diff --git a/benchmark/api/query.benchmark.cpp b/benchmark/api/query.benchmark.cpp index ba696876cd..f7474dd2ee 100644 --- a/benchmark/api/query.benchmark.cpp +++ b/benchmark/api/query.benchmark.cpp @@ -37,7 +37,7 @@ public: OffscreenView view{ backend.getContext(), { 1000, 1000 } }; DefaultFileSource fileSource{ "benchmark/fixtures/api/cache.db", "." }; ThreadPool threadPool{ 4 }; - Map map{ backend, view.size, 1, fileSource, threadPool, MapMode::Still }; + Map map{ backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still }; ScreenBox box{{ 0, 0 }, { 1000, 1000 }}; }; diff --git a/platform/default/mbgl/gl/offscreen_view.cpp b/platform/default/mbgl/gl/offscreen_view.cpp index 16faf6a4a9..a517cefad9 100644 --- a/platform/default/mbgl/gl/offscreen_view.cpp +++ b/platform/default/mbgl/gl/offscreen_view.cpp @@ -1,30 +1,64 @@ #include <mbgl/gl/offscreen_view.hpp> #include <mbgl/gl/context.hpp> +#include <mbgl/gl/framebuffer.hpp> +#include <mbgl/gl/renderbuffer.hpp> +#include <mbgl/util/optional.hpp> #include <cstring> #include <cassert> namespace mbgl { -OffscreenView::OffscreenView(gl::Context& context_, const Size size_) - : size(std::move(size_)), context(context_) { - assert(size); -} +class OffscreenView::Impl { +public: + Impl(gl::Context& context_, const Size size_) : context(context_), size(std::move(size_)) { + assert(size); + } -void OffscreenView::bind() { - if (!framebuffer) { - color = context.createRenderbuffer<gl::RenderbufferType::RGBA>(size); - depthStencil = context.createRenderbuffer<gl::RenderbufferType::DepthStencil>(size); - framebuffer = context.createFramebuffer(*color, *depthStencil); - } else { - context.bindFramebuffer = framebuffer->framebuffer; + void bind() { + if (!framebuffer) { + color = context.createRenderbuffer<gl::RenderbufferType::RGBA>(size); + depthStencil = context.createRenderbuffer<gl::RenderbufferType::DepthStencil>(size); + framebuffer = context.createFramebuffer(*color, *depthStencil); + } else { + context.bindFramebuffer = framebuffer->framebuffer; + } + + context.viewport = { 0, 0, size }; + } + + PremultipliedImage readStillImage() { + return context.readFramebuffer<PremultipliedImage>(size); + } + + const Size& getSize() const { + return size; } - context.viewport = { 0, 0, size }; +private: + gl::Context& context; + const Size size; + optional<gl::Framebuffer> framebuffer; + optional<gl::Renderbuffer<gl::RenderbufferType::RGBA>> color; + optional<gl::Renderbuffer<gl::RenderbufferType::DepthStencil>> depthStencil; +}; + +OffscreenView::OffscreenView(gl::Context& context, const Size size) + : impl(std::make_unique<Impl>(context, std::move(size))) { +} + +OffscreenView::~OffscreenView() = default; + +void OffscreenView::bind() { + impl->bind(); } PremultipliedImage OffscreenView::readStillImage() { - return context.readFramebuffer<PremultipliedImage>(size); + return impl->readStillImage(); +} + +const Size& OffscreenView::getSize() const { + return impl->getSize(); } } // namespace mbgl diff --git a/platform/default/mbgl/gl/offscreen_view.hpp b/platform/default/mbgl/gl/offscreen_view.hpp index 0e839e14cc..bf1a9889cd 100644 --- a/platform/default/mbgl/gl/offscreen_view.hpp +++ b/platform/default/mbgl/gl/offscreen_view.hpp @@ -1,9 +1,6 @@ #pragma once #include <mbgl/map/view.hpp> -#include <mbgl/gl/framebuffer.hpp> -#include <mbgl/gl/renderbuffer.hpp> -#include <mbgl/util/optional.hpp> #include <mbgl/util/image.hpp> namespace mbgl { @@ -15,19 +12,17 @@ class Context; class OffscreenView : public View { public: OffscreenView(gl::Context&, Size size = { 256, 256 }); + ~OffscreenView(); void bind() override; PremultipliedImage readStillImage(); -public: - const Size size; + const Size& getSize() const; private: - gl::Context& context; - optional<gl::Framebuffer> framebuffer; - optional<gl::Renderbuffer<gl::RenderbufferType::RGBA>> color; - optional<gl::Renderbuffer<gl::RenderbufferType::DepthStencil>> depthStencil; + class Impl; + const std::unique_ptr<Impl> impl; }; } // namespace mbgl diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index b73206c6cb..66cdb3eda7 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -365,7 +365,7 @@ void NodeMap::startRender(NodeMap::RenderOptions options) { const mbgl::Size fbSize{ static_cast<uint32_t>(options.width * pixelRatio), static_cast<uint32_t>(options.height * pixelRatio) }; - if (!view || view->size != fbSize) { + if (!view || view->getSize() != fbSize) { view.reset(); view = std::make_unique<mbgl::OffscreenView>(backend.getContext(), fbSize); } diff --git a/test/api/annotations.test.cpp b/test/api/annotations.test.cpp index 9ac3369284..6644e9c92c 100644 --- a/test/api/annotations.test.cpp +++ b/test/api/annotations.test.cpp @@ -27,7 +27,7 @@ public: OffscreenView view { backend.getContext() }; StubFileSource fileSource; ThreadPool threadPool { 4 }; - Map map { backend, view.size, 1, fileSource, threadPool, MapMode::Still }; + Map map { backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still }; void checkRendering(const char * name) { test::checkImage(std::string("test/fixtures/annotations/") + name, @@ -45,7 +45,7 @@ TEST(Annotations, SymbolAnnotation) { test.map.addAnnotation(SymbolAnnotation { Point<double>(0, 0), "default_marker" }); test.checkRendering("point_annotation"); -// auto size = test.view.size; +// auto size = test.view.getSize(); // auto screenBox = ScreenBox { {}, { double(size.width), double(size.height) } }; // for (uint8_t zoom = test.map.getMinZoom(); zoom <= test.map.getMaxZoom(); ++zoom) { // test.map.setZoom(zoom); @@ -351,7 +351,7 @@ TEST(Annotations, QueryRenderedFeatures) { TEST(Annotations, QueryFractionalZoomLevels) { AnnotationTest test; - auto viewSize = test.view.size; + auto viewSize = test.view.getSize(); auto box = ScreenBox { {}, { double(viewSize.width), double(viewSize.height) } }; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); @@ -383,7 +383,7 @@ TEST(Annotations, QueryFractionalZoomLevels) { TEST(Annotations, VisibleFeatures) { AnnotationTest test; - auto viewSize = test.view.size; + auto viewSize = test.view.getSize(); auto box = ScreenBox { {}, { double(viewSize.width), double(viewSize.height) } }; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); diff --git a/test/api/api_misuse.test.cpp b/test/api/api_misuse.test.cpp index 34272f5366..1a61872f79 100644 --- a/test/api/api_misuse.test.cpp +++ b/test/api/api_misuse.test.cpp @@ -27,7 +27,7 @@ TEST(API, RenderWithoutCallback) { ThreadPool threadPool(4); std::unique_ptr<Map> map = - std::make_unique<Map>(backend, view.size, 1, fileSource, threadPool, MapMode::Still); + std::make_unique<Map>(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); map->renderStill(view, nullptr); // Force Map thread to join. @@ -51,7 +51,7 @@ TEST(API, RenderWithoutStyle) { StubFileSource fileSource; ThreadPool threadPool(4); - Map map(backend, view.size, 1, fileSource, threadPool, MapMode::Still); + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); std::exception_ptr error; map.renderStill(view, [&](std::exception_ptr error_) { diff --git a/test/api/custom_layer.test.cpp b/test/api/custom_layer.test.cpp index 73b4e94af5..dd56197463 100644 --- a/test/api/custom_layer.test.cpp +++ b/test/api/custom_layer.test.cpp @@ -97,7 +97,7 @@ TEST(CustomLayer, Basic) { ThreadPool threadPool(4); - Map map(backend, view.size, 1, fileSource, threadPool, MapMode::Still); + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/water.json")); map.setLatLngZoom({ 37.8, -122.5 }, 10); map.addLayer(std::make_unique<CustomLayer>( diff --git a/test/api/query.test.cpp b/test/api/query.test.cpp index 86687fc818..4d2bf00f67 100644 --- a/test/api/query.test.cpp +++ b/test/api/query.test.cpp @@ -30,7 +30,7 @@ public: OffscreenView view { backend.getContext() }; StubFileSource fileSource; ThreadPool threadPool { 4 }; - Map map { backend, view.size, 1, fileSource, threadPool, MapMode::Still }; + Map map { backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still }; }; } // end namespace diff --git a/test/api/render_missing.test.cpp b/test/api/render_missing.test.cpp index a5c59913bc..c1bf7e5702 100644 --- a/test/api/render_missing.test.cpp +++ b/test/api/render_missing.test.cpp @@ -38,7 +38,7 @@ TEST(API, TEST_REQUIRES_SERVER(RenderMissingTile)) { Log::setObserver(std::make_unique<FixtureLogObserver>()); - Map map(backend, view.size, 1, fileSource, threadPool, MapMode::Still); + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); std::string message; diff --git a/test/api/repeated_render.test.cpp b/test/api/repeated_render.test.cpp index 49b9a31b0b..800813075f 100644 --- a/test/api/repeated_render.test.cpp +++ b/test/api/repeated_render.test.cpp @@ -34,7 +34,7 @@ TEST(API, RepeatedRender) { Log::setObserver(std::make_unique<FixtureLogObserver>()); - Map map(backend, view.size, 1, fileSource, threadPool, MapMode::Still); + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); { map.setStyleJSON(style); diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index a00a4efacc..618c2e6a74 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -34,7 +34,7 @@ struct MapTest { TEST(Map, LatLngBehavior) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); @@ -68,7 +68,7 @@ TEST(Map, Offline) { fileSource.put(Resource::glyphs(prefix + "{fontstack}/{range}.pbf", {{"Helvetica"}}, {0, 255}), expiredItem("glyph.pbf")); NetworkStatus::Set(NetworkStatus::Status::Offline); - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL(prefix + "style.json"); test::checkImage("test/fixtures/map/offline", @@ -92,7 +92,7 @@ TEST(Map, SetStyleInvalidJSON) { }); { - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON("invalid"); } @@ -124,7 +124,7 @@ TEST(Map, SetStyleInvalidURL) { } }); - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleURL("mapbox://bar"); test.runLoop.run(); @@ -133,7 +133,7 @@ TEST(Map, SetStyleInvalidURL) { TEST(Map, DoubleStyleLoad) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(""); map.setStyleJSON(""); } @@ -144,7 +144,7 @@ TEST(Map, StyleFresh) { MapTest test; FakeFileSource fileSource; - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL("mapbox://styles/test"); EXPECT_EQ(1u, fileSource.requests.size()); @@ -164,7 +164,7 @@ TEST(Map, StyleExpired) { MapTest test; FakeFileSource fileSource; - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL("mapbox://styles/test"); EXPECT_EQ(1u, fileSource.requests.size()); @@ -191,7 +191,7 @@ TEST(Map, StyleExpiredWithAnnotations) { MapTest test; FakeFileSource fileSource; - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL("mapbox://styles/test"); EXPECT_EQ(1u, fileSource.requests.size()); @@ -215,7 +215,7 @@ TEST(Map, StyleEarlyMutation) { MapTest test; FakeFileSource fileSource; - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL("mapbox://styles/test"); map.addLayer(std::make_unique<style::BackgroundLayer>("bg")); @@ -229,7 +229,7 @@ TEST(Map, StyleEarlyMutation) { TEST(Map, StyleLoadedSignal) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); // The map should emit a signal on style loaded bool emitted = false; @@ -252,7 +252,7 @@ TEST(Map, TEST_REQUIRES_SERVER(StyleNetworkErrorRetry)) { MapTest test; OnlineFileSource fileSource; - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL("http://127.0.0.1:3000/style-fail-once-500"); test.backend.setMapChangeCallback([&](MapChange change) { @@ -268,7 +268,7 @@ TEST(Map, TEST_REQUIRES_SERVER(StyleNotFound)) { MapTest test; OnlineFileSource fileSource; - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleURL("http://127.0.0.1:3000/style-fail-once-404"); using namespace std::chrono_literals; @@ -297,7 +297,7 @@ TEST(Map, TEST_REQUIRES_SERVER(StyleNotFound)) { TEST(Map, AddLayer) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); auto layer = std::make_unique<BackgroundLayer>("background"); @@ -319,7 +319,7 @@ TEST(Map, WithoutVAOExtension) { DefaultFileSource fileSource(":memory:", "test/fixtures/api/assets"); #endif - Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/water.json")); test::checkImage("test/fixtures/map/no_vao", test::render(map, test.view), 0.002); @@ -328,7 +328,7 @@ TEST(Map, WithoutVAOExtension) { TEST(Map, RemoveLayer) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); auto layer = std::make_unique<BackgroundLayer>("background"); @@ -353,7 +353,7 @@ TEST(Map, DisabledSources) { return {}; }; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setZoom(1); // This stylesheet has two raster layers, one that starts at zoom 1, the other at zoom 0. @@ -403,7 +403,7 @@ TEST(Map, DisabledSources) { TEST(Map, Classes) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); EXPECT_FALSE(map.getTransitionOptions().duration); @@ -437,7 +437,7 @@ TEST(Map, Classes) { TEST(Map, AddImage) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); auto decoded1 = decodeImage(util::read_file("test/fixtures/sprites/default_marker.png")); auto decoded2 = decodeImage(util::read_file("test/fixtures/sprites/default_marker.png")); auto image1 = std::make_unique<SpriteImage>(std::move(decoded1), 1.0); @@ -454,7 +454,7 @@ TEST(Map, AddImage) { TEST(Map, RemoveImage) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); auto decoded = decodeImage(util::read_file("test/fixtures/sprites/default_marker.png")); auto image = std::make_unique<SpriteImage>(std::move(decoded), 1.0); @@ -467,7 +467,7 @@ TEST(Map, RemoveImage) { TEST(Map, GetImage) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); auto decoded = decodeImage(util::read_file("test/fixtures/sprites/default_marker.png")); auto image = std::make_unique<SpriteImage>(std::move(decoded), 1.0); @@ -479,7 +479,7 @@ TEST(Map, GetImage) { TEST(Map, DontLoadUnneededTiles) { MapTest test; - Map map(test.backend, test.view.size, 1, test.fileSource, test.threadPool, MapMode::Still); + Map map(test.backend, test.view.getSize(), 1, test.fileSource, test.threadPool, MapMode::Still); map.setStyleJSON(R"STYLE({ "sources": { "a": { "type": "vector", "tiles": [ "a/{z}/{x}/{y}" ] } @@ -552,7 +552,7 @@ TEST(Map, TEST_DISABLED_ON_CI(ContinuousRendering)) { DefaultFileSource fileSource(":memory:", "test/fixtures/api/assets"); #endif - Map map(backend, view.size, 1, fileSource, threadPool, MapMode::Continuous); + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Continuous); using namespace std::chrono_literals; |