From 377d0fb0d20fa4129d867f0e8762ce208ccee14d Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 14 Nov 2016 11:57:02 -0800 Subject: [PATCH] [core] Introduce SegmentVector --- src/mbgl/gl/program.hpp | 7 ++++--- src/mbgl/gl/segment.hpp | 13 +++++++++++++ src/mbgl/programs/circle_program.hpp | 6 ++++-- src/mbgl/programs/collision_box_program.hpp | 10 ++++++---- src/mbgl/programs/debug_program.hpp | 8 ++++++-- src/mbgl/programs/raster_program.hpp | 8 +++++--- src/mbgl/renderer/circle_bucket.hpp | 2 +- src/mbgl/renderer/debug_bucket.cpp | 3 ++- src/mbgl/renderer/debug_bucket.hpp | 5 +++-- src/mbgl/renderer/fill_bucket.hpp | 4 ++-- src/mbgl/renderer/line_bucket.hpp | 2 +- src/mbgl/renderer/painter.cpp | 7 +++++-- src/mbgl/renderer/painter.hpp | 8 +++++++- src/mbgl/renderer/painter_background.cpp | 6 ++++-- src/mbgl/renderer/painter_clipping.cpp | 3 ++- src/mbgl/renderer/painter_debug.cpp | 21 ++++++++++++++++----- src/mbgl/renderer/painter_raster.cpp | 3 ++- src/mbgl/renderer/symbol_bucket.hpp | 6 +++--- 18 files changed, 86 insertions(+), 36 deletions(-) diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/gl/program.hpp index 44c16ae67..01fa51e78 100644 --- a/src/mbgl/gl/program.hpp +++ b/src/mbgl/gl/program.hpp @@ -42,7 +42,7 @@ public: UniformValues&& uniformValues, const VertexBuffer& vertexBuffer, const IndexBuffer& indexBuffer, - const std::vector& segments) { + const SegmentVector& segments) { static_assert(std::is_same::value, "incompatible draw mode"); context.draw({ std::move(drawMode), @@ -66,7 +66,8 @@ public: StencilMode stencilMode, ColorMode colorMode, UniformValues&& uniformValues, - const VertexBuffer& vertexBuffer) { + const VertexBuffer& vertexBuffer, + const SegmentVector& segments) { static_assert(std::is_same::value, "incompatible draw mode"); context.draw({ std::move(drawMode), @@ -76,7 +77,7 @@ public: program, vertexBuffer.buffer, 0, - {{ 0, 0, vertexBuffer.vertexCount, 0 }}, + segments, Uniforms::binder(uniformsState, std::move(uniformValues)), Attributes::binder(attributesState) }); diff --git a/src/mbgl/gl/segment.hpp b/src/mbgl/gl/segment.hpp index f65f2a5f7..283b4f572 100644 --- a/src/mbgl/gl/segment.hpp +++ b/src/mbgl/gl/segment.hpp @@ -23,5 +23,18 @@ public: std::size_t indexLength; }; +template +class SegmentVector : public std::vector { +public: + SegmentVector() = default; + + // This constructor is for unindexed rendering. It creates a SegmentVector with a + // single segment having 0 indexes. + template + SegmentVector(const VertexBuffer& buffer) { + emplace_back(0, 0, buffer.vertexCount, 0); + } +}; + } // namespace gl } // namespace mbgl diff --git a/src/mbgl/programs/circle_program.hpp b/src/mbgl/programs/circle_program.hpp index 75c030b1c..b428937e3 100644 --- a/src/mbgl/programs/circle_program.hpp +++ b/src/mbgl/programs/circle_program.hpp @@ -14,11 +14,13 @@ MBGL_DEFINE_UNIFORM_SCALAR(bool, u_scale_with_map); MBGL_DEFINE_UNIFORM_SCALAR(float, u_devicepixelratio); } // namespace uniforms +using CircleAttributes = gl::Attributes< + attributes::a_pos>; + class CircleProgram : public Program< shaders::circle, gl::Triangle, - gl::Attributes< - attributes::a_pos>, + CircleAttributes, gl::Uniforms< uniforms::u_matrix, uniforms::u_opacity, diff --git a/src/mbgl/programs/collision_box_program.hpp b/src/mbgl/programs/collision_box_program.hpp index 5eda3fefb..26e38419a 100644 --- a/src/mbgl/programs/collision_box_program.hpp +++ b/src/mbgl/programs/collision_box_program.hpp @@ -15,13 +15,15 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, u_scale); MBGL_DEFINE_UNIFORM_SCALAR(float, u_maxzoom); } // namespace uniforms +using CollisionBoxAttributes = gl::Attributes< + attributes::a_pos, + attributes::a_extrude, + attributes::a_data<2>>; + class CollisionBoxProgram : public Program< shaders::collision_box, gl::Line, - gl::Attributes< - attributes::a_pos, - attributes::a_extrude, - attributes::a_data<2>>, + CollisionBoxAttributes, gl::Uniforms< uniforms::u_matrix, uniforms::u_scale, diff --git a/src/mbgl/programs/debug_program.hpp b/src/mbgl/programs/debug_program.hpp index 3596dc1f7..cd4e08b1b 100644 --- a/src/mbgl/programs/debug_program.hpp +++ b/src/mbgl/programs/debug_program.hpp @@ -7,11 +7,13 @@ namespace mbgl { +using DebugAttributes = gl::Attributes< + attributes::a_pos>; + class DebugProgram : public Program< shaders::debug, gl::Line, - gl::Attributes< - attributes::a_pos>, + DebugAttributes, gl::Uniforms< uniforms::u_matrix, uniforms::u_color>> @@ -20,4 +22,6 @@ public: using Program::Program; }; +using DebugVertex = DebugProgram::Vertex; + } // namespace mbgl diff --git a/src/mbgl/programs/raster_program.hpp b/src/mbgl/programs/raster_program.hpp index 1bab2d576..d6179904d 100644 --- a/src/mbgl/programs/raster_program.hpp +++ b/src/mbgl/programs/raster_program.hpp @@ -23,12 +23,14 @@ MBGL_DEFINE_UNIFORM_VECTOR(float, 3, u_spin_weights); MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_tl_parent); } // namespace uniforms +using RasterAttributes = gl::Attributes< + attributes::a_pos, + attributes::a_texture_pos>; + class RasterProgram : public Program< shaders::raster, gl::Triangle, - gl::Attributes< - attributes::a_pos, - attributes::a_texture_pos>, + RasterAttributes, gl::Uniforms< uniforms::u_matrix, uniforms::u_image0, diff --git a/src/mbgl/renderer/circle_bucket.hpp b/src/mbgl/renderer/circle_bucket.hpp index a93b052d6..af7041a23 100644 --- a/src/mbgl/renderer/circle_bucket.hpp +++ b/src/mbgl/renderer/circle_bucket.hpp @@ -22,7 +22,7 @@ public: gl::VertexVector vertices; gl::IndexVector triangles; - std::vector segments; + gl::SegmentVector segments; optional> vertexBuffer; optional> indexBuffer; diff --git a/src/mbgl/renderer/debug_bucket.cpp b/src/mbgl/renderer/debug_bucket.cpp index 4beb16a99..deceec6ab 100644 --- a/src/mbgl/renderer/debug_bucket.cpp +++ b/src/mbgl/renderer/debug_bucket.cpp @@ -80,7 +80,8 @@ DebugBucket::DebugBucket(const OverscaledTileID& id, modified(std::move(modified_)), expires(std::move(expires_)), debugMode(debugMode_), - vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))) { + vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))), + segments(vertexBuffer) { } } // namespace mbgl diff --git a/src/mbgl/renderer/debug_bucket.hpp b/src/mbgl/renderer/debug_bucket.hpp index 4c173786a..96703d87d 100644 --- a/src/mbgl/renderer/debug_bucket.hpp +++ b/src/mbgl/renderer/debug_bucket.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include namespace mbgl { @@ -32,7 +32,8 @@ public: const optional expires; const MapDebugOptions debugMode; - gl::VertexBuffer vertexBuffer; + gl::VertexBuffer vertexBuffer; + gl::SegmentVector segments; }; } // namespace mbgl diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp index 4ea558b62..edb1521c1 100644 --- a/src/mbgl/renderer/fill_bucket.hpp +++ b/src/mbgl/renderer/fill_bucket.hpp @@ -22,8 +22,8 @@ public: gl::VertexVector vertices; gl::IndexVector lines; gl::IndexVector triangles; - std::vector lineSegments; - std::vector triangleSegments; + gl::SegmentVector lineSegments; + gl::SegmentVector triangleSegments; optional> vertexBuffer; optional> lineIndexBuffer; diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp index 9903ca184..ae9d7d7f0 100644 --- a/src/mbgl/renderer/line_bucket.hpp +++ b/src/mbgl/renderer/line_bucket.hpp @@ -28,7 +28,7 @@ public: gl::VertexVector vertices; gl::IndexVector triangles; - std::vector segments; + gl::SegmentVector segments; optional> vertexBuffer; optional> indexBuffer; diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index a09e3b73f..9dee66887 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -77,8 +77,11 @@ Painter::Painter(gl::Context& context_, const TransformState& state_) : context(context_), state(state_), tileTriangleVertexBuffer(context.createVertexBuffer(tileTriangles())), - tileLineStripVertexBuffer(context.createVertexBuffer(tileLineStrip())), - rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())) { + tileTriangleSegments(tileTriangleVertexBuffer), + tileBorderVertexBuffer(context.createVertexBuffer(tileLineStrip())), + tileBorderSegments(tileBorderVertexBuffer), + rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())), + rasterSegments(rasterVertexBuffer) { #ifndef NDEBUG gl::debugging::enable(); #endif diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 3f5f28dad..2aa317f95 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -157,8 +158,13 @@ private: #endif gl::VertexBuffer tileTriangleVertexBuffer; - gl::VertexBuffer tileLineStripVertexBuffer; + gl::SegmentVector tileTriangleSegments; + + gl::VertexBuffer tileBorderVertexBuffer; + gl::SegmentVector tileBorderSegments; + gl::VertexBuffer rasterVertexBuffer; + gl::SegmentVector rasterSegments; }; } // namespace mbgl diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index 5e71cb7b2..4e8782991 100644 --- a/src/mbgl/renderer/painter_background.cpp +++ b/src/mbgl/renderer/painter_background.cpp @@ -44,7 +44,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye tileID, state ), - tileTriangleVertexBuffer + tileTriangleVertexBuffer, + tileTriangleSegments ); } } else { @@ -62,7 +63,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye uniforms::u_outline_color::Value{ properties.backgroundColor.value }, uniforms::u_world::Value{ context.viewport.getCurrentValue().size }, }, - tileTriangleVertexBuffer + tileTriangleVertexBuffer, + tileTriangleSegments ); } } diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp index 205442447..2b876667c 100644 --- a/src/mbgl/renderer/painter_clipping.cpp +++ b/src/mbgl/renderer/painter_clipping.cpp @@ -26,7 +26,8 @@ void Painter::renderClippingMask(const UnwrappedTileID& tileID, const ClipID& cl uniforms::u_outline_color::Value{ Color {} }, uniforms::u_world::Value{ context.viewport.getCurrentValue().size }, }, - tileTriangleVertexBuffer + tileTriangleVertexBuffer, + tileTriangleSegments ); } diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp index 8969354d2..d0fb9f343 100644 --- a/src/mbgl/renderer/painter_debug.cpp +++ b/src/mbgl/renderer/painter_debug.cpp @@ -18,7 +18,7 @@ void Painter::renderTileDebug(const RenderTile& renderTile) { MBGL_DEBUG_GROUP(std::string { "debug " } + util::toString(renderTile.id)); - auto draw = [&] (Color color, const auto& vertexBuffer, auto drawMode) { + auto draw = [&] (Color color, const auto& vertexBuffer, const auto& segments, auto drawMode) { programs->debug.draw( context, drawMode, @@ -29,7 +29,8 @@ void Painter::renderTileDebug(const RenderTile& renderTile) { uniforms::u_matrix::Value{ renderTile.matrix }, uniforms::u_color::Value{ color } }, - vertexBuffer + vertexBuffer, + segments ); }; @@ -45,12 +46,22 @@ void Painter::renderTileDebug(const RenderTile& renderTile) { tile.expires, frame.debugOptions, context); } - draw(Color::white(), tile.debugBucket->vertexBuffer, gl::Lines { 4.0f * frame.pixelRatio }); - draw(Color::black(), tile.debugBucket->vertexBuffer, gl::Lines { 2.0f * frame.pixelRatio }); + draw(Color::white(), + tile.debugBucket->vertexBuffer, + tile.debugBucket->segments, + gl::Lines { 4.0f * frame.pixelRatio }); + + draw(Color::black(), + tile.debugBucket->vertexBuffer, + tile.debugBucket->segments, + gl::Lines { 2.0f * frame.pixelRatio }); } if (frame.debugOptions & MapDebugOptions::TileBorders) { - draw(Color::red(), tileLineStripVertexBuffer, gl::LineStrip { 4.0f * frame.pixelRatio }); + draw(Color::red(), + tileBorderVertexBuffer, + tileBorderSegments, + gl::LineStrip { 4.0f * frame.pixelRatio }); } } diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp index e19cde289..fe2587801 100644 --- a/src/mbgl/renderer/painter_raster.cpp +++ b/src/mbgl/renderer/painter_raster.cpp @@ -75,7 +75,8 @@ void Painter::renderRaster(PaintParameters& parameters, uniforms::u_scale_parent::Value{ 1.0f }, uniforms::u_tl_parent::Value{ std::array {{ 0.0f, 0.0f }} }, }, - rasterVertexBuffer + rasterVertexBuffer, + rasterSegments ); } diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index 327049b28..e5c44d8a3 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -36,7 +36,7 @@ public: struct TextBuffer { gl::VertexVector vertices; gl::IndexVector triangles; - std::vector segments; + gl::SegmentVector segments; optional> vertexBuffer; optional> indexBuffer; @@ -45,7 +45,7 @@ public: struct IconBuffer { gl::VertexVector vertices; gl::IndexVector triangles; - std::vector segments; + gl::SegmentVector segments; optional> vertexBuffer; optional> indexBuffer; @@ -54,7 +54,7 @@ public: struct CollisionBoxBuffer { gl::VertexVector vertices; gl::IndexVector lines; - std::vector segments; + gl::SegmentVector segments; optional> vertexBuffer; optional> indexBuffer;