diff options
author | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2016-02-09 14:50:55 +0300 |
---|---|---|
committer | Sergey Yershov <yershov@corp.mail.ru> | 2016-03-23 16:20:44 +0300 |
commit | a865fa79611c2f4d929d6206083ccd96905e6b53 (patch) | |
tree | 4b37020638094d4b683c0a7e83b40ed9e12460ac /drape | |
parent | 9da161eafae46b5d4b0b6cf2ba34aba81865174b (diff) |
Separate buckets using for shared features.
Diffstat (limited to 'drape')
-rw-r--r-- | drape/batcher.cpp | 11 | ||||
-rw-r--r-- | drape/batcher.hpp | 21 | ||||
-rw-r--r-- | drape/render_bucket.cpp | 2 | ||||
-rw-r--r-- | drape/render_bucket.hpp | 1 |
4 files changed, 28 insertions, 7 deletions
diff --git a/drape/batcher.cpp b/drape/batcher.cpp index b407e3f076..c8f9b5ac31 100644 --- a/drape/batcher.cpp +++ b/drape/batcher.cpp @@ -205,7 +205,7 @@ void Batcher::ChangeBuffer(ref_ptr<CallbacksWrapper> wrapper) ref_ptr<RenderBucket> Batcher::GetBucket(GLState const & state) { - TBuckets::iterator it = m_buckets.find(state); + TBuckets::iterator it = m_buckets.find(BucketId(state, m_currentFeature.IsValid())); if (it != m_buckets.end()) return make_ref(it->second); @@ -215,17 +215,18 @@ ref_ptr<RenderBucket> Batcher::GetBucket(GLState const & state) if (m_currentFeature.IsValid()) result->StartFeatureRecord(m_currentFeature, m_featureLimitRect); - m_buckets.emplace(state, move(buffer)); + m_buckets.emplace(BucketId(state, m_currentFeature.IsValid()), move(buffer)); return result; } void Batcher::FinalizeBucket(GLState const & state) { - TBuckets::iterator it = m_buckets.find(state); + BucketId bucketId(state, m_currentFeature.IsValid()); + TBuckets::iterator it = m_buckets.find(bucketId); ASSERT(it != m_buckets.end(), ("Have no bucket for finalize with given state")); drape_ptr<RenderBucket> bucket = move(it->second); - m_buckets.erase(state); + m_buckets.erase(bucketId); if (m_currentFeature.IsValid()) bucket->EndFeatureRecord(false); @@ -242,7 +243,7 @@ void Batcher::Flush() if (m_currentFeature.IsValid()) bucket.second->EndFeatureRecord(true); bucket.second->GetBuffer()->Preflush(); - m_flushInterface(bucket.first, move(bucket.second)); + m_flushInterface(bucket.first.m_state, move(bucket.second)); }); m_buckets.clear(); diff --git a/drape/batcher.hpp b/drape/batcher.hpp index 81a5142d0c..3c71dc7002 100644 --- a/drape/batcher.hpp +++ b/drape/batcher.hpp @@ -69,7 +69,26 @@ private: TFlushFn m_flushInterface; private: - using TBuckets = map<GLState, drape_ptr<RenderBucket>>; + struct BucketId + { + BucketId() = default; + BucketId(GLState const & state, bool sharedFeatures) + : m_state(state) + , m_sharedFeatures(sharedFeatures) + {} + + bool operator < (BucketId const & other) const + { + if (m_state == other.m_state) + return m_sharedFeatures < other.m_sharedFeatures; + return m_state < other.m_state; + } + + GLState m_state; + bool m_sharedFeatures; + }; + + using TBuckets = map<BucketId, drape_ptr<RenderBucket>>; TBuckets m_buckets; uint32_t m_indexBufferSize; diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index a17905eb69..830b9dc0c5 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -125,7 +125,7 @@ void RenderBucket::AddFeaturesInfo(RenderBucket const & bucket) bool RenderBucket::IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting) { - ASSERT(!m_featuresGeometryInfo.empty(), ()); + ASSERT(IsShared(), ()); for (auto const & featureRange : m_featuresGeometryInfo) if (isFeaturesWaiting(featureRange.second.m_limitRect)) return true; diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index 6ac231603e..c66e51be72 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -49,6 +49,7 @@ public: todo(make_ref(h)); } + bool IsShared() const { return !m_featuresGeometryInfo.empty(); } void StartFeatureRecord(FeatureGeometryId feature, m2::RectD const & limitRect); void EndFeatureRecord(bool featureCompleted); |