From 54c557d982c92caefd53a68e2f72bba822101c2c Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 21 Nov 2016 13:03:31 -0800 Subject: [PATCH] [core] Use indexed rendering everywhere --- src/mbgl/gl/context.cpp | 17 ++----- src/mbgl/gl/program.hpp | 26 ----------- src/mbgl/gl/segment.hpp | 7 --- src/mbgl/renderer/debug_bucket.cpp | 48 +++++++++----------- src/mbgl/renderer/debug_bucket.hpp | 4 +- src/mbgl/renderer/painter.cpp | 58 +++++++++++++----------- src/mbgl/renderer/painter.hpp | 11 +++-- src/mbgl/renderer/painter_background.cpp | 6 ++- src/mbgl/renderer/painter_clipping.cpp | 3 +- src/mbgl/renderer/painter_debug.cpp | 12 +++-- src/mbgl/renderer/painter_raster.cpp | 3 +- 11 files changed, 84 insertions(+), 111 deletions(-) diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 4c469d7f6..e4cc5e0fe 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -518,18 +518,11 @@ void Context::draw(const Drawable& drawable) { drawable.bindAttributes(segment.vertexOffset); } - if (drawable.indexBuffer) { - MBGL_CHECK_ERROR(glDrawElements( - static_cast(primitiveType), - static_cast(segment.indexLength), - GL_UNSIGNED_SHORT, - reinterpret_cast(sizeof(uint16_t) * segment.indexOffset))); - } else { - MBGL_CHECK_ERROR(glDrawArrays( - static_cast(primitiveType), - static_cast(segment.vertexOffset), - static_cast(segment.vertexLength))); - } + MBGL_CHECK_ERROR(glDrawElements( + static_cast(primitiveType), + static_cast(segment.indexLength), + GL_UNSIGNED_SHORT, + reinterpret_cast(sizeof(uint16_t) * segment.indexOffset))); } } diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/gl/program.hpp index 01fa51e78..33387e9d4 100644 --- a/src/mbgl/gl/program.hpp +++ b/src/mbgl/gl/program.hpp @@ -32,7 +32,6 @@ public: attributesState(Attributes::state(program)), uniformsState((context.linkProgram(program), Uniforms::state(program))) {} - // Indexed drawing. template void draw(Context& context, DrawMode drawMode, @@ -58,31 +57,6 @@ public: }); } - // Unindexed drawing. - template - void draw(Context& context, - DrawMode drawMode, - DepthMode depthMode, - StencilMode stencilMode, - ColorMode colorMode, - UniformValues&& uniformValues, - const VertexBuffer& vertexBuffer, - const SegmentVector& segments) { - static_assert(std::is_same::value, "incompatible draw mode"); - context.draw({ - std::move(drawMode), - std::move(depthMode), - std::move(stencilMode), - std::move(colorMode), - program, - vertexBuffer.buffer, - 0, - segments, - Uniforms::binder(uniformsState, std::move(uniformValues)), - Attributes::binder(attributesState) - }); - } - private: UniqueShader vertexShader; UniqueShader fragmentShader; diff --git a/src/mbgl/gl/segment.hpp b/src/mbgl/gl/segment.hpp index 0a735abab..8f74afd23 100644 --- a/src/mbgl/gl/segment.hpp +++ b/src/mbgl/gl/segment.hpp @@ -33,13 +33,6 @@ 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 diff --git a/src/mbgl/renderer/debug_bucket.cpp b/src/mbgl/renderer/debug_bucket.cpp index deceec6ab..ef5e4f8d0 100644 --- a/src/mbgl/renderer/debug_bucket.cpp +++ b/src/mbgl/renderer/debug_bucket.cpp @@ -10,14 +10,21 @@ namespace mbgl { -gl::VertexVector -buildTextVertices(const OverscaledTileID& id, - const bool renderable, - const bool complete, - optional modified, - optional expires, - MapDebugOptions debugMode) { - gl::VertexVector textLines; +DebugBucket::DebugBucket(const OverscaledTileID& id, + const bool renderable_, + const bool complete_, + optional modified_, + optional expires_, + MapDebugOptions debugMode_, + gl::Context& context) + : renderable(renderable_), + complete(complete_), + modified(std::move(modified_)), + expires(std::move(expires_)), + debugMode(debugMode_) { + + gl::VertexVector vertices; + gl::IndexVector indices; auto addText = [&] (const std::string& text, double left, double baseline, double scale) { for (uint8_t c : text) { @@ -36,9 +43,11 @@ buildTextVertices(const OverscaledTileID& id, int16_t(::round(baseline - glyph.data[j + 1] * scale)) }; + vertices.emplace_back(FillAttributes::vertex(p)); + if (prev) { - textLines.emplace_back(FillAttributes::vertex(*prev), - FillAttributes::vertex(p)); + indices.emplace_back(vertices.vertexSize() - 1, + vertices.vertexSize()); } prev = p; @@ -65,23 +74,10 @@ buildTextVertices(const OverscaledTileID& id, addText(expiresText, 50, baseline + 200, 5); } - return textLines; -} + segments.emplace_back(0, 0, vertices.vertexSize(), indices.indexSize()); -DebugBucket::DebugBucket(const OverscaledTileID& id, - const bool renderable_, - const bool complete_, - optional modified_, - optional expires_, - MapDebugOptions debugMode_, - gl::Context& context) - : renderable(renderable_), - complete(complete_), - modified(std::move(modified_)), - expires(std::move(expires_)), - debugMode(debugMode_), - vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))), - segments(vertexBuffer) { + vertexBuffer = context.createVertexBuffer(std::move(vertices)); + indexBuffer = context.createIndexBuffer(std::move(indices)); } } // namespace mbgl diff --git a/src/mbgl/renderer/debug_bucket.hpp b/src/mbgl/renderer/debug_bucket.hpp index 96703d87d..467638178 100644 --- a/src/mbgl/renderer/debug_bucket.hpp +++ b/src/mbgl/renderer/debug_bucket.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include namespace mbgl { @@ -32,8 +33,9 @@ public: const optional expires; const MapDebugOptions debugMode; - gl::VertexBuffer vertexBuffer; gl::SegmentVector segments; + optional> vertexBuffer; + optional> indexBuffer; }; } // namespace mbgl diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index be160187b..5894912ef 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -42,31 +42,34 @@ namespace mbgl { using namespace style; -static gl::VertexVector tileTriangles() { - gl::VertexVector result; - result.emplace_back( - FillAttributes::vertex({ 0, 0 }), - FillAttributes::vertex({ util::EXTENT, 0 }), - FillAttributes::vertex({ 0, util::EXTENT })); - result.emplace_back( - FillAttributes::vertex({ util::EXTENT, 0 }), - FillAttributes::vertex({ 0, util::EXTENT }), - FillAttributes::vertex({ util::EXTENT, util::EXTENT })); - return result; -} - -static gl::VertexVector tileLineStrip() { - gl::VertexVector result; - result.emplace_back(FillAttributes::vertex({ 0, 0 })); +static gl::VertexVector tileVertices() { + gl::VertexVector result; + result.emplace_back(FillAttributes::vertex({ 0, 0 })); result.emplace_back(FillAttributes::vertex({ util::EXTENT, 0 })); - result.emplace_back(FillAttributes::vertex({ util::EXTENT, util::EXTENT })); result.emplace_back(FillAttributes::vertex({ 0, util::EXTENT })); - result.emplace_back(FillAttributes::vertex({ 0, 0 })); + result.emplace_back(FillAttributes::vertex({ util::EXTENT, util::EXTENT })); return result; } -static gl::VertexVector rasterTriangleStrip() { - gl::VertexVector result; +static gl::IndexVector tileTriangleIndices() { + gl::IndexVector result; + result.emplace_back(0, 1, 2); + result.emplace_back(1, 2, 3); + return result; +} + +static gl::IndexVector tileLineStripIndices() { + gl::IndexVector result; + result.emplace_back(0); + result.emplace_back(1); + result.emplace_back(3); + result.emplace_back(2); + result.emplace_back(0); + return result; +} + +static gl::VertexVector rasterVertices() { + gl::VertexVector result; result.emplace_back(RasterProgram::vertex({ 0, 0 }, { 0, 0 })); result.emplace_back(RasterProgram::vertex({ util::EXTENT, 0 }, { 32767, 0 })); result.emplace_back(RasterProgram::vertex({ 0, util::EXTENT }, { 0, 32767 })); @@ -77,12 +80,15 @@ static gl::VertexVector rasterTriangleStrip() { Painter::Painter(gl::Context& context_, const TransformState& state_, float pixelRatio) : context(context_), state(state_), - tileTriangleVertexBuffer(context.createVertexBuffer(tileTriangles())), - tileTriangleSegments(tileTriangleVertexBuffer), - tileBorderVertexBuffer(context.createVertexBuffer(tileLineStrip())), - tileBorderSegments(tileBorderVertexBuffer), - rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())), - rasterSegments(rasterVertexBuffer) { + tileVertexBuffer(context.createVertexBuffer(tileVertices())), + rasterVertexBuffer(context.createVertexBuffer(rasterVertices())), + tileTriangleIndexBuffer(context.createIndexBuffer(tileTriangleIndices())), + tileBorderIndexBuffer(context.createIndexBuffer(tileLineStripIndices())) { + + tileTriangleSegments.emplace_back(0, 0, 4, 6); + tileBorderSegments.emplace_back(0, 0, 4, 5); + rasterSegments.emplace_back(0, 0, 4, 6); + #ifndef NDEBUG gl::debugging::enable(); #endif diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 6d402b027..dec7fa57f 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -158,13 +158,14 @@ private: std::unique_ptr overdrawPrograms; #endif - gl::VertexBuffer tileTriangleVertexBuffer; + gl::VertexBuffer tileVertexBuffer; + gl::VertexBuffer rasterVertexBuffer; + + gl::IndexBuffer tileTriangleIndexBuffer; + gl::IndexBuffer tileBorderIndexBuffer; + gl::SegmentVector tileTriangleSegments; - - gl::VertexBuffer tileBorderVertexBuffer; gl::SegmentVector tileBorderSegments; - - gl::VertexBuffer rasterVertexBuffer; gl::SegmentVector rasterSegments; }; diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index acf327a5d..4a3e41701 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, + tileVertexBuffer, + tileTriangleIndexBuffer, tileTriangleSegments ); } @@ -63,7 +64,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye uniforms::u_outline_color::Value{ properties.get() }, uniforms::u_world::Value{ context.viewport.getCurrentValue().size }, }, - tileTriangleVertexBuffer, + tileVertexBuffer, + tileTriangleIndexBuffer, tileTriangleSegments ); } diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp index 2b876667c..a2529561f 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, + tileVertexBuffer, + tileTriangleIndexBuffer, tileTriangleSegments ); } diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp index d0fb9f343..2b838dec0 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, const auto& segments, auto drawMode) { + auto draw = [&] (Color color, const auto& vertexBuffer, const auto& indexBuffer, const auto& segments, auto drawMode) { programs->debug.draw( context, drawMode, @@ -30,6 +30,7 @@ void Painter::renderTileDebug(const RenderTile& renderTile) { uniforms::u_color::Value{ color } }, vertexBuffer, + indexBuffer, segments ); }; @@ -47,19 +48,22 @@ void Painter::renderTileDebug(const RenderTile& renderTile) { } draw(Color::white(), - tile.debugBucket->vertexBuffer, + *tile.debugBucket->vertexBuffer, + *tile.debugBucket->indexBuffer, tile.debugBucket->segments, gl::Lines { 4.0f * frame.pixelRatio }); draw(Color::black(), - tile.debugBucket->vertexBuffer, + *tile.debugBucket->vertexBuffer, + *tile.debugBucket->indexBuffer, tile.debugBucket->segments, gl::Lines { 2.0f * frame.pixelRatio }); } if (frame.debugOptions & MapDebugOptions::TileBorders) { draw(Color::red(), - tileBorderVertexBuffer, + tileVertexBuffer, + tileBorderIndexBuffer, tileBorderSegments, gl::LineStrip { 4.0f * frame.pixelRatio }); } diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp index 950d37abf..96bb6dc56 100644 --- a/src/mbgl/renderer/painter_raster.cpp +++ b/src/mbgl/renderer/painter_raster.cpp @@ -56,7 +56,7 @@ void Painter::renderRaster(PaintParameters& parameters, parameters.programs.raster.draw( context, - gl::TriangleStrip(), + gl::Triangles(), depthModeForSublayer(0, gl::DepthMode::ReadOnly), gl::StencilMode::disabled(), colorModeForRenderPass(), @@ -76,6 +76,7 @@ void Painter::renderRaster(PaintParameters& parameters, uniforms::u_tl_parent::Value{ std::array {{ 0.0f, 0.0f }} }, }, rasterVertexBuffer, + tileTriangleIndexBuffer, rasterSegments ); }