From 5c8a3aad61dd6802f84a4e7eb5b42ee01ee645fe Mon Sep 17 00:00:00 2001 From: rachytski Date: Sat, 13 Aug 2011 23:38:57 +0300 Subject: [PATCH] switched back to GUI-thread tile coverage and infoLayer merge calculations in TilingRenderPolicyMT --- map/coverage_generator.cpp | 30 +++++++++++++++---------- map/coverage_generator.hpp | 8 +++++++ map/tiling_render_policy_mt.cpp | 40 +++++++++++++++++---------------- map/tiling_render_policy_mt.hpp | 4 ++-- 4 files changed, 49 insertions(+), 33 deletions(-) diff --git a/map/coverage_generator.cpp b/map/coverage_generator.cpp index 1fb0c839f2..25ff0d8c02 100644 --- a/map/coverage_generator.cpp +++ b/map/coverage_generator.cpp @@ -7,25 +7,33 @@ #include "../std/bind.hpp" +ScreenCoverage::ScreenCoverage() +{} + struct unlock_synchronized { - TileCache * m_cache; - unlock_synchronized(TileCache * cache) : m_cache(cache) + TileCache * m_c; + + unlock_synchronized(TileCache * c) : m_c(c) {} void operator()(Tile const * t) { - m_cache->lock(); - m_cache->unlockTile(t->m_rectInfo); - m_cache->unlock(); + m_c->lock(); + m_c->unlockTile(t->m_rectInfo); + m_c->unlock(); } }; -ScreenCoverage::ScreenCoverage() -{} - void ScreenCoverage::Clear() { + m_tileCache->lock(); + + for (unsigned i = 0; i < m_tiles.size(); ++i) + m_tileCache->unlockTile(m_tiles[i]->m_rectInfo); + + m_tileCache->unlock(); + m_tiles.clear(); m_infoLayer.clear(); } @@ -65,7 +73,6 @@ void CoverageGenerator::CoverageTask::execute(CoverageGenerator * generator) shared_ptr lockedTile = make_shared_ptr(tile, unlock_synchronized(&tileCache)); - generator->m_workCoverage->m_tiles.push_back(lockedTile); generator->m_workCoverage->m_infoLayer.merge(*tile->m_infoLayer.get(), tile->m_tileScreen.PtoGMatrix() * generator->m_workCoverage->m_screen.GtoPMatrix()); @@ -84,9 +91,8 @@ void CoverageGenerator::CoverageTask::execute(CoverageGenerator * generator) } { - threads::MutexGuard g(generator->m_mutex); - LOG(LINFO, ("saving computed coverage into currentCoverage")); - *generator->m_currentCoverage = *generator->m_workCoverage; + threads::MutexGuard g(generator->Mutex()); + swap(generator->m_currentCoverage, generator->m_workCoverage); } } diff --git a/map/coverage_generator.hpp b/map/coverage_generator.hpp index 889dfb2b58..5d0bbf2830 100644 --- a/map/coverage_generator.hpp +++ b/map/coverage_generator.hpp @@ -16,15 +16,23 @@ #include "../std/shared_ptr.hpp" class RenderQueue; +class TileCache; /// holds the tile coverage for a specific screen struct ScreenCoverage { + TileCache * m_tileCache; ScreenBase m_screen; vector > m_tiles; yg::InfoLayer m_infoLayer; + bool m_IsRendering; //< while this flag is set - the object shouldn't + //be altered, 'cause GUI thread is rendering from it + ScreenCoverage(); + + void Merge(Tiler::RectInfo const & rectInfo, Tile const & tile); + void Compute(ScreenBase const & screen); void Clear(); }; diff --git a/map/tiling_render_policy_mt.cpp b/map/tiling_render_policy_mt.cpp index 5872d466c1..efc1754bdb 100644 --- a/map/tiling_render_policy_mt.cpp +++ b/map/tiling_render_policy_mt.cpp @@ -21,12 +21,12 @@ TilingRenderPolicyMT::TilingRenderPolicyMT(shared_ptr const & wind GetPlatform().MaxTilesCount(), GetPlatform().CpuCores(), bgColor()), -// m_tiler(GetPlatform().TileSize(), -// GetPlatform().ScaleEtalonSize()) - m_coverageGenerator(GetPlatform().TileSize(), - GetPlatform().ScaleEtalonSize(), - renderFn, - &m_renderQueue) + m_tiler(GetPlatform().TileSize(), + GetPlatform().ScaleEtalonSize()) +// m_coverageGenerator(GetPlatform().TileSize(), +// GetPlatform().ScaleEtalonSize(), +// renderFn, +// &m_renderQueue) { m_renderQueue.AddWindowHandle(windowHandle); } @@ -36,7 +36,7 @@ void TilingRenderPolicyMT::Initialize(shared_ptr const & { RenderPolicy::Initialize(primaryContext, resourceManager); m_renderQueue.Initialize(primaryContext, resourceManager, GetPlatform().VisualScale()); - m_coverageGenerator.Initialize(); +// m_coverageGenerator.Initialize(); } void TilingRenderPolicyMT::OnSize(int /*w*/, int /*h*/) @@ -48,7 +48,7 @@ void TilingRenderPolicyMT::DrawFrame(shared_ptr const & e, ScreenBas DrawerYG * pDrawer = e->drawer().get(); pDrawer->screen()->clear(bgColor()); - m_coverageGenerator.AddCoverageTask(currentScreen); +/* m_coverageGenerator.AddCoverageTask(currentScreen); ScreenCoverage coverage; @@ -75,8 +75,8 @@ void TilingRenderPolicyMT::DrawFrame(shared_ptr const & e, ScreenBas coverage.m_infoLayer.draw(pDrawer->screen().get(), coverage.m_screen.PtoGMatrix() * currentScreen.GtoPMatrix()); - coverage.Clear(); -/* + coverage.Clear();*/ + m_infoLayer.clear(); m_tiler.seed(currentScreen, @@ -86,13 +86,15 @@ void TilingRenderPolicyMT::DrawFrame(shared_ptr const & e, ScreenBas { Tiler::RectInfo ri = m_tiler.nextTile(); - m_renderQueue.TileCache().lock(); + TileCache & tileCache = m_renderQueue.GetTileCache(); - if (m_renderQueue.TileCache().hasTile(ri)) + tileCache.lock(); + + if (tileCache.hasTile(ri)) { - m_renderQueue.TileCache().touchTile(ri); - Tile tile = m_renderQueue.TileCache().getTile(ri); - m_renderQueue.TileCache().unlock(); + tileCache.touchTile(ri); + Tile tile = tileCache.getTile(ri); + tileCache.unlock(); size_t tileWidth = tile.m_renderTarget->width(); size_t tileHeight = tile.m_renderTarget->height(); @@ -106,11 +108,11 @@ void TilingRenderPolicyMT::DrawFrame(shared_ptr const & e, ScreenBas } else { - m_renderQueue.TileCache().unlock(); - m_renderQueue.AddCommand(renderFn(), ri, m_tiler.seqNum(), bind(&WindowHandle::invalidate, windowHandle())); + tileCache.unlock(); + m_renderQueue.AddCommand(renderFn(), ri, m_tiler.sequenceID(), bind(&WindowHandle::invalidate, windowHandle())); } } - m_infoLayer.draw(pDrawer->screen().get(), - math::Identity());*/ +// m_infoLayer.draw(pDrawer->screen().get(), +// math::Identity()); } diff --git a/map/tiling_render_policy_mt.hpp b/map/tiling_render_policy_mt.hpp index 477b523429..b8b7411e92 100644 --- a/map/tiling_render_policy_mt.hpp +++ b/map/tiling_render_policy_mt.hpp @@ -23,11 +23,11 @@ class TilingRenderPolicyMT : public RenderPolicy private: RenderQueue m_renderQueue; - CoverageGenerator m_coverageGenerator; +// CoverageGenerator m_coverageGenerator; yg::InfoLayer m_infoLayer; -// yg::Tiler m_tiler; + Tiler m_tiler; public: