From 7f862cd8ff0ecdedabf262ece120a9d57e170017 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Thu, 13 Jul 2023 12:45:54 -0700 Subject: [PATCH] Share bucket indices (#1358) Co-authored-by: Stefan Karschti --- include/mbgl/gfx/drawable.hpp | 7 ++- include/mbgl/gfx/drawable_builder.hpp | 4 +- include/mbgl/gfx/drawable_impl.hpp | 2 + include/mbgl/gl/drawable_gl.hpp | 4 +- src/mbgl/gfx/drawable.cpp | 6 +++ src/mbgl/gfx/drawable_builder.cpp | 43 +++++++++--------- src/mbgl/gfx/drawable_builder_impl.hpp | 3 +- src/mbgl/gfx/index_vector.hpp | 31 ++++++++----- src/mbgl/gl/drawable_gl.cpp | 8 ++-- src/mbgl/gl/drawable_gl_builder.cpp | 7 ++- src/mbgl/gl/drawable_gl_impl.hpp | 2 +- src/mbgl/renderer/buckets/circle_bucket.hpp | 7 ++- src/mbgl/renderer/buckets/fill_bucket.hpp | 12 +++-- .../buckets/fill_extrusion_bucket.hpp | 7 ++- src/mbgl/renderer/buckets/heatmap_bucket.hpp | 7 ++- src/mbgl/renderer/buckets/line_bucket.hpp | 7 ++- src/mbgl/renderer/buckets/raster_bucket.hpp | 10 ++++- src/mbgl/renderer/buckets/symbol_bucket.hpp | 5 ++- .../renderer/layers/render_circle_layer.cpp | 2 +- .../layers/render_fill_extrusion_layer.cpp | 6 +-- .../renderer/layers/render_fill_layer.cpp | 10 ++--- .../renderer/layers/render_heatmap_layer.cpp | 6 +-- .../layers/render_hillshade_layer.cpp | 2 +- .../renderer/layers/render_line_layer.cpp | 7 ++- .../renderer/layers/render_raster_layer.cpp | 45 ++++++++++++------- .../renderer/layers/render_symbol_layer.cpp | 3 +- 26 files changed, 159 insertions(+), 94 deletions(-) diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index b457d4d62..985a11937 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -26,11 +26,13 @@ class CullFaceMode; enum class DepthMaskType : bool; class DrawableTweaker; class DrawMode; +class IndexVectorBase; class ShaderProgramBase; class VertexAttributeArray; using DrawPriority = int64_t; using DrawableTweakerPtr = std::shared_ptr; +using IndexVectorBasePtr = std::shared_ptr; using ShaderProgramBasePtr = std::shared_ptr; using Texture2DPtr = std::shared_ptr; @@ -155,8 +157,9 @@ public: /// Incompatible with adding primitives virtual void setVertices(std::vector&&, std::size_t, AttributeDataType) = 0; - /// Create a segment wrapper - virtual void setIndexData(std::vector indexes, std::vector segments) = 0; + /// Provide raw indexes and segments + void setIndexData(std::vector indexes, std::vector); + virtual void setIndexData(gfx::IndexVectorBasePtr, std::vector) = 0; /// Get the tweakers attached to this drawable const std::vector& getTweakers() const { return tweakers; } diff --git a/include/mbgl/gfx/drawable_builder.hpp b/include/mbgl/gfx/drawable_builder.hpp index e260cf735..4a824a810 100644 --- a/include/mbgl/gfx/drawable_builder.hpp +++ b/include/mbgl/gfx/drawable_builder.hpp @@ -14,10 +14,12 @@ class SegmentBase; namespace gfx { class DrawableTweaker; +class IndexVectorBase; class ShaderProgramBase; class VertexAttributeArray; using DrawableTweakerPtr = std::shared_ptr; +using IndexVectorBasePtr = std::shared_ptr; using ShaderProgramBasePtr = std::shared_ptr; using Texture2DPtr = std::shared_ptr; @@ -137,8 +139,8 @@ public: /// Incompatible with adding primitives void setRawVertices(std::vector&&, std::size_t, AttributeDataType); - void setSegments(gfx::DrawMode, std::vector indexes, const std::vector&); void setSegments(gfx::DrawMode, std::vector indexes, const SegmentBase*, std::size_t segmentCount); + void setSegments(gfx::DrawMode, gfx::IndexVectorBasePtr, const SegmentBase*, std::size_t segmentCount); /// Add lines based on existing vertices void addLines(const std::vector& indexes, diff --git a/include/mbgl/gfx/drawable_impl.hpp b/include/mbgl/gfx/drawable_impl.hpp index f3b34961d..c98be4914 100644 --- a/include/mbgl/gfx/drawable_impl.hpp +++ b/include/mbgl/gfx/drawable_impl.hpp @@ -1,6 +1,8 @@ #pragma once +#include #include +#include namespace mbgl { namespace gfx { diff --git a/include/mbgl/gl/drawable_gl.hpp b/include/mbgl/gl/drawable_gl.hpp index 34ca129b7..bf7a97fe5 100644 --- a/include/mbgl/gl/drawable_gl.hpp +++ b/include/mbgl/gl/drawable_gl.hpp @@ -19,7 +19,7 @@ class IndexBuffer; class UploadPass; class VertexBufferResource; -using UniqueVertexBufferResource = std::unique_ptr; +using UniqueVertexBufferResource = std::unique_ptr; } // namespace gfx @@ -36,7 +36,7 @@ public: void draw(PaintParameters&) const override; struct DrawSegmentGL; - void setIndexData(std::vector indexes, std::vector segments) override; + void setIndexData(gfx::IndexVectorBasePtr, std::vector segments) override; void setVertices(std::vector&&, std::size_t, gfx::AttributeDataType) override; diff --git a/src/mbgl/gfx/drawable.cpp b/src/mbgl/gfx/drawable.cpp index 5612affb0..fd9441549 100644 --- a/src/mbgl/gfx/drawable.cpp +++ b/src/mbgl/gfx/drawable.cpp @@ -2,6 +2,8 @@ #include #include +#include +#include #include #include @@ -37,6 +39,10 @@ void Drawable::setCullFaceMode(const gfx::CullFaceMode& value) { impl->cullFaceMode = value; } +void Drawable::setIndexData(std::vector indexes, std::vector segments) { + setIndexData(std::make_shared(std::move(indexes)), std::move(segments)); +} + static const gfx::Texture2DPtr noTexture; const gfx::Texture2DPtr& Drawable::getTexture(int32_t location) const { diff --git a/src/mbgl/gfx/drawable_builder.cpp b/src/mbgl/gfx/drawable_builder.cpp index 606dd4a33..d59ae2bb2 100644 --- a/src/mbgl/gfx/drawable_builder.cpp +++ b/src/mbgl/gfx/drawable_builder.cpp @@ -103,7 +103,8 @@ void DrawableBuilder::addTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1 impl->vertices.emplace_back(Impl::VT({{{x0, y0}}})); impl->vertices.emplace_back(Impl::VT({{{x1, y1}}})); impl->vertices.emplace_back(Impl::VT({{{x2, y2}}})); - impl->indexes.insert(impl->indexes.end(), {n, static_cast(n + 1), static_cast(n + 2)}); + impl->buildIndexes.insert(impl->buildIndexes.end(), + {n, static_cast(n + 1), static_cast(n + 2)}); if (impl->segments.empty()) { impl->segments.emplace_back(createSegment(gfx::Triangles(), {0, 0})); @@ -116,7 +117,8 @@ void DrawableBuilder::addTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1 void DrawableBuilder::appendTriangle(int16_t x0, int16_t y0) { const auto n = (uint16_t)impl->vertices.elements(); impl->vertices.emplace_back(Impl::VT({{{x0, y0}}})); - impl->indexes.insert(impl->indexes.end(), {static_cast(n - 2), static_cast(n - 1), n}); + impl->buildIndexes.insert(impl->buildIndexes.end(), + {static_cast(n - 2), static_cast(n - 1), n}); assert(!impl->segments.empty()); auto& segment = impl->segments.back(); @@ -153,17 +155,18 @@ void DrawableBuilder::setRawVertices(std::vector&& data, std::size_t co impl->rawVerticesType = type; } -void DrawableBuilder::setSegments(gfx::DrawMode mode, - std::vector indexes, - const std::vector& segments) { - setSegments(mode, std::move(indexes), segments.data(), segments.size()); -} - -void DrawableBuilder::setSegments(gfx::DrawMode mode, +void DrawableBuilder::setSegments(const gfx::DrawMode mode, std::vector indexes, const SegmentBase* segments, - std::size_t segmentCount) { - impl->indexes = std::move(indexes); + const std::size_t segmentCount) { + setSegments(mode, std::make_shared(std::move(indexes)), segments, segmentCount); +} + +void DrawableBuilder::setSegments(const gfx::DrawMode mode, + gfx::IndexVectorBasePtr indexes, + const SegmentBase* segments, + const std::size_t segmentCount) { + impl->sharedIndexes = std::move(indexes); for (std::size_t i = 0; i < segmentCount; ++i) { const auto& seg = segments[i]; #if !defined(NDEBUG) @@ -174,10 +177,10 @@ void DrawableBuilder::setSegments(gfx::DrawMode mode, } const auto vertexCount = curVertexCount(); assert(!vertexCount || seg.vertexOffset + seg.vertexLength <= curVertexCount()); - assert(seg.indexOffset + seg.indexLength <= impl->indexes.size()); + assert(seg.indexOffset + seg.indexLength <= impl->sharedIndexes->elements()); if (vertexCount) { for (decltype(seg.indexLength) j = 0; j < seg.indexLength; ++j) { - assert(impl->indexes[seg.indexOffset + j] < vertexCount); + assert(impl->sharedIndexes->vector()[seg.indexOffset + j] < vertexCount); } } #endif @@ -208,13 +211,13 @@ void DrawableBuilder::addLines(const std::vector& indexes, /*.vertexLength = */ 0, /*.indexLength = */ indexLength})); - if (impl->indexes.empty()) { - impl->indexes.reserve(indexLength); + if (impl->buildIndexes.empty()) { + impl->buildIndexes.reserve(indexLength); } for (auto i = std::next(indexes.begin(), indexOffset); i != std::next(indexes.begin(), indexOffset + indexLength); ++i) { - impl->indexes.emplace_back(static_cast(*i + baseIndex)); + impl->buildIndexes.emplace_back(static_cast(*i + baseIndex)); } } @@ -228,17 +231,17 @@ void DrawableBuilder::addTriangles(const std::vector& indexes, impl->segments.emplace_back(createSegment(Triangles(), SegmentBase{/*.vertexOffset = */ 0, - /*.indexOffset = */ impl->indexes.size(), + /*.indexOffset = */ impl->buildIndexes.size(), /*.vertexLength = */ impl->vertices.elements(), /*.indexLength = */ indexLength})); - if (impl->indexes.empty()) { - impl->indexes.reserve(indexLength); + if (impl->buildIndexes.empty()) { + impl->buildIndexes.reserve(indexLength); } for (auto i = std::next(indexes.begin(), indexOffset); i != std::next(indexes.begin(), indexOffset + indexLength); ++i) { - impl->indexes.emplace_back(static_cast(*i + baseIndex)); + impl->buildIndexes.emplace_back(static_cast(*i + baseIndex)); } } diff --git a/src/mbgl/gfx/drawable_builder_impl.hpp b/src/mbgl/gfx/drawable_builder_impl.hpp index 4ab943eb8..7c7e13c81 100644 --- a/src/mbgl/gfx/drawable_builder_impl.hpp +++ b/src/mbgl/gfx/drawable_builder_impl.hpp @@ -19,7 +19,8 @@ struct DrawableBuilder::Impl { std::vector rawVertices; std::size_t rawVerticesCount = 0; - std::vector indexes; + std::vector buildIndexes; + std::shared_ptr sharedIndexes; std::vector> segments; AttributeDataType rawVerticesType = static_cast(-1); diff --git a/src/mbgl/gfx/index_vector.hpp b/src/mbgl/gfx/index_vector.hpp index db922b12d..9d6cdbdc4 100644 --- a/src/mbgl/gfx/index_vector.hpp +++ b/src/mbgl/gfx/index_vector.hpp @@ -8,16 +8,16 @@ namespace mbgl { namespace gfx { -template -class IndexVector { -public: - static constexpr std::size_t groupSize = BufferGroupSizeOf::value; +class IndexVectorBase { +protected: + std::vector v; - template - void emplace_back(Args&&... args) { - static_assert(sizeof...(args) == groupSize, "wrong buffer element count"); - util::ignore({(v.emplace_back(std::forward(args)), 0)...}); - } +public: + using value_type = decltype(v)::value_type; + + IndexVectorBase() = default; + IndexVectorBase(std::vector&& indexes) + : v(std::move(indexes)) {} std::size_t elements() const { return v.size(); } @@ -30,9 +30,18 @@ public: const uint16_t* data() const { return v.data(); } const std::vector& vector() const { return v; } +}; -private: - std::vector v; +template +class IndexVector : public IndexVectorBase { +public: + static constexpr std::size_t groupSize = BufferGroupSizeOf::value; + + template + void emplace_back(Args&&... args) { + static_assert(sizeof...(args) == groupSize, "wrong buffer element count"); + util::ignore({(v.emplace_back(std::forward(args)), 0)...}); + } }; } // namespace gfx diff --git a/src/mbgl/gl/drawable_gl.cpp b/src/mbgl/gl/drawable_gl.cpp index 9e4d5ecb4..85f8198c5 100644 --- a/src/mbgl/gl/drawable_gl.cpp +++ b/src/mbgl/gl/drawable_gl.cpp @@ -72,7 +72,7 @@ void DrawableGL::draw(PaintParameters& parameters) const { unbindUniformBuffers(); } -void DrawableGL::setIndexData(std::vector indexes, std::vector segments) { +void DrawableGL::setIndexData(gfx::IndexVectorBasePtr indexes, std::vector segments) { impl->indexes = std::move(indexes); impl->segments = std::move(segments); } @@ -151,9 +151,9 @@ void DrawableGL::upload(gfx::UploadPass& uploadPass) { auto& glContext = static_cast(context); constexpr auto usage = gfx::BufferUsageType::StaticDraw; - const auto indexBytes = impl->indexes.size() * sizeof(decltype(impl->indexes)::value_type); - auto indexBufferResource = uploadPass.createIndexBufferResource(impl->indexes.data(), indexBytes, usage); - auto indexBuffer = gfx::IndexBuffer{impl->indexes.size(), std::move(indexBufferResource)}; + const auto indexBytes = impl->indexes->elements() * sizeof(gfx::IndexVectorBase::value_type); + auto indexBufferResource = uploadPass.createIndexBufferResource(impl->indexes->data(), indexBytes, usage); + auto indexBuffer = gfx::IndexBuffer{impl->indexes->elements(), std::move(indexBufferResource)}; // Apply drawable values to shader defaults const auto& defaults = shader->getVertexAttributes(); diff --git a/src/mbgl/gl/drawable_gl_builder.cpp b/src/mbgl/gl/drawable_gl_builder.cpp index 0e2327d49..7a6be9509 100644 --- a/src/mbgl/gl/drawable_gl_builder.cpp +++ b/src/mbgl/gl/drawable_gl_builder.cpp @@ -35,9 +35,12 @@ void DrawableGLBuilder::init() { drawableGL.setVertices(std::move(raw), verts.size(), gfx::AttributeDataType::Short2); } - drawableGL.setIndexData(std::move(impl->indexes), std::move(impl->segments)); + if (!impl->sharedIndexes && !impl->buildIndexes.empty()) { + impl->sharedIndexes = std::make_shared(std::move(impl->buildIndexes)); + } + drawableGL.setIndexData(std::move(impl->sharedIndexes), std::move(impl->segments)); - impl->indexes.clear(); + impl->buildIndexes.clear(); impl->segments.clear(); impl->vertices.clear(); } diff --git a/src/mbgl/gl/drawable_gl_impl.hpp b/src/mbgl/gl/drawable_gl_impl.hpp index bffaa4f2a..2caa19d35 100644 --- a/src/mbgl/gl/drawable_gl_impl.hpp +++ b/src/mbgl/gl/drawable_gl_impl.hpp @@ -32,7 +32,7 @@ public: std::vector textures; - std::vector indexes; + gfx::IndexVectorBasePtr indexes; std::vector vertexData; std::size_t vertexCount = 0; diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp index c81ad94da..72b05daa4 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.hpp +++ b/src/mbgl/renderer/buckets/circle_bucket.hpp @@ -31,10 +31,13 @@ public: void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; using VertexVector = gfx::VertexVector; - std::shared_ptr sharedVertices = std::make_shared(); + const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; - gfx::IndexVector triangles; + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& triangles = *sharedTriangles; + SegmentVector segments; #if MLN_LEGACY_RENDERER diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp index 53ee9e59d..0380ad37f 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_bucket.hpp @@ -41,11 +41,17 @@ public: void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; using VertexVector = gfx::VertexVector; - std::shared_ptr sharedVertices = std::make_shared(); + const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; - gfx::IndexVector lines; - gfx::IndexVector triangles; + using LineIndexVector = gfx::IndexVector; + const std::shared_ptr sharedLines = std::make_shared(); + LineIndexVector& lines = *sharedLines; + + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& triangles = *sharedTriangles; + SegmentVector lineSegments; SegmentVector triangleSegments; diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp index 1787d101b..cb1328f15 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp @@ -40,10 +40,13 @@ public: void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; using VertexVector = gfx::VertexVector; - std::shared_ptr sharedVertices = std::make_shared(); + const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; - gfx::IndexVector triangles; + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& triangles = *sharedTriangles; + SegmentVector triangleSegments; #if MLN_LEGACY_RENDERER diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp index 58116fe59..86852ab13 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp @@ -31,10 +31,13 @@ public: float getQueryRadius(const RenderLayer&) const override; using VertexVector = gfx::VertexVector; - std::shared_ptr sharedVertices = std::make_shared(); + const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; - gfx::IndexVector triangles; + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& triangles = *sharedTriangles; + SegmentVector segments; #if MLN_LEGACY_RENDERER diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp index afb4fd089..36ee32589 100644 --- a/src/mbgl/renderer/buckets/line_bucket.hpp +++ b/src/mbgl/renderer/buckets/line_bucket.hpp @@ -43,10 +43,13 @@ public: PossiblyEvaluatedLayoutProperties layout; using VertexVector = gfx::VertexVector; - std::shared_ptr sharedVertices = std::make_shared(); + const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; - gfx::IndexVector triangles; + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& triangles = *sharedTriangles; + SegmentVector segments; #if MLN_LEGACY_RENDERER diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index 8182f2a0d..da218bec3 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -32,8 +32,14 @@ public: // Bucket specific vertices are used for Image Sources only // Raster Tile Sources use the default buffers from Painter - gfx::VertexVector vertices; - gfx::IndexVector indices; + using VertexVector = gfx::VertexVector; + const std::shared_ptr sharedVertices = std::make_shared(); + VertexVector& vertices = *sharedVertices; + + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& indices = *sharedTriangles; + SegmentVector segments; #if MLN_LEGACY_RENDERER diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index b89af94c5..f0d80da20 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -158,7 +158,10 @@ public: OpacityVertexVector& opacityVertices() { return *sharedOpacityVertices; } const OpacityVertexVector& opacityVertices() const { return *sharedOpacityVertices; } - gfx::IndexVector triangles; + using TriangleIndexVector = gfx::IndexVector; + const std::shared_ptr sharedTriangles = std::make_shared(); + TriangleIndexVector& triangles = *sharedTriangles; + SegmentVector segments; std::vector placedSymbols; diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 57bbda051..85d36dfcd 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -403,7 +403,7 @@ void RenderCircleLayer::update(gfx::ShaderRegistry& shaders, circleBuilder->setRawVertices({}, vertexCount, gfx::AttributeDataType::Short2); circleBuilder->setSegments( - gfx::Triangles(), bucket.triangles.vector(), bucket.segments.data(), bucket.segments.size()); + gfx::Triangles(), bucket.sharedTriangles, bucket.segments.data(), bucket.segments.size()); circleBuilder->flush(); diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 80fd14474..b788e43ce 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -458,14 +458,14 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, if (const auto& attr = vertexAttrs.getOrAdd(PosAttribName)) { attr->setSharedRawData(bucket.sharedVertices, offsetof(FillExtrusionLayoutVertex, a1), - 0, + /*vertexOffset=*/0, sizeof(FillExtrusionLayoutVertex), gfx::AttributeDataType::Short2); } if (const auto& attr = vertexAttrs.getOrAdd(NormAttribName)) { attr->setSharedRawData(bucket.sharedVertices, offsetof(FillExtrusionLayoutVertex, a2), - 0, + /*vertexOffset=*/0, sizeof(FillExtrusionLayoutVertex), gfx::AttributeDataType::Short4); } @@ -484,7 +484,7 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, const auto finish = [&](gfx::DrawableBuilder& builder) { builder.setSegments(gfx::Triangles(), - bucket.triangles.vector(), + bucket.sharedTriangles, bucket.triangleSegments.data(), bucket.triangleSegments.size()); diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 53857a6c6..b1c3a74bb 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -420,7 +420,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, if (const auto& attr = vertexAttrs.add(PosAttribName)) { attr->setSharedRawData(bucket.sharedVertices, offsetof(FillLayoutVertex, a1), - 0, + /*vertexOffset=*/0, sizeof(FillLayoutVertex), gfx::AttributeDataType::Short2); } @@ -484,7 +484,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, } fillBuilder->setRawVertices({}, vertexCount, gfx::AttributeDataType::Short2); fillBuilder->setSegments(gfx::Triangles(), - bucket.triangles.vector(), + bucket.sharedTriangles, bucket.triangleSegments.data(), bucket.triangleSegments.size()); finish(*fillBuilder, tileID, interpolateUBO, tileProps); @@ -494,7 +494,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, outlineBuilder->setVertexAttributes(std::move(vertexAttrs)); outlineBuilder->setRawVertices({}, vertexCount, gfx::AttributeDataType::Short2); outlineBuilder->setSegments( - gfx::Lines(2), bucket.lines.vector(), bucket.lineSegments.data(), bucket.lineSegments.size()); + gfx::Lines(2), bucket.sharedLines, bucket.lineSegments.data(), bucket.lineSegments.size()); finish(*outlineBuilder, tileID, interpolateUBO, tileProps); } } else { // FillPattern is defined @@ -565,7 +565,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, } patternBuilder->setRawVertices({}, vertexCount, gfx::AttributeDataType::Short2); patternBuilder->setSegments(gfx::Triangles(), - bucket.triangles.vector(), + bucket.sharedTriangles, bucket.triangleSegments.data(), bucket.triangleSegments.size()); @@ -577,7 +577,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, outlinePatternBuilder->setVertexAttributes(std::move(vertexAttrs)); outlinePatternBuilder->setRawVertices({}, vertexCount, gfx::AttributeDataType::Short2); outlinePatternBuilder->setSegments( - gfx::Lines(2), bucket.lines.vector(), bucket.lineSegments.data(), bucket.lineSegments.size()); + gfx::Lines(2), bucket.sharedLines, bucket.lineSegments.data(), bucket.lineSegments.size()); finish(*outlinePatternBuilder, tileID, interpolateUBO, tileProps); } diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index c5bacff2d..335eb4563 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -391,7 +391,7 @@ void RenderHeatmapLayer::update(gfx::ShaderRegistry& shaders, if (const auto& attr = heatmapVertexAttrs.add(VertexAttribName)) { attr->setSharedRawData(bucket.sharedVertices, offsetof(HeatmapLayoutVertex, a1), - 0, + /*vertexOffset=*/0, sizeof(HeatmapLayoutVertex), gfx::AttributeDataType::Short2); } @@ -406,7 +406,7 @@ void RenderHeatmapLayer::update(gfx::ShaderRegistry& shaders, heatmapBuilder->setVertexAttributes(std::move(heatmapVertexAttrs)); heatmapBuilder->setRawVertices({}, vertexCount, gfx::AttributeDataType::Short2); heatmapBuilder->setSegments( - gfx::Triangles(), bucket.triangles.vector(), bucket.segments.data(), bucket.segments.size()); + gfx::Triangles(), bucket.sharedTriangles, bucket.segments.data(), bucket.segments.size()); heatmapBuilder->flush(); @@ -451,7 +451,7 @@ void RenderHeatmapLayer::update(gfx::ShaderRegistry& shaders, if (const auto& attr = textureVertexAttrs.add(VertexAttribName)) { attr->setSharedRawData(sharedTextureVertices, offsetof(HeatmapLayoutVertex, a1), - 0, + /*vertexOffset=*/0, sizeof(HeatmapLayoutVertex), gfx::AttributeDataType::Short2); } diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index 8e69997c4..c64422a43 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -471,7 +471,7 @@ void RenderHillshadeLayer::update(gfx::ShaderRegistry& shaders, }; drawSegments.emplace_back(hillshadeBuilder->createSegment(gfx::Triangles(), std::move(segCopy))); } - drawable.setIndexData(std::move(indices->vector()), std::move(drawSegments)); + drawable.setIndexData(indices->vector(), std::move(drawSegments)); auto imageLocation = hillshadeShader->getSamplerLocation("u_image"); if (imageLocation.has_value()) { diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index b38d864f2..757018a95 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -485,7 +485,7 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders, if (const auto& attr = vertexAttrs.add(VertexAttribName)) { attr->setSharedRawData(bucket.sharedVertices, offsetof(LineLayoutVertex, a1), - 0, + /*vertexOffset=*/0, sizeof(LineLayoutVertex), gfx::AttributeDataType::Short2); } @@ -493,7 +493,7 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders, if (const auto& attr = vertexAttrs.add(DataAttribName)) { attr->setSharedRawData(bucket.sharedVertices, offsetof(LineLayoutVertex, a2), - 0, + /*vertexOffset=*/0, sizeof(LineLayoutVertex), gfx::AttributeDataType::UByte4); } @@ -502,8 +502,7 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders, }; auto setSegments = [&](std::unique_ptr& builder, const LineBucket& bucket) { - builder->setSegments( - gfx::Triangles(), bucket.triangles.vector(), bucket.segments.data(), bucket.segments.size()); + builder->setSegments(gfx::Triangles(), bucket.sharedTriangles, bucket.segments.data(), bucket.segments.size()); }; for (const RenderTile& tile : *renderTiles) { diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index ea52f2b62..20664eedf 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -299,6 +299,12 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, std::vector& segments) { constexpr const uint16_t vertexLength = 4; + if (vertices.empty()) { + vertices.reserve(mask.size() * vertexLength); + attributes.reserve(mask.size() * vertexLength); + indices.reserve(mask.size() * 6); + segments.reserve(mask.size()); + } // Create the vertex buffer for the specified tile mask. for (const auto& id : mask) { // Create a quad for every masked tile. @@ -334,11 +340,12 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, // 0, 1, 2 // 1, 2, 3 indices.insert(indices.end(), - {offset, static_cast(offset + 1), static_cast(offset + 2u)}); - indices.insert(indices.end(), - {static_cast(offset + 1), - static_cast(offset + 2), - static_cast(offset + 3)}); + {offset, + static_cast(offset + 1u), + static_cast(offset + 2u), + static_cast(offset + 1u), + static_cast(offset + 2u), + static_cast(offset + 3u)}); segment.vertexLength += vertexLength; segment.indexLength += 6; @@ -350,14 +357,15 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, std::vector segments; buildRenderData(bucket.mask, vertices, attributes, indices, segments); builder->addVertices(vertices, 0, vertices.size()); - builder->setSegments(gfx::Triangles(), indices, segments); + builder->setSegments(gfx::Triangles(), indices, segments.data(), segments.size()); // attributes { gfx::VertexAttributeArray vertexAttrs; - if (auto& attr = vertexAttrs.getOrAdd("a_texture_pos")) { + if (const auto& attr = vertexAttrs.getOrAdd("a_texture_pos")) { + attr->reserve(attributes.size()); std::size_t index{0}; - for (auto& a : attributes) { + for (const auto& a : attributes) { attr->set(index++, {a[0], a[1]}); } } @@ -369,18 +377,18 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, }; auto buildImageDrawables = [&setTextures](std::unique_ptr& builder, RasterBucket& bucket) { - std::vector> vertices(bucket.vertices.vector().size()); - std::transform( - bucket.vertices.vector().begin(), bucket.vertices.vector().end(), vertices.begin(), [](const auto& x) { - return x.a1; - }); - builder->addVertices(vertices, 0, vertices.size()); - - builder->setSegments(gfx::Triangles(), bucket.indices.vector(), bucket.segments.data(), bucket.segments.size()); - // attributes { gfx::VertexAttributeArray vertexAttrs; + + if (auto& attr = vertexAttrs.add("a_pos")) { + attr->setSharedRawData(bucket.sharedVertices, + offsetof(RasterLayoutVertex, a1), + /*vertexOffset=*/0, + sizeof(RasterLayoutVertex), + gfx::AttributeDataType::Short2); + } + if (auto& attr = vertexAttrs.getOrAdd("a_texture_pos")) { std::size_t index{0}; for (auto& v : bucket.vertices.vector()) { @@ -390,6 +398,9 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, builder->setVertexAttributes(std::move(vertexAttrs)); } + builder->setRawVertices({}, bucket.vertices.elements(), gfx::AttributeDataType::Short2); + builder->setSegments(gfx::Triangles(), bucket.sharedTriangles, bucket.segments.data(), bucket.segments.size()); + // textures setTextures(builder, bucket); }; diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 081253b00..059bd2940 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -1037,8 +1037,7 @@ void RenderSymbolLayer::update(gfx::ShaderRegistry& shaders, // !partiallyEvaluatedTextSize.isZoomConstant; const auto filterType = linear ? // gfx::TextureFilterType::Linear : gfx::TextureFilterType::Nearest; - auto indexes = buffer.triangles.vector(); - builder->setSegments(gfx::Triangles(), std::move(indexes), &renderable.segment.get(), 1); + builder->setSegments(gfx::Triangles(), buffer.sharedTriangles, &renderable.segment.get(), 1); builder->flush();