diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-11-21 13:03:31 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-12-01 08:57:11 -0800 |
commit | 54c557d982c92caefd53a68e2f72bba822101c2c (patch) | |
tree | 09f97a8afea5c4bd92238ab196722006214c8a3b | |
parent | b1068b432ee17c14ea756b7c48be4c955303de95 (diff) | |
download | qtlocation-mapboxgl-54c557d982c92caefd53a68e2f72bba822101c2c.tar.gz |
[core] Use indexed rendering everywhere
-rw-r--r-- | src/mbgl/gl/context.cpp | 17 | ||||
-rw-r--r-- | src/mbgl/gl/program.hpp | 26 | ||||
-rw-r--r-- | src/mbgl/gl/segment.hpp | 7 | ||||
-rw-r--r-- | src/mbgl/renderer/debug_bucket.cpp | 48 | ||||
-rw-r--r-- | src/mbgl/renderer/debug_bucket.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 56 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.hpp | 11 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_background.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_clipping.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_debug.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_raster.cpp | 3 |
11 files changed, 83 insertions, 110 deletions
diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 4c469d7f67..e4cc5e0fe3 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<GLenum>(primitiveType), - static_cast<GLsizei>(segment.indexLength), - GL_UNSIGNED_SHORT, - reinterpret_cast<GLvoid*>(sizeof(uint16_t) * segment.indexOffset))); - } else { - MBGL_CHECK_ERROR(glDrawArrays( - static_cast<GLenum>(primitiveType), - static_cast<GLint>(segment.vertexOffset), - static_cast<GLsizei>(segment.vertexLength))); - } + MBGL_CHECK_ERROR(glDrawElements( + static_cast<GLenum>(primitiveType), + static_cast<GLsizei>(segment.indexLength), + GL_UNSIGNED_SHORT, + reinterpret_cast<GLvoid*>(sizeof(uint16_t) * segment.indexOffset))); } } diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/gl/program.hpp index 01fa51e788..33387e9d4e 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 <class DrawMode> void draw(Context& context, DrawMode drawMode, @@ -58,31 +57,6 @@ public: }); } - // Unindexed drawing. - template <class DrawMode> - void draw(Context& context, - DrawMode drawMode, - DepthMode depthMode, - StencilMode stencilMode, - ColorMode colorMode, - UniformValues&& uniformValues, - const VertexBuffer<Vertex, DrawMode>& vertexBuffer, - const SegmentVector<Attributes>& segments) { - static_assert(std::is_same<Primitive, typename DrawMode::Primitive>::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 0a735ababf..8f74afd237 100644 --- a/src/mbgl/gl/segment.hpp +++ b/src/mbgl/gl/segment.hpp @@ -33,13 +33,6 @@ template <class Attributes> class SegmentVector : public std::vector<Segment> { public: SegmentVector() = default; - - // This constructor is for unindexed rendering. It creates a SegmentVector with a - // single segment having 0 indexes. - template <class DrawMode> - SegmentVector(const VertexBuffer<typename Attributes::Vertex, DrawMode>& 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 deceec6ab7..ef5e4f8d0f 100644 --- a/src/mbgl/renderer/debug_bucket.cpp +++ b/src/mbgl/renderer/debug_bucket.cpp @@ -10,14 +10,21 @@ namespace mbgl { -gl::VertexVector<FillVertex, gl::Lines> -buildTextVertices(const OverscaledTileID& id, - const bool renderable, - const bool complete, - optional<Timestamp> modified, - optional<Timestamp> expires, - MapDebugOptions debugMode) { - gl::VertexVector<FillVertex, gl::Lines> textLines; +DebugBucket::DebugBucket(const OverscaledTileID& id, + const bool renderable_, + const bool complete_, + optional<Timestamp> modified_, + optional<Timestamp> expires_, + MapDebugOptions debugMode_, + gl::Context& context) + : renderable(renderable_), + complete(complete_), + modified(std::move(modified_)), + expires(std::move(expires_)), + debugMode(debugMode_) { + + gl::VertexVector<FillVertex> vertices; + gl::IndexVector<gl::Lines> 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<Timestamp> modified_, - optional<Timestamp> 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 96703d87d0..4676381789 100644 --- a/src/mbgl/renderer/debug_bucket.hpp +++ b/src/mbgl/renderer/debug_bucket.hpp @@ -6,6 +6,7 @@ #include <mbgl/util/optional.hpp> #include <mbgl/util/noncopyable.hpp> #include <mbgl/gl/vertex_buffer.hpp> +#include <mbgl/gl/index_buffer.hpp> #include <mbgl/programs/debug_program.hpp> namespace mbgl { @@ -32,8 +33,9 @@ public: const optional<Timestamp> expires; const MapDebugOptions debugMode; - gl::VertexBuffer<DebugVertex, gl::Lines> vertexBuffer; gl::SegmentVector<DebugAttributes> segments; + optional<gl::VertexBuffer<DebugVertex>> vertexBuffer; + optional<gl::IndexBuffer<gl::Lines>> indexBuffer; }; } // namespace mbgl diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index be160187be..5894912ef3 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<FillVertex, gl::Triangles> tileTriangles() { - gl::VertexVector<FillVertex, gl::Triangles> 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 })); +static gl::VertexVector<FillVertex> tileVertices() { + gl::VertexVector<FillVertex> result; + result.emplace_back(FillAttributes::vertex({ 0, 0 })); + result.emplace_back(FillAttributes::vertex({ util::EXTENT, 0 })); + result.emplace_back(FillAttributes::vertex({ 0, util::EXTENT })); + result.emplace_back(FillAttributes::vertex({ util::EXTENT, util::EXTENT })); return result; } -static gl::VertexVector<FillVertex, gl::LineStrip> tileLineStrip() { - gl::VertexVector<FillVertex, gl::LineStrip> 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 })); +static gl::IndexVector<gl::Triangles> tileTriangleIndices() { + gl::IndexVector<gl::Triangles> result; + result.emplace_back(0, 1, 2); + result.emplace_back(1, 2, 3); return result; } -static gl::VertexVector<RasterVertex, gl::TriangleStrip> rasterTriangleStrip() { - gl::VertexVector<RasterVertex, gl::TriangleStrip> result; +static gl::IndexVector<gl::LineStrip> tileLineStripIndices() { + gl::IndexVector<gl::LineStrip> 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<RasterVertex> rasterVertices() { + gl::VertexVector<RasterVertex> 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<RasterVertex, gl::TriangleStrip> 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 6d402b027b..dec7fa57fd 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -158,13 +158,14 @@ private: std::unique_ptr<Programs> overdrawPrograms; #endif - gl::VertexBuffer<FillVertex, gl::Triangles> tileTriangleVertexBuffer; - gl::SegmentVector<FillAttributes> tileTriangleSegments; + gl::VertexBuffer<FillVertex> tileVertexBuffer; + gl::VertexBuffer<RasterVertex> rasterVertexBuffer; - gl::VertexBuffer<DebugVertex, gl::LineStrip> tileBorderVertexBuffer; - gl::SegmentVector<DebugAttributes> tileBorderSegments; + gl::IndexBuffer<gl::Triangles> tileTriangleIndexBuffer; + gl::IndexBuffer<gl::LineStrip> tileBorderIndexBuffer; - gl::VertexBuffer<RasterVertex, gl::TriangleStrip> rasterVertexBuffer; + gl::SegmentVector<FillAttributes> tileTriangleSegments; + gl::SegmentVector<DebugAttributes> tileBorderSegments; gl::SegmentVector<RasterAttributes> rasterSegments; }; diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index acf327a5d4..4a3e41701d 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<BackgroundColor>() }, 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 2b876667c9..a2529561fe 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 d0fb9f3435..2b838dec0e 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 950d37abf2..96bb6dc565 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<float, 2> {{ 0.0f, 0.0f }} }, }, rasterVertexBuffer, + tileTriangleIndexBuffer, rasterSegments ); } |