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
path: root/drape
diff options
context:
space:
mode:
authorDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-02-09 14:50:55 +0300
committerSergey Yershov <yershov@corp.mail.ru>2016-03-23 16:20:44 +0300
commita865fa79611c2f4d929d6206083ccd96905e6b53 (patch)
tree4b37020638094d4b683c0a7e83b40ed9e12460ac /drape
parent9da161eafae46b5d4b0b6cf2ba34aba81865174b (diff)
Separate buckets using for shared features.
Diffstat (limited to 'drape')
-rw-r--r--drape/batcher.cpp11
-rw-r--r--drape/batcher.hpp21
-rw-r--r--drape/render_bucket.cpp2
-rw-r--r--drape/render_bucket.hpp1
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);