summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-04-11 17:28:06 +0300
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2019-04-11 17:28:06 +0300
commit3ca18c05b6548fb89ee7ba4a26c3f4c8d5dd173c (patch)
tree96b61f5bb37cdc2681ab4371db401e68607e4c02
parentb5f9df84669e4431abdd494314b1ced4d8176b7c (diff)
downloadqtlocation-mapboxgl-3ca18c05b6548fb89ee7ba4a26c3f4c8d5dd173c.tar.gz
[core] WIP, make draw scopes shared_ptr
-rw-r--r--src/mbgl/programs/collision_box_program.hpp12
-rw-r--r--src/mbgl/programs/program.hpp6
-rw-r--r--src/mbgl/programs/segment.hpp5
-rw-r--r--src/mbgl/programs/symbol_program.hpp12
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp9
5 files changed, 21 insertions, 23 deletions
diff --git a/src/mbgl/programs/collision_box_program.hpp b/src/mbgl/programs/collision_box_program.hpp
index 1677be1250..89f1380c14 100644
--- a/src/mbgl/programs/collision_box_program.hpp
+++ b/src/mbgl/programs/collision_box_program.hpp
@@ -83,10 +83,10 @@ public:
assert(layoutVertexBuffer.elements == dynamicVertexBuffer.elements);
for (auto& segment : segments) {
- auto drawScopeIt = segment.drawScopes.find(layerID);
+ auto drawScopeIt = segment.drawScopes->find(layerID);
- if (drawScopeIt == segment.drawScopes.end()) {
- drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first;
+ if (drawScopeIt == segment.drawScopes->end()) {
+ drawScopeIt = segment.drawScopes->emplace(layerID, context.createDrawScope()).first;
}
program->draw(
@@ -167,10 +167,10 @@ public:
.concat(paintPropertyBinders.attributeBindings(currentProperties));
for (auto& segment : segments) {
- auto drawScopeIt = segment.drawScopes.find(layerID);
+ auto drawScopeIt = segment.drawScopes->find(layerID);
- if (drawScopeIt == segment.drawScopes.end()) {
- drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first;
+ if (drawScopeIt == segment.drawScopes->end()) {
+ drawScopeIt = segment.drawScopes->emplace(layerID, context.createDrawScope()).first;
}
program->draw(
diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp
index cb68735bf8..ab9abebb0b 100644
--- a/src/mbgl/programs/program.hpp
+++ b/src/mbgl/programs/program.hpp
@@ -90,10 +90,10 @@ public:
}
for (auto& segment : segments) {
- auto drawScopeIt = segment.drawScopes.find(layerID);
+ auto drawScopeIt = segment.drawScopes->find(layerID);
- if (drawScopeIt == segment.drawScopes.end()) {
- drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first;
+ if (drawScopeIt == segment.drawScopes->end()) {
+ drawScopeIt = segment.drawScopes->emplace(layerID, context.createDrawScope()).first;
}
program->draw(
diff --git a/src/mbgl/programs/segment.hpp b/src/mbgl/programs/segment.hpp
index 98628507c2..7264d89028 100644
--- a/src/mbgl/programs/segment.hpp
+++ b/src/mbgl/programs/segment.hpp
@@ -20,10 +20,9 @@ public:
indexOffset(indexOffset_),
vertexLength(vertexLength_),
indexLength(indexLength_),
+ drawScopes(std::make_shared<std::map<std::string, gfx::DrawScope>>()),
sortKey(sortKey_) {}
- Segment(Segment&&) = default;
-
const std::size_t vertexOffset;
const std::size_t indexOffset;
@@ -37,7 +36,7 @@ public:
// data-driven paint properties
// * when two fill layers have the same layout properties, but one
// uses fill-color and the other uses fill-pattern
- mutable std::map<std::string, gfx::DrawScope> drawScopes;
+ mutable std::shared_ptr<std::map<std::string, gfx::DrawScope>> drawScopes;
unsigned int sortKey;
};
diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp
index 980ca253b9..6d584ecc5a 100644
--- a/src/mbgl/programs/symbol_program.hpp
+++ b/src/mbgl/programs/symbol_program.hpp
@@ -298,7 +298,7 @@ public:
return allAttributeBindings.activeCount();
}
- template <class DrawMode, class SegmentsContainer>
+ template <class DrawMode>
void draw(gfx::Context& context,
gfx::RenderPass& renderPass,
const DrawMode& drawMode,
@@ -307,7 +307,7 @@ public:
const gfx::ColorMode& colorMode,
const gfx::CullFaceMode& cullFaceMode,
const gfx::IndexBuffer& indexBuffer,
- const SegmentsContainer& segments,
+ const SegmentVector<AttributeList>& segments,
const UniformValues& uniformValues,
const AttributeBindings& allAttributeBindings,
const TextureBindings& textureBindings,
@@ -318,11 +318,11 @@ public:
return;
}
- for (const Segment<AttributeList>& segment : segments) {
- auto drawScopeIt = segment.drawScopes.find(layerID);
+ for (const auto& segment : segments) {
+ auto drawScopeIt = segment.drawScopes->find(layerID);
- if (drawScopeIt == segment.drawScopes.end()) {
- drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first;
+ if (drawScopeIt == segment.drawScopes->end()) {
+ drawScopeIt = segment.drawScopes->emplace(layerID, context.createDrawScope()).first;
}
program->draw(
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp
index 90f09b4d15..a44bc3a109 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp
@@ -36,9 +36,8 @@ Point<float> calculateVariableRenderShift(style::SymbolAnchorType anchor, float
}
struct RenderableSegment {
- using SegmentRefVector = std::vector<std::reference_wrapper<const Segment<SymbolTextAttributes>>>;
- SegmentRefVector segments;
- std::function<void(const SegmentRefVector&)> drawSegments;
+ SegmentVector<SymbolTextAttributes> segments;
+ std::function<void(const SegmentVector<SymbolTextAttributes>&)> drawSegments;
unsigned int sortKey;
};
@@ -241,7 +240,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
if (sortFeaturesByKey) {
for (const auto& segment : bucket.icon.segments) {
- renderableSegments.push_back({{std::cref(segment)}, renderIcon, segment.sortKey});
+ renderableSegments.push_back({{segment}, renderIcon, segment.sortKey});
}
} else {
renderIcon(bucket.icon.segments);
@@ -371,7 +370,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
if (sortFeaturesByKey) {
for (const auto& segment : bucket.text.segments) {
- renderableSegments.push_back({{std::cref(segment)}, renderText, segment.sortKey});
+ renderableSegments.push_back({{segment}, renderText, segment.sortKey});
}
} else {
renderText(bucket.text.segments);