From baf30cd1f776ec0a44688c12580bacf45e33c93c Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Sun, 29 Nov 2015 00:27:34 +0200 Subject: [PATCH] [glfw] Main loop integration This new code can be used for rendering on the Main thread while it will also work for rendering on the Map thread before we make the switch. Needed by #2909. --- include/mbgl/platform/default/glfw_view.hpp | 5 +++++ {src => include}/mbgl/util/timer.hpp | 0 platform/default/glfw_view.cpp | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) rename {src => include}/mbgl/util/timer.hpp (100%) diff --git a/include/mbgl/platform/default/glfw_view.hpp b/include/mbgl/platform/default/glfw_view.hpp index ae5bf340d..802f61b0c 100644 --- a/include/mbgl/platform/default/glfw_view.hpp +++ b/include/mbgl/platform/default/glfw_view.hpp @@ -2,6 +2,8 @@ #define MBGL_COMMON_GLFW_VIEW #include +#include +#include #ifdef MBGL_USE_GLES2 #define GLFW_INCLUDE_ES2 @@ -92,6 +94,9 @@ private: std::function changeStyleCallback; + mbgl::util::RunLoop runLoop; + mbgl::util::Timer frameTick; + GLFWwindow *window = nullptr; std::atomic_flag clean = ATOMIC_FLAG_INIT; }; diff --git a/src/mbgl/util/timer.hpp b/include/mbgl/util/timer.hpp similarity index 100% rename from src/mbgl/util/timer.hpp rename to include/mbgl/util/timer.hpp diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 6a7e79862..e65693c4c 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -419,8 +419,16 @@ void GLFWView::onMouseMove(GLFWwindow *window, double x, double y) { } void GLFWView::run() { - while (!glfwWindowShouldClose(window)) { - glfwWaitEvents(); + auto callback = [&] { + if (glfwWindowShouldClose(window)) { + frameTick.stop(); + runLoop.stop(); + + return; + } + + glfwPollEvents(); + const bool dirty = !clean.test_and_set(); if (dirty) { const double started = glfwGetTime(); @@ -430,7 +438,10 @@ void GLFWView::run() { map->update(mbgl::Update::Repaint); } } - } + }; + + frameTick.start(mbgl::Duration::zero(), mbgl::Milliseconds(1000 / 60), callback); + runLoop.run(); } float GLFWView::getPixelRatio() const {