From 8401325a82a5affd9f4fe2348d065d8aa0aa0bc4 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Wed, 28 Jun 2017 10:55:43 -0700 Subject: [glfw] rendering interface changes --- cmake/glfw.cmake | 2 ++ platform/glfw/glfw_renderer_frontend.cpp | 39 ++++++++++++++++++++++++++++++++ platform/glfw/glfw_renderer_frontend.hpp | 29 ++++++++++++++++++++++++ platform/glfw/glfw_view.cpp | 16 +++++++++---- platform/glfw/glfw_view.hpp | 7 +++++- platform/glfw/main.cpp | 6 +++-- 6 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 platform/glfw/glfw_renderer_frontend.cpp create mode 100644 platform/glfw/glfw_renderer_frontend.hpp diff --git a/cmake/glfw.cmake b/cmake/glfw.cmake index 3dca089c14..dd73b54eef 100644 --- a/cmake/glfw.cmake +++ b/cmake/glfw.cmake @@ -5,6 +5,8 @@ add_executable(mbgl-glfw target_sources(mbgl-glfw PRIVATE platform/glfw/glfw_view.hpp PRIVATE platform/glfw/glfw_view.cpp + PRIVATE platform/glfw/glfw_renderer_frontend.hpp + PRIVATE platform/glfw/glfw_renderer_frontend.cpp PRIVATE platform/glfw/settings_json.hpp PRIVATE platform/glfw/settings_json.cpp PRIVATE platform/default/mbgl/util/default_styles.hpp diff --git a/platform/glfw/glfw_renderer_frontend.cpp b/platform/glfw/glfw_renderer_frontend.cpp new file mode 100644 index 0000000000..99f409e338 --- /dev/null +++ b/platform/glfw/glfw_renderer_frontend.cpp @@ -0,0 +1,39 @@ +#include "glfw_renderer_frontend.hpp" + +#include + +GLFWRendererFrontend::GLFWRendererFrontend(std::unique_ptr renderer_, GLFWView& glfwView_) + : glfwView(glfwView_) + , renderer(std::move(renderer_)) { + glfwView.setRenderFrontend(this); +} + +GLFWRendererFrontend::~GLFWRendererFrontend() = default; + +void GLFWRendererFrontend::reset() { + assert(renderer); + renderer.reset(); +} + +void GLFWRendererFrontend::setObserver(mbgl::RendererObserver& observer) { + assert(renderer); + renderer->setObserver(&observer); +} + +void GLFWRendererFrontend::update(std::shared_ptr params) { + updateParameters = std::move(params); + glfwView.invalidate(); +} + +void GLFWRendererFrontend::render() { + assert(renderer); + + if (!updateParameters) return; + + renderer->render(glfwView, *updateParameters); +} + +mbgl::Renderer* GLFWRendererFrontend::getRenderer() { + assert(renderer); + return renderer.get(); +} diff --git a/platform/glfw/glfw_renderer_frontend.hpp b/platform/glfw/glfw_renderer_frontend.hpp new file mode 100644 index 0000000000..c992fe20fe --- /dev/null +++ b/platform/glfw/glfw_renderer_frontend.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "glfw_view.hpp" +#include + +#include + +namespace mbgl { +class Renderer; +} // namespace mbgl + +class GLFWRendererFrontend : public mbgl::RendererFrontend { +public: + GLFWRendererFrontend(std::unique_ptr, GLFWView&); + ~GLFWRendererFrontend() override; + + void reset() override; + void setObserver(mbgl::RendererObserver&) override; + + void update(std::shared_ptr) override; + void render(); + + mbgl::Renderer* getRenderer(); + +private: + GLFWView& glfwView; + std::unique_ptr renderer; + std::shared_ptr updateParameters; +}; diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 1beaf2b52b..ffc6588464 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -1,4 +1,5 @@ #include "glfw_view.hpp" +#include "glfw_renderer_frontend.hpp" #include "ny_route.hpp" #include @@ -11,6 +12,7 @@ #include #include #include +#include #include #include @@ -142,6 +144,10 @@ void GLFWView::setMap(mbgl::Map *map_) { map->addAnnotationImage(makeImage("default_marker", 22, 22, 1)); } +void GLFWView::setRenderFrontend(GLFWRendererFrontend* rendererFrontend_) { + rendererFrontend = rendererFrontend_; +} + void GLFWView::updateAssumedState() { assumeFramebufferBinding(0); assumeViewport(0, 0, getFramebufferSize()); @@ -196,7 +202,7 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, view->nextOrientation(); break; case GLFW_KEY_Q: { - auto result = view->map->queryPointAnnotations({ {}, { double(view->getSize().width), double(view->getSize().height) } }); + auto result = view->rendererFrontend->getRenderer()->queryPointAnnotations({ {}, { double(view->getSize().width), double(view->getSize().height) } }); printf("visible point annotations: %lu\n", result.size()); } break; case GLFW_KEY_P: @@ -489,16 +495,17 @@ void GLFWView::run() { glfwPollEvents(); - if (dirty) { + if (dirty && rendererFrontend) { + dirty = false; const double started = glfwGetTime(); if (animateRouteCallback) animateRouteCallback(map); activate(); - mbgl::BackendScope scope { *this, mbgl::BackendScope::ScopeType::Implicit }; + mbgl::BackendScope guard { *this, getScopeType() }; - map->render(*this); + rendererFrontend->render(); glfwSwapBuffers(window); @@ -507,7 +514,6 @@ void GLFWView::run() { invalidate(); } - dirty = false; } }; diff --git a/platform/glfw/glfw_view.hpp b/platform/glfw/glfw_view.hpp index 3b0c31009c..02e98a831d 100644 --- a/platform/glfw/glfw_view.hpp +++ b/platform/glfw/glfw_view.hpp @@ -8,6 +8,7 @@ #include struct GLFWwindow; +class GLFWRendererFrontend; class GLFWView : public mbgl::View, public mbgl::Backend, public mbgl::MapObserver { public: @@ -17,6 +18,8 @@ public: float getPixelRatio() const; void setMap(mbgl::Map*); + + void setRenderFrontend(GLFWRendererFrontend*); // Callback called when the user presses the key mapped to style change. // The expected action is to set a new style, different to the current one. @@ -31,6 +34,8 @@ public: void setWindowTitle(const std::string&); void run(); + + void invalidate(); // mbgl::View implementation void bind() override; @@ -38,7 +43,6 @@ public: mbgl::Size getFramebufferSize() const; // mbgl::Backend implementation - void invalidate() override; void updateAssumedState() override; // mbgl::MapObserver implementation @@ -83,6 +87,7 @@ private: void toggle3DExtrusions(bool visible); mbgl::Map* map = nullptr; + GLFWRendererFrontend* rendererFrontend = nullptr; bool fullscreen = false; const bool benchmark = false; diff --git a/platform/glfw/main.cpp b/platform/glfw/main.cpp index 0cd9543f9c..6418ddcf78 100644 --- a/platform/glfw/main.cpp +++ b/platform/glfw/main.cpp @@ -1,4 +1,5 @@ #include "glfw_view.hpp" +#include "glfw_renderer_frontend.hpp" #include "settings_json.hpp" #include @@ -7,6 +8,7 @@ #include #include #include +#include #include #include @@ -120,8 +122,8 @@ int main(int argc, char *argv[]) { } mbgl::ThreadPool threadPool(4); - - mbgl::Map map(backend, backend, view->getSize(), view->getPixelRatio(), fileSource, threadPool); + GLFWRendererFrontend rendererFrontend { std::make_unique(backend, view->getPixelRatio(), fileSource, threadPool), backend }; + mbgl::Map map(rendererFrontend, backend, view->getSize(), view->getPixelRatio(), fileSource, threadPool); backend.setMap(&map); -- cgit v1.2.1