summaryrefslogtreecommitdiff
path: root/platform/default/src/mbgl/gfx/headless_frontend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/src/mbgl/gfx/headless_frontend.cpp')
-rw-r--r--platform/default/src/mbgl/gfx/headless_frontend.cpp71
1 files changed, 44 insertions, 27 deletions
diff --git a/platform/default/src/mbgl/gfx/headless_frontend.cpp b/platform/default/src/mbgl/gfx/headless_frontend.cpp
index 287567adbd..5235b2f408 100644
--- a/platform/default/src/mbgl/gfx/headless_frontend.cpp
+++ b/platform/default/src/mbgl/gfx/headless_frontend.cpp
@@ -1,43 +1,51 @@
-#include <mbgl/gfx/headless_frontend.hpp>
#include <mbgl/gfx/backend_scope.hpp>
+#include <mbgl/gfx/context.hpp>
+#include <mbgl/gfx/headless_frontend.hpp>
+#include <mbgl/map/map.hpp>
+#include <mbgl/map/transform_state.hpp>
#include <mbgl/renderer/renderer.hpp>
#include <mbgl/renderer/renderer_state.hpp>
#include <mbgl/renderer/update_parameters.hpp>
-#include <mbgl/map/map.hpp>
-#include <mbgl/map/transform_state.hpp>
+#include <mbgl/util/monotonic_timer.hpp>
#include <mbgl/util/run_loop.hpp>
namespace mbgl {
HeadlessFrontend::HeadlessFrontend(float pixelRatio_,
+ gfx::HeadlessBackend::SwapBehaviour swapBehavior,
const gfx::ContextMode contextMode,
const optional<std::string> localFontFamily)
- : HeadlessFrontend(
- { 256, 256 }, pixelRatio_, contextMode, localFontFamily) {
-}
+ : HeadlessFrontend({256, 256}, pixelRatio_, swapBehavior, contextMode, localFontFamily) {}
HeadlessFrontend::HeadlessFrontend(Size size_,
float pixelRatio_,
+ gfx::HeadlessBackend::SwapBehaviour swapBehavior,
const gfx::ContextMode contextMode,
const optional<std::string> localFontFamily)
: size(size_),
pixelRatio(pixelRatio_),
- backend(gfx::HeadlessBackend::Create({ static_cast<uint32_t>(size.width * pixelRatio),
- static_cast<uint32_t>(size.height * pixelRatio) }, contextMode)),
- asyncInvalidate([this] {
- if (renderer && updateParameters) {
- gfx::BackendScope guard { *getBackend() };
-
- // onStyleImageMissing might be called during a render. The user implemented method
- // could trigger a call to MGLRenderFrontend#update which overwrites `updateParameters`.
- // Copy the shared pointer here so that the parameters aren't destroyed while `render(...)` is
- // still using them.
- auto updateParameters_ = updateParameters;
- renderer->render(*updateParameters_);
- }
- }),
- renderer(std::make_unique<Renderer>(*getBackend(), pixelRatio, localFontFamily)) {
-}
+ frameTime(0),
+ backend(gfx::HeadlessBackend::Create(
+ {static_cast<uint32_t>(size.width * pixelRatio), static_cast<uint32_t>(size.height * pixelRatio)},
+ swapBehavior,
+ contextMode)),
+ asyncInvalidate([this] {
+ if (renderer && updateParameters) {
+ auto startTime = mbgl::util::MonotonicTimer::now();
+ gfx::BackendScope guard{*getBackend()};
+
+ // onStyleImageMissing might be called during a render. The user implemented method
+ // could trigger a call to MGLRenderFrontend#update which overwrites `updateParameters`.
+ // Copy the shared pointer here so that the parameters aren't destroyed while `render(...)` is
+ // still using them.
+ auto updateParameters_ = updateParameters;
+ renderer->render(*updateParameters_);
+
+ auto endTime = mbgl::util::MonotonicTimer::now();
+ frameTime = (endTime - startTime).count();
+ }
+ }),
+ renderer(std::make_unique<Renderer>(*getBackend(), pixelRatio, localFontFamily)) {}
HeadlessFrontend::~HeadlessFrontend() = default;
@@ -56,6 +64,10 @@ void HeadlessFrontend::setObserver(RendererObserver& observer_) {
renderer->setObserver(&observer_);
}
+double HeadlessFrontend::getFrameTime() const {
+ return frameTime;
+}
+
Size HeadlessFrontend::getSize() const {
return size;
}
@@ -128,29 +140,34 @@ PremultipliedImage HeadlessFrontend::readStillImage() {
return backend->readStillImage();
}
-PremultipliedImage HeadlessFrontend::render(Map& map) {
- PremultipliedImage result;
+HeadlessFrontend::RenderResult HeadlessFrontend::render(Map& map) {
+ HeadlessFrontend::RenderResult result;
std::exception_ptr error;
map.renderStill([&](std::exception_ptr e) {
if (e) {
error = e;
} else {
- result = backend->readStillImage();
+ result.image = backend->readStillImage();
+ result.stats = getBackend()->getContext().renderingStats();
}
});
- while (!result.valid() && !error) {
+ while (!result.image.valid() && !error) {
util::RunLoop::Get()->runOnce();
}
if (error) {
std::rethrow_exception(error);
}
-
+
return result;
}
+void HeadlessFrontend::renderOnce(Map&) {
+ util::RunLoop::Get()->runOnce();
+}
+
optional<TransformState> HeadlessFrontend::getTransformState() const {
if (updateParameters) {
return updateParameters->transformState;