fixed access violation while destruction of CoverageGenerator. removed some duplicate code.

This commit is contained in:
rachytski 2012-04-16 23:52:42 +04:00 committed by Alex Zolotarev
parent 3b9252b881
commit 9026f45d91
6 changed files with 44 additions and 22 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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;

View file

@ -87,6 +87,8 @@ public:
ScreenCoverage & CurrentCoverage();
void SetSequenceID(int sequenceID);
threads::Mutex & Mutex();
shared_ptr<yg::ResourceManager> const & resourceManager() const;

View file

@ -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;

View file

@ -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
));
}