summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-07-22 00:45:03 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-07-22 12:23:39 +0300
commite582a329ef0150616b0d0e1d7c8f44bd31d92f26 (patch)
tree4e386f7438cf1d80df149634ee32e956e4f63f1f /src/mbgl/renderer
parent11bfe2398111dbca232b744db9b50119e7d3c495 (diff)
downloadqtlocation-mapboxgl-e582a329ef0150616b0d0e1d7c8f44bd31d92f26.tar.gz
[core] SymbolBacket creates collision buffers optionally
sizeof(SymbolBucket) : 1024 -> 704
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.cpp24
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.hpp16
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp16
3 files changed, 34 insertions, 22 deletions
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp
index cd9fb08d34..83efb232c2 100644
--- a/src/mbgl/renderer/buckets/symbol_bucket.cpp
+++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp
@@ -111,28 +111,28 @@ void SymbolBucket::upload(gfx::UploadPass& uploadPass) {
if (hasCollisionBoxData()) {
if (!staticUploaded) {
- collisionBox.indexBuffer = uploadPass.createIndexBuffer(std::move(collisionBox.lines));
- collisionBox.vertexBuffer = uploadPass.createVertexBuffer(std::move(collisionBox.vertices));
+ collisionBox->indexBuffer = uploadPass.createIndexBuffer(std::move(collisionBox->lines));
+ collisionBox->vertexBuffer = uploadPass.createVertexBuffer(std::move(collisionBox->vertices));
}
if (!placementChangesUploaded) {
- if (!collisionBox.dynamicVertexBuffer) {
- collisionBox.dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(collisionBox.dynamicVertices), gfx::BufferUsageType::StreamDraw);
+ if (!collisionBox->dynamicVertexBuffer) {
+ collisionBox->dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(collisionBox->dynamicVertices), gfx::BufferUsageType::StreamDraw);
} else {
- uploadPass.updateVertexBuffer(*collisionBox.dynamicVertexBuffer, std::move(collisionBox.dynamicVertices));
+ uploadPass.updateVertexBuffer(*collisionBox->dynamicVertexBuffer, std::move(collisionBox->dynamicVertices));
}
}
}
if (hasCollisionCircleData()) {
if (!staticUploaded) {
- collisionCircle.indexBuffer = uploadPass.createIndexBuffer(std::move(collisionCircle.triangles));
- collisionCircle.vertexBuffer = uploadPass.createVertexBuffer(std::move(collisionCircle.vertices));
+ collisionCircle->indexBuffer = uploadPass.createIndexBuffer(std::move(collisionCircle->triangles));
+ collisionCircle->vertexBuffer = uploadPass.createVertexBuffer(std::move(collisionCircle->vertices));
}
if (!placementChangesUploaded) {
- if (!collisionCircle.dynamicVertexBuffer) {
- collisionCircle.dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(collisionCircle.dynamicVertices), gfx::BufferUsageType::StreamDraw);
+ if (!collisionCircle->dynamicVertexBuffer) {
+ collisionCircle->dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(collisionCircle->dynamicVertices), gfx::BufferUsageType::StreamDraw);
} else {
- uploadPass.updateVertexBuffer(*collisionCircle.dynamicVertexBuffer, std::move(collisionCircle.dynamicVertices));
+ uploadPass.updateVertexBuffer(*collisionCircle->dynamicVertexBuffer, std::move(collisionCircle->dynamicVertices));
}
}
}
@@ -157,11 +157,11 @@ bool SymbolBucket::hasIconData() const {
}
bool SymbolBucket::hasCollisionBoxData() const {
- return !collisionBox.segments.empty();
+ return collisionBox && !collisionBox->segments.empty();
}
bool SymbolBucket::hasCollisionCircleData() const {
- return !collisionCircle.segments.empty();
+ return collisionCircle && !collisionCircle->segments.empty();
}
void addPlacedSymbol(gfx::IndexVector<gfx::Triangles>& triangles, const PlacedSymbol& placedSymbol) {
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp
index 1c975e93e8..7876937b1e 100644
--- a/src/mbgl/renderer/buckets/symbol_bucket.hpp
+++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp
@@ -129,12 +129,24 @@ public:
struct CollisionBoxBuffer : public CollisionBuffer {
gfx::IndexVector<gfx::Lines> lines;
optional<gfx::IndexBuffer> indexBuffer;
- } collisionBox;
+ };
+ std::unique_ptr<CollisionBoxBuffer> collisionBox;
+
+ CollisionBoxBuffer& getOrCreateCollisionBox() {
+ if (!collisionBox) collisionBox = std::make_unique<CollisionBoxBuffer>();
+ return *collisionBox;
+ }
struct CollisionCircleBuffer : public CollisionBuffer {
gfx::IndexVector<gfx::Triangles> triangles;
optional<gfx::IndexBuffer> indexBuffer;
- } collisionCircle;
+ };
+ std::unique_ptr<CollisionCircleBuffer> collisionCircle;
+
+ CollisionCircleBuffer& getOrCreateCollisionCircleBuffer() {
+ if (!collisionCircle) collisionCircle = std::make_unique<CollisionCircleBuffer>();
+ return *collisionCircle;
+ }
const float tilePixelRatio;
uint32_t bucketInstanceId;
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp
index 8c3bae383f..4dddd57009 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp
@@ -405,10 +405,10 @@ void RenderSymbolLayer::render(PaintParameters& parameters) {
uniforms::extrude_scale::Value( extrudeScale ),
uniforms::camera_to_center_distance::Value( parameters.state.getCameraToCenterDistance() )
},
- *bucket.collisionBox.vertexBuffer,
- *bucket.collisionBox.dynamicVertexBuffer,
- *bucket.collisionBox.indexBuffer,
- bucket.collisionBox.segments,
+ *bucket.collisionBox->vertexBuffer,
+ *bucket.collisionBox->dynamicVertexBuffer,
+ *bucket.collisionBox->indexBuffer,
+ bucket.collisionBox->segments,
paintAttributeData,
properties,
CollisionBoxProgram::TextureBindings{},
@@ -443,10 +443,10 @@ void RenderSymbolLayer::render(PaintParameters& parameters) {
uniforms::overscale_factor::Value( float(tile.getOverscaledTileID().overscaleFactor()) ),
uniforms::camera_to_center_distance::Value( parameters.state.getCameraToCenterDistance() )
},
- *bucket.collisionCircle.vertexBuffer,
- *bucket.collisionCircle.dynamicVertexBuffer,
- *bucket.collisionCircle.indexBuffer,
- bucket.collisionCircle.segments,
+ *bucket.collisionCircle->vertexBuffer,
+ *bucket.collisionCircle->dynamicVertexBuffer,
+ *bucket.collisionCircle->indexBuffer,
+ bucket.collisionCircle->segments,
paintAttributeData,
properties,
CollisionCircleProgram::TextureBindings{},