diff options
author | ExMix <rahuba.youri@mapswithme.com> | 2015-02-08 19:33:22 +0300 |
---|---|---|
committer | r.kuznetsov <r.kuznetsov@corp.mail.ru> | 2015-11-30 16:04:02 +0300 |
commit | 4520ae129f44865974191cdaf9d5c57628c6ee16 (patch) | |
tree | d1a0660091823e258b883edbb4559302644444a7 /drape/stipple_pen_resource.cpp | |
parent | 5befdce1ec1c90e0824be29a023acae10d698245 (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.cpp | 34 |
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 |