From d7b1edc1c2a32e34530326a3d1ef3b8c523b164e Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Mon, 16 Mar 2015 16:25:41 +0300 Subject: [PATCH] Fixed drape engine destruction on iOS, moved some common code to renderer --- drape_frontend/backend_renderer.cpp | 7 ++--- drape_frontend/backend_renderer.hpp | 14 ++------- drape_frontend/base_renderer.cpp | 39 +++++++++++++++++++++--- drape_frontend/base_renderer.hpp | 21 +++++++++++-- drape_frontend/frontend_renderer.cpp | 7 ++--- drape_frontend/frontend_renderer.hpp | 7 ----- drape_frontend/message_subclasses.hpp | 5 +++ iphone/Maps/Classes/EAGLView.h | 1 + iphone/Maps/Classes/EAGLView.mm | 2 +- iphone/Maps/Classes/MapViewController.mm | 1 + 10 files changed, 69 insertions(+), 35 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 9b464d038e17f..86fe0f973033c 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -5,10 +5,8 @@ #include "drape_frontend/map_shape.hpp" #include "drape_frontend/user_mark_shapes.hpp" -#include "drape_frontend/threads_commutator.hpp" #include "drape_frontend/message_subclasses.hpp" -#include "drape/oglcontextfactory.hpp" #include "drape/texture_manager.hpp" #include "platform/platform.hpp" @@ -24,12 +22,11 @@ BackendRenderer::BackendRenderer(dp::RefPointer commutator, dp::RefPointer oglcontextfactory, dp::RefPointer textureManager, MapDataProvider const & model) - : m_model(model) + : BaseRenderer(commutator, oglcontextfactory) + , m_model(model) , m_engineContext(commutator) , m_texturesManager(textureManager) , m_guiCacher("default") - , m_commutator(commutator) - , m_contextFactory(oglcontextfactory) { m_commutator->RegisterThread(ThreadsCommutator::ResourceUploadThread, this); m_batchersPool.Reset(new BatchersPool(ReadManager::ReadCount(), bind(&BackendRenderer::FlushGeometry, this, _1))); diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 9fb483ac8b4d1..2bd20070c3245 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -8,8 +8,6 @@ #include "drape_gui/layer_render.hpp" #include "drape/pointers.hpp" -#include "base/thread.hpp" - namespace dp { @@ -22,7 +20,6 @@ namespace df { class Message; -class ThreadsCommutator; class BatchersPool; class ReadManager; @@ -50,9 +47,9 @@ class BackendRenderer : public BaseRenderer private: void AcceptMessage(dp::RefPointer message); - ///////////////////////////////////////// - // ThreadPart // - ///////////////////////////////////////// + ///////////////////////////////////////// + // ThreadPart // + ///////////////////////////////////////// private: class Routine : public threads::IRoutine { @@ -72,11 +69,6 @@ class BackendRenderer : public BaseRenderer void InitGLDependentResource(); void FlushGeometry(dp::TransferPointer message); - -private: - threads::Thread m_selfThread; - dp::RefPointer m_commutator; - dp::RefPointer m_contextFactory; }; } // namespace df diff --git a/drape_frontend/base_renderer.cpp b/drape_frontend/base_renderer.cpp index 42c14dc240294..2d1517f590366 100644 --- a/drape_frontend/base_renderer.cpp +++ b/drape_frontend/base_renderer.cpp @@ -1,16 +1,40 @@ #include "base_renderer.hpp" +#include "threads_commutator.hpp" #include "../std/utility.hpp" +#include "../base/logging.hpp" + + namespace df { -BaseRenderer::BaseRenderer() - : m_isEnabled(true) +BaseRenderer::BaseRenderer(dp::RefPointer commutator, + dp::RefPointer oglcontextfactory) + : m_commutator(commutator) + , m_contextFactory(oglcontextfactory) + , m_isEnabled(true) , m_renderingEnablingCompletionHandler(nullptr) , m_wasNotified(false) { } +void BaseRenderer::StartThread() +{ + m_selfThread.Create(this); +} + +void BaseRenderer::StopThread() +{ + IRoutine::Cancel(); + + if (!m_isEnabled) + { + WakeUp(); + } + CloseQueue(); + m_selfThread.Join(); +} + void BaseRenderer::SetRenderingEnabled(bool const isEnabled) { // here we have to wait for completion of internal SetRenderingEnabled @@ -44,9 +68,7 @@ void BaseRenderer::SetRenderingEnabled(bool const isEnabled, TCompletionHandler if (isEnabled) { // wake up rendering thread - lock_guard lock(m_renderingEnablingMutex); - m_wasNotified = true; - m_renderingEnablingCondition.notify_one(); + WakeUp(); } else { @@ -87,4 +109,11 @@ void BaseRenderer::Notify() m_renderingEnablingCompletionHandler = nullptr; } +void BaseRenderer::WakeUp() +{ + lock_guard lock(m_renderingEnablingMutex); + m_wasNotified = true; + m_renderingEnablingCondition.notify_one(); +} + } // namespace df diff --git a/drape_frontend/base_renderer.hpp b/drape_frontend/base_renderer.hpp index 391b5fda031a7..94b3fc8cb1818 100644 --- a/drape_frontend/base_renderer.hpp +++ b/drape_frontend/base_renderer.hpp @@ -1,6 +1,9 @@ #pragma once #include "message_acceptor.hpp" +#include "../base/thread.hpp" +#include "../drape/oglcontextfactory.hpp" + #include "../std/atomic.hpp" #include "../std/condition_variable.hpp" #include "../std/function.hpp" @@ -9,18 +12,31 @@ namespace df { -class BaseRenderer : public MessageAcceptor +class ThreadsCommutator; + +class BaseRenderer : public MessageAcceptor, + public threads::IRoutine { public: using TCompletionHandler = function; - BaseRenderer(); + BaseRenderer(dp::RefPointer commutator, + dp::RefPointer oglcontextfactory); + void SetRenderingEnabled(bool const isEnabled); + void ClearRenderingQueueSynchronously(); protected: + dp::RefPointer m_commutator; + dp::RefPointer m_contextFactory; + + void StartThread(); + void StopThread(); void CheckRenderingEnabled(); private: + threads::Thread m_selfThread; + mutex m_renderingEnablingMutex; condition_variable m_renderingEnablingCondition; atomic m_isEnabled; @@ -29,6 +45,7 @@ class BaseRenderer : public MessageAcceptor void SetRenderingEnabled(bool const isEnabled, TCompletionHandler completionHandler); void Notify(); + void WakeUp(); }; } // namespace df diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 2937ae539f82c..215674bdce597 100644 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -36,8 +36,7 @@ FrontendRenderer::FrontendRenderer(dp::RefPointer commutator, dp::RefPointer oglcontextfactory, dp::RefPointer textureManager, Viewport viewport) - : m_commutator(commutator) - , m_contextFactory(oglcontextfactory) + : BaseRenderer(commutator, oglcontextfactory) , m_textureManager(textureManager) , m_gpuProgramManager(new dp::GpuProgramManager()) , m_viewport(viewport) @@ -426,7 +425,7 @@ void FrontendRenderer::Routine::Do() while (!IsCancelled()) { context->setDefaultFramebuffer(); - m_textureManager->UpdateDynamicTextures(); + m_renderer.m_textureManager->UpdateDynamicTextures(); m_renderer.RenderScene(); double availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/); @@ -446,7 +445,7 @@ void FrontendRenderer::Routine::Do() context->present(); timer.Reset(); - CheckRenderingEnabled(); + m_renderer.CheckRenderingEnabled(); } m_renderer.ReleaseResources(); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 27b59eee55b90..1c618db0039e2 100644 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -20,7 +20,6 @@ #include "drape/glstate.hpp" #include "drape/vertex_array_buffer.hpp" #include "drape/gpu_program_manager.hpp" -#include "drape/oglcontextfactory.hpp" #include "drape/overlay_tree.hpp" #include "drape/uniform_values_storage.hpp" @@ -33,9 +32,6 @@ namespace dp { class RenderBucket; } namespace df { -struct RenderingEnablingContext; - - class FrontendRenderer : public BaseRenderer { public: @@ -96,12 +92,9 @@ class FrontendRenderer : public BaseRenderer void DeleteRenderData(); private: - dp::RefPointer m_commutator; - dp::RefPointer m_contextFactory; dp::RefPointer m_textureManager; dp::MasterPointer m_gpuProgramManager; - threads::Thread m_selfThread; private: vector m_renderGroups; diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index bc850d4c60767..63d83fc35b26e 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -226,6 +226,11 @@ class GuiLayerRecachedMessage : public Message GuiLayerRecachedMessage(dp::TransferPointer renderer) : m_renderer(renderer) {} + ~GuiLayerRecachedMessage() + { + m_renderer.Destroy(); + } + Type GetType() const override { return Message::GuiLayerRecached; } dp::MasterPointer AcceptRenderer() diff --git a/iphone/Maps/Classes/EAGLView.h b/iphone/Maps/Classes/EAGLView.h index c8adc52353816..f0534a8deb70c 100644 --- a/iphone/Maps/Classes/EAGLView.h +++ b/iphone/Maps/Classes/EAGLView.h @@ -23,6 +23,7 @@ namespace dp - (void)initRenderPolicy; - (void)setMapStyle:(MapStyle)mapStyle; +- (void)deallocateNative; - (CGPoint)viewPoint2GlobalPoint:(CGPoint)pt; - (CGPoint)globalPoint2ViewPoint:(CGPoint)pt; diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index 93a13ae835d92..b1133097cc5e2 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -153,7 +153,7 @@ - (void)layoutSubviews } } -- (void)dealloc +- (void)deallocateNative { GetFramework().PrepareToShutdown(); m_factory.Destroy(); diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 4fba52455ba07..a00e9dc67c796 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -507,6 +507,7 @@ - (void)didReceiveMemoryWarning - (void)onTerminate { GetFramework().SaveState(); + [(EAGLView *)self.view deallocateNative]; } - (void)onEnterBackground