diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-07-22 00:45:03 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-07-22 12:23:39 +0300 |
commit | e582a329ef0150616b0d0e1d7c8f44bd31d92f26 (patch) | |
tree | 4e386f7438cf1d80df149634ee32e956e4f63f1f /src/mbgl/renderer | |
parent | 11bfe2398111dbca232b744db9b50119e7d3c495 (diff) | |
download | qtlocation-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.cpp | 24 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/symbol_bucket.hpp | 16 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 16 |
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{}, |