forked from organicmaps/organicmaps
fixed access violation while destruction of CoverageGenerator. removed some duplicate code.
This commit is contained in:
parent
3b9252b881
commit
9026f45d91
6 changed files with 44 additions and 22 deletions
|
@ -1,5 +1,7 @@
|
|||
#include "basic_tiling_render_policy.hpp"
|
||||
|
||||
#include "../platform/platform.hpp"
|
||||
|
||||
#include "../indexer/scales.hpp"
|
||||
|
||||
#include "tile_renderer.hpp"
|
||||
|
@ -9,14 +11,14 @@
|
|||
|
||||
BasicTilingRenderPolicy::BasicTilingRenderPolicy(shared_ptr<yg::gl::RenderContext> const & primaryRC,
|
||||
bool doSupportRotation,
|
||||
size_t idCacheSize,
|
||||
shared_ptr<QueuedRenderer> const & queuedRenderer)
|
||||
: RenderPolicy(primaryRC, doSupportRotation, idCacheSize),
|
||||
m_QueuedRenderer(queuedRenderer),
|
||||
bool doUseQueuedRenderer)
|
||||
: RenderPolicy(primaryRC, doSupportRotation, GetPlatform().CpuCores()),
|
||||
m_DrawScale(0),
|
||||
m_IsEmptyModel(false),
|
||||
m_DoRecreateCoverage(false)
|
||||
{
|
||||
if (doUseQueuedRenderer)
|
||||
m_QueuedRenderer.reset(new QueuedRenderer(GetPlatform().CpuCores() + 1));
|
||||
}
|
||||
|
||||
void BasicTilingRenderPolicy::BeginFrame(shared_ptr<PaintEvent> const & e, ScreenBase const & s)
|
||||
|
|
|
@ -38,8 +38,7 @@ public:
|
|||
|
||||
BasicTilingRenderPolicy(shared_ptr<yg::gl::RenderContext> const & primaryRC,
|
||||
bool doSupportRotation,
|
||||
size_t idCacheSize,
|
||||
shared_ptr<QueuedRenderer> const & queuedRenderer = shared_ptr<QueuedRenderer>());
|
||||
bool doUseQueuedRenderer);
|
||||
|
||||
void BeginFrame(shared_ptr<PaintEvent> const & ev, ScreenBase const & s);
|
||||
void DrawFrame(shared_ptr<PaintEvent> const & ev, ScreenBase const & s);
|
||||
|
|
|
@ -110,6 +110,9 @@ void CoverageGenerator::InvalidateTiles(m2::AnyRectD const & r, int startScale)
|
|||
{
|
||||
/// this automatically will skip the previous CoverScreen commands
|
||||
/// and MergeTiles commands from previously generated ScreenCoverages
|
||||
if (m_sequenceID == numeric_limits<int>::max())
|
||||
return;
|
||||
|
||||
++m_sequenceID;
|
||||
m_queue.AddCommand(bind(&CoverageGenerator::InvalidateTilesImpl, this, r, startScale));
|
||||
}
|
||||
|
@ -119,6 +122,9 @@ void CoverageGenerator::AddCoverScreenTask(ScreenBase const & screen, bool doFor
|
|||
if ((screen == m_currentScreen) && (!doForce))
|
||||
return;
|
||||
|
||||
if (m_sequenceID == numeric_limits<int>::max())
|
||||
return;
|
||||
|
||||
m_currentScreen = screen;
|
||||
|
||||
++m_sequenceID;
|
||||
|
@ -242,6 +248,11 @@ threads::Mutex & CoverageGenerator::Mutex()
|
|||
return m_mutex;
|
||||
}
|
||||
|
||||
void CoverageGenerator::SetSequenceID(int sequenceID)
|
||||
{
|
||||
m_sequenceID = sequenceID;
|
||||
}
|
||||
|
||||
shared_ptr<yg::ResourceManager> const & CoverageGenerator::resourceManager() const
|
||||
{
|
||||
return m_resourceManager;
|
||||
|
|
|
@ -87,6 +87,8 @@ public:
|
|||
|
||||
ScreenCoverage & CurrentCoverage();
|
||||
|
||||
void SetSequenceID(int sequenceID);
|
||||
|
||||
threads::Mutex & Mutex();
|
||||
|
||||
shared_ptr<yg::ResourceManager> const & resourceManager() const;
|
||||
|
|
|
@ -14,7 +14,7 @@ TilingRenderPolicyMT::TilingRenderPolicyMT(VideoTimer * videoTimer,
|
|||
shared_ptr<yg::gl::RenderContext> const & primaryRC)
|
||||
: BasicTilingRenderPolicy(primaryRC,
|
||||
false,
|
||||
GetPlatform().CpuCores())
|
||||
false)
|
||||
{
|
||||
yg::ResourceManager::Params rmp = rmParams;
|
||||
|
||||
|
|
|
@ -15,9 +15,10 @@ TilingRenderPolicyST::TilingRenderPolicyST(VideoTimer * videoTimer,
|
|||
shared_ptr<yg::gl::RenderContext> const & primaryRC)
|
||||
: BasicTilingRenderPolicy(primaryRC,
|
||||
false,
|
||||
GetPlatform().CpuCores(),
|
||||
make_shared_ptr(new QueuedRenderer(GetPlatform().CpuCores() + 1)))
|
||||
true)
|
||||
{
|
||||
int cpuCores = GetPlatform().CpuCores();
|
||||
|
||||
yg::ResourceManager::Params rmp = rmParams;
|
||||
|
||||
rmp.checkDeviceCaps();
|
||||
|
@ -106,8 +107,8 @@ TilingRenderPolicyST::TilingRenderPolicyST(VideoTimer * videoTimer,
|
|||
false,
|
||||
false);
|
||||
|
||||
/* bool * debuggingFlags = new bool[GetPlatform().CpuCores() + 2];
|
||||
for (unsigned i = 0; i < GetPlatform().CpuCores() + 2; ++i)
|
||||
/* bool * debuggingFlags = new bool[cpuCores + 2];
|
||||
for (unsigned i = 0; i < cpuCores + 2; ++i)
|
||||
debuggingFlags[i] = false;
|
||||
|
||||
debuggingFlags[0] = true;*/
|
||||
|
@ -116,8 +117,8 @@ TilingRenderPolicyST::TilingRenderPolicyST(VideoTimer * videoTimer,
|
|||
"fonts_whitelist.txt",
|
||||
"fonts_blacklist.txt",
|
||||
2 * 1024 * 1024,
|
||||
GetPlatform().CpuCores() + 2,
|
||||
GetPlatform().CpuCores(),
|
||||
cpuCores + 2,
|
||||
cpuCores,
|
||||
0);
|
||||
|
||||
// delete [] debuggingFlags;
|
||||
|
@ -161,16 +162,24 @@ TilingRenderPolicyST::~TilingRenderPolicyST()
|
|||
LOG(LINFO, ("cancelling ResourceManager"));
|
||||
m_resourceManager->cancel();
|
||||
|
||||
int cpuCores = GetPlatform().CpuCores();
|
||||
|
||||
LOG(LINFO, ("deleting TilingRenderPolicyST"));
|
||||
|
||||
m_QueuedRenderer->CancelQueuedCommands(GetPlatform().CpuCores());
|
||||
m_QueuedRenderer->PrepareQueueCancellation(cpuCores);
|
||||
|
||||
/// now we should process all commands to collect them into queues
|
||||
m_CoverageGenerator->SetSequenceID(numeric_limits<int>::max());
|
||||
m_CoverageGenerator->WaitForEmptyAndFinished();
|
||||
|
||||
m_QueuedRenderer->CancelQueuedCommands(cpuCores);
|
||||
|
||||
LOG(LINFO, ("reseting coverageGenerator"));
|
||||
m_CoverageGenerator.reset();
|
||||
|
||||
/// firstly stop all rendering commands in progress and collect all commands into queues
|
||||
|
||||
for (unsigned i = 0; i < GetPlatform().CpuCores(); ++i)
|
||||
for (unsigned i = 0; i < cpuCores; ++i)
|
||||
m_QueuedRenderer->PrepareQueueCancellation(i);
|
||||
|
||||
m_TileRenderer->ClearCommands();
|
||||
|
@ -180,7 +189,7 @@ TilingRenderPolicyST::~TilingRenderPolicyST()
|
|||
|
||||
/// now we should cancel all collected commands
|
||||
|
||||
for (unsigned i = 0; i < GetPlatform().CpuCores(); ++i)
|
||||
for (unsigned i = 0; i < cpuCores; ++i)
|
||||
m_QueuedRenderer->CancelQueuedCommands(i);
|
||||
|
||||
LOG(LINFO, ("reseting tileRenderer"));
|
||||
|
@ -190,13 +199,14 @@ TilingRenderPolicyST::~TilingRenderPolicyST()
|
|||
|
||||
void TilingRenderPolicyST::SetRenderFn(TRenderFn renderFn)
|
||||
{
|
||||
yg::gl::PacketsQueue ** queues = new yg::gl::PacketsQueue*[GetPlatform().CpuCores()];
|
||||
int cpuCores = GetPlatform().CpuCores();
|
||||
yg::gl::PacketsQueue ** queues = new yg::gl::PacketsQueue*[cpuCores];
|
||||
|
||||
for (unsigned i = 0; i < GetPlatform().CpuCores(); ++i)
|
||||
for (unsigned i = 0; i < cpuCores; ++i)
|
||||
queues[i] = m_QueuedRenderer->GetPacketsQueue(i);
|
||||
|
||||
m_TileRenderer.reset(new TileRenderer(GetPlatform().SkinName(),
|
||||
GetPlatform().CpuCores(),
|
||||
cpuCores,
|
||||
m_bgColor,
|
||||
renderFn,
|
||||
m_primaryRC,
|
||||
|
@ -210,10 +220,8 @@ void TilingRenderPolicyST::SetRenderFn(TRenderFn renderFn)
|
|||
m_windowHandle,
|
||||
m_primaryRC,
|
||||
m_resourceManager,
|
||||
m_QueuedRenderer->GetPacketsQueue(GetPlatform().CpuCores()),
|
||||
m_QueuedRenderer->GetPacketsQueue(cpuCores),
|
||||
m_emptyModelFn
|
||||
));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue