Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorExMix <rahuba.youri@mapswithme.com>2015-02-08 19:33:22 +0300
committerr.kuznetsov <r.kuznetsov@corp.mail.ru>2015-11-30 16:04:02 +0300
commit4520ae129f44865974191cdaf9d5c57628c6ee16 (patch)
treed1a0660091823e258b883edbb4559302644444a7 /drape/stipple_pen_resource.cpp
parent5befdce1ec1c90e0824be29a023acae10d698245 (diff)
[drape] move upload dynamic resource into renderer thread to avoid ogl driver synchronization bug on Lenovo k900
Diffstat (limited to 'drape/stipple_pen_resource.cpp')
-rw-r--r--drape/stipple_pen_resource.cpp34
1 files changed, 22 insertions, 12 deletions
diff --git a/drape/stipple_pen_resource.cpp b/drape/stipple_pen_resource.cpp
index dd41e0b637..c2540aa084 100644
--- a/drape/stipple_pen_resource.cpp
+++ b/drape/stipple_pen_resource.cpp
@@ -138,16 +138,22 @@ void StipplePenRasterizator::Rasterize(void * buffer)
memcpy(pixels + COLUMN_WIDTH, pixels, COLUMN_WIDTH);
}
-RefPointer<Texture::ResourceInfo> StipplePenIndex::MapResource(StipplePenKey const & key)
+RefPointer<Texture::ResourceInfo> StipplePenIndex::MapResource(StipplePenKey const & key, bool & newResource)
{
+ newResource = false;
StipplePenHandle handle(key);
TResourceMapping::iterator it = m_resourceMapping.find(handle);
if (it != m_resourceMapping.end())
return MakeStackRefPointer<Texture::ResourceInfo>(&it->second);
+ newResource = true;
+
StipplePenRasterizator resource(key);
m2::RectU pixelRect = m_packer.PackResource(resource.GetSize());
- m_pendingNodes.push_back(make_pair(pixelRect, resource));
+ {
+ threads::MutexGuard g(m_lock);
+ m_pendingNodes.push_back(make_pair(pixelRect, resource));
+ }
auto res = m_resourceMapping.emplace(handle, StipplePenResourceInfo(m_packer.MapTextureCoords(pixelRect),
resource.GetSize(),
@@ -162,18 +168,24 @@ void StipplePenIndex::UploadResources(RefPointer<Texture> texture)
if (m_pendingNodes.empty())
return;
+ TPendingNodes pendingNodes;
+ {
+ threads::MutexGuard g(m_lock);
+ m_pendingNodes.swap(pendingNodes);
+ }
+
buffer_vector<uint32_t, 5> ranges;
ranges.push_back(0);
- uint32_t xOffset = m_pendingNodes[0].first.minX();
- for (size_t i = 1; i < m_pendingNodes.size(); ++i)
+ uint32_t xOffset = pendingNodes[0].first.minX();
+ for (size_t i = 1; i < pendingNodes.size(); ++i)
{
- m2::RectU & node = m_pendingNodes[i].first;
+ m2::RectU & node = pendingNodes[i].first;
#ifdef DEBUG
ASSERT(xOffset <= node.minX(), ());
if (xOffset == node.minX())
{
- m2::RectU const & prevNode = m_pendingNodes[i - 1].first;
+ m2::RectU const & prevNode = pendingNodes[i - 1].first;
ASSERT(prevNode.minY() < node.minY(), ());
}
#endif
@@ -182,7 +194,7 @@ void StipplePenIndex::UploadResources(RefPointer<Texture> texture)
xOffset = node.minX();
}
- ranges.push_back(m_pendingNodes.size());
+ ranges.push_back(pendingNodes.size());
SharedBufferManager & mng = SharedBufferManager::instance();
for (size_t i = 1; i < ranges.size(); ++i)
@@ -199,17 +211,17 @@ void StipplePenIndex::UploadResources(RefPointer<Texture> texture)
uint8_t * rawBuffer = SharedBufferManager::GetRawPointer(ptr);
memset(rawBuffer, 0, reserveBufferSize);
- m2::RectU const & startNode = m_pendingNodes[rangeStart].first;
+ m2::RectU const & startNode = pendingNodes[rangeStart].first;
uint32_t minX = startNode.minX();
uint32_t minY = startNode.minY();
#ifdef DEBUG
- m2::RectU const & endNode = m_pendingNodes[rangeEnd - 1].first;
+ m2::RectU const & endNode = pendingNodes[rangeEnd - 1].first;
ASSERT(endNode.maxY() == (minY + lineCount), ());
#endif
for (size_t r = rangeStart; r < rangeEnd; ++r)
{
- m_pendingNodes[r].second.Rasterize(rawBuffer);
+ pendingNodes[r].second.Rasterize(rawBuffer);
rawBuffer += 2 * COLUMN_WIDTH;
}
@@ -219,8 +231,6 @@ void StipplePenIndex::UploadResources(RefPointer<Texture> texture)
mng.freeSharedBuffer(reserveBufferSize, ptr);
}
-
- m_pendingNodes.clear();
}
glConst StipplePenIndex::GetMinFilter() const