diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index f29fc0d9e7..162554589f 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -181,8 +181,10 @@ bool _inRepaint = false; if (_doRepaint) { _doRepaint = false; - [controller onPaint]; + [controller beginPaint]; + [controller doPaint]; renderBuffer->present(); + [controller endPaint]; } _inRepaint = false; } diff --git a/iphone/Maps/Classes/MapViewController.h b/iphone/Maps/Classes/MapViewController.h index 6753fcf0aa..4456e9b4b2 100644 --- a/iphone/Maps/Classes/MapViewController.h +++ b/iphone/Maps/Classes/MapViewController.h @@ -32,7 +32,9 @@ - (void) ZoomToRect: (m2::RectD const &) rect; - (void) onResize: (GLint)width withHeight: (GLint)height; -- (void) onPaint; +- (void) beginPaint; +- (void) doPaint; +- (void) endPaint; // called when app is terminated by system - (void) OnTerminate; diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index c74285728a..f1fbe10211 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -275,11 +275,21 @@ NSInteger compareAddress(id l, id r, void * context) m_framework->Scale(0.5); } -- (void)onPaint +- (void)beginPaint +{ + m_framework->BeginPaint(); +} + +- (void)endPaint +{ + m_framework->EndPaint(); +} + +- (void)doPaint { shared_ptr windowHandle = [(EAGLView*)self.view windowHandle]; shared_ptr paintEvent(new PaintEvent(windowHandle->drawer().get())); - m_framework->Paint(paintEvent); + m_framework->DoPaint(paintEvent); } - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation diff --git a/map/benchmark_framework.cpp b/map/benchmark_framework.cpp index 67ecc3f582..0b95f31d0b 100644 --- a/map/benchmark_framework.cpp +++ b/map/benchmark_framework.cpp @@ -293,10 +293,10 @@ void BenchmarkFramework::OnSize(int w, int h) } template -void BenchmarkFramework::Paint(shared_ptr e) +void BenchmarkFramework::DoPaint(shared_ptr e) { double s = m_benchmarksTimer.ElapsedSeconds(); - Framework::Paint(e); + Framework::DoPaint(e); m_paintDuration += m_benchmarksTimer.ElapsedSeconds() - s; if (!m_isBenchmarkFinished) BenchmarkCommandFinished(); diff --git a/map/benchmark_framework.hpp b/map/benchmark_framework.hpp index 643ea4d748..ad652bb9c7 100644 --- a/map/benchmark_framework.hpp +++ b/map/benchmark_framework.hpp @@ -71,5 +71,5 @@ public: void OnSize(int w, int h); - virtual void Paint(shared_ptr e); + virtual void DoPaint(shared_ptr e); }; diff --git a/map/framework.cpp b/map/framework.cpp index 7aba4d346e..938ee5d1e0 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -323,9 +323,21 @@ void Framework::DrawModel(shared_ptr const & e, Invalidate(); } +template +void Framework::BeginPaint() +{ + m_renderPolicy->BeginFrame(); +} + +template +void Framework::EndPaint() +{ + m_renderPolicy->EndFrame(); +} + /// Function for calling from platform dependent-paint function. template -void Framework::Paint(shared_ptr e) +void Framework::DoPaint(shared_ptr e) { DrawerYG * pDrawer = e->drawer(); diff --git a/map/framework.hpp b/map/framework.hpp index f3455e5d04..0b2f8c0ffb 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -207,8 +207,11 @@ public: double GetCurrentScale() const; + virtual void BeginPaint(); /// Function for calling from platform dependent-paint function. - virtual void Paint(shared_ptr e); + virtual void DoPaint(shared_ptr e); + + virtual void EndPaint(); void CenterViewport(m2::PointD const & pt); diff --git a/map/render_policy.cpp b/map/render_policy.cpp index beeec2d701..beb25fc573 100644 --- a/map/render_policy.cpp +++ b/map/render_policy.cpp @@ -69,3 +69,9 @@ void RenderPolicy::StopScale(m2::PointD const &, m2::PointD const &, double) { m_windowHandle->invalidate(); } + +void RenderPolicy::BeginFrame() +{} + +void RenderPolicy::EndFrame() +{} diff --git a/map/render_policy.hpp b/map/render_policy.hpp index 27169c2846..59d20ce3a9 100644 --- a/map/render_policy.hpp +++ b/map/render_policy.hpp @@ -47,8 +47,12 @@ public: /// constructor RenderPolicy(shared_ptr const & windowHandle, TRenderFn const & renderFn); virtual ~RenderPolicy() {} + /// starting frame + virtual void BeginFrame(); /// drawing single frame virtual void DrawFrame(shared_ptr const & paintEvent, ScreenBase const & currentScreen) = 0; + /// ending frame + virtual void EndFrame(); /// processing resize request virtual m2::RectI const OnSize(int w, int h); /// initialize render policy diff --git a/map/render_policy_mt.cpp b/map/render_policy_mt.cpp index e52f0e1cfb..0a02dc617f 100644 --- a/map/render_policy_mt.cpp +++ b/map/render_policy_mt.cpp @@ -43,6 +43,16 @@ m2::RectI const RenderPolicyMT::OnSize(int w, int h) return m2::RectI(pt.x, pt.y, pt.x + w, pt.y + h); } +void RenderPolicyMT::BeginFrame() +{ + m_renderQueue.renderState().m_mutex->Lock(); +} + +void RenderPolicyMT::EndFrame() +{ + m_renderQueue.renderState().m_mutex->Unlock(); +} + void RenderPolicyMT::DrawFrame(shared_ptr const & e, ScreenBase const & s) { @@ -51,25 +61,21 @@ void RenderPolicyMT::DrawFrame(shared_ptr const & e, DrawerYG * pDrawer = e->drawer(); + e->drawer()->screen()->clear(bgColor()); + + if (m_renderQueue.renderState().m_actualTarget.get() != 0) { - threads::MutexGuard g(*m_renderQueue.renderState().m_mutex.get()); - - e->drawer()->screen()->clear(bgColor()); - - if (m_renderQueue.renderState().m_actualTarget.get() != 0) - { - m2::PointD ptShift = m_renderQueue.renderState().coordSystemShift(false); + m2::PointD ptShift = m_renderQueue.renderState().coordSystemShift(false); // OGLCHECK(glMatrixMode(GL_MODELVIEW)); // OGLCHECK(glPushMatrix()); // OGLCHECK(glTranslatef(-ptShift.x, -ptShift.y, 0)); - math::Matrix m = m_renderQueue.renderState().m_actualScreen.PtoGMatrix() * s.GtoPMatrix(); - m = math::Shift(m, -ptShift); + math::Matrix m = m_renderQueue.renderState().m_actualScreen.PtoGMatrix() * s.GtoPMatrix(); + m = math::Shift(m, -ptShift); - pDrawer->screen()->blit(m_renderQueue.renderState().m_actualTarget, - m); - } + pDrawer->screen()->blit(m_renderQueue.renderState().m_actualTarget, + m); } } diff --git a/map/render_policy_mt.hpp b/map/render_policy_mt.hpp index ba3f23ef27..e34ee2bb4f 100644 --- a/map/render_policy_mt.hpp +++ b/map/render_policy_mt.hpp @@ -20,9 +20,13 @@ public: void Initialize(shared_ptr const & rc, shared_ptr const & rm); + void BeginFrame(); + void DrawFrame(shared_ptr const & paintEvent, ScreenBase const & screenBase); + void EndFrame(); + m2::RectI const OnSize(int w, int h); void StartDrag(m2::PointD const & pt, double timeInSec); diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index a549a2d6c3..d1a11ba5ba 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -171,8 +171,10 @@ namespace qt void DrawWidget::DoDraw(shared_ptr p) { + m_framework->BeginPaint(); shared_ptr paintEvent(new PaintEvent(p.get())); - m_framework->Paint(paintEvent); + m_framework->DoPaint(paintEvent); + m_framework->EndPaint(); } void DrawWidget::DoResize(int w, int h)