From 39c4cb09aa3bd05de9c97c9b24be41c2e3d706a5 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 3 Oct 2016 11:48:50 -0700 Subject: [PATCH] [core] Make ElementGroup safer Template on shader types, rather than count. This allows the compiler to enforce using the correct VAO for the shader and PaintMode. This fixes OverdrawMode with circle layers. While here, avoid using unique_ptrs for groups. Instead, ensure ElementGroup is movable. --- cmake/core-files.cmake | 2 +- src/mbgl/gl/element_group.hpp | 25 ---------- src/mbgl/gl/vao.cpp | 5 -- src/mbgl/gl/vao.hpp | 6 +-- src/mbgl/layout/symbol_layout.cpp | 39 ++++++++------- src/mbgl/layout/symbol_layout.hpp | 2 +- src/mbgl/renderer/circle_bucket.cpp | 30 ++++++------ src/mbgl/renderer/circle_bucket.hpp | 7 ++- src/mbgl/renderer/element_group.hpp | 28 +++++++++++ src/mbgl/renderer/fill_bucket.cpp | 60 +++++++++++------------ src/mbgl/renderer/fill_bucket.hpp | 8 ++-- src/mbgl/renderer/line_bucket.cpp | 71 +++++++++++++--------------- src/mbgl/renderer/line_bucket.hpp | 5 +- src/mbgl/renderer/painter_circle.cpp | 2 +- src/mbgl/renderer/symbol_bucket.cpp | 32 ++++++------- src/mbgl/renderer/symbol_bucket.hpp | 12 ++--- 16 files changed, 152 insertions(+), 182 deletions(-) delete mode 100644 src/mbgl/gl/element_group.hpp create mode 100644 src/mbgl/renderer/element_group.hpp diff --git a/cmake/core-files.cmake b/cmake/core-files.cmake index 119379c25d8..e519c8f1ca6 100644 --- a/cmake/core-files.cmake +++ b/cmake/core-files.cmake @@ -61,7 +61,6 @@ set(MBGL_CORE_FILES src/mbgl/gl/context.hpp src/mbgl/gl/debugging.cpp src/mbgl/gl/debugging.hpp - src/mbgl/gl/element_group.hpp src/mbgl/gl/extension.cpp src/mbgl/gl/extension.hpp src/mbgl/gl/gl.cpp @@ -143,6 +142,7 @@ set(MBGL_CORE_FILES src/mbgl/renderer/circle_bucket.hpp src/mbgl/renderer/debug_bucket.cpp src/mbgl/renderer/debug_bucket.hpp + src/mbgl/renderer/element_group.hpp src/mbgl/renderer/fill_bucket.cpp src/mbgl/renderer/fill_bucket.hpp src/mbgl/renderer/frame_history.cpp diff --git a/src/mbgl/gl/element_group.hpp b/src/mbgl/gl/element_group.hpp deleted file mode 100644 index f99a03b6795..00000000000 --- a/src/mbgl/gl/element_group.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include -#include - -#include - -namespace mbgl { -namespace gl { - -template -struct ElementGroup : public util::noncopyable { - std::array array; - uint32_t vertex_length; - uint32_t elements_length; - - ElementGroup(uint32_t vertex_length_ = 0, uint32_t elements_length_ = 0) - : vertex_length(vertex_length_) - , elements_length(elements_length_) - { - } -}; - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/vao.cpp b/src/mbgl/gl/vao.cpp index 87c03ac23ef..b235b0e63ba 100644 --- a/src/mbgl/gl/vao.cpp +++ b/src/mbgl/gl/vao.cpp @@ -7,11 +7,6 @@ namespace mbgl { namespace gl { -VertexArrayObject::VertexArrayObject() { -} - -VertexArrayObject::~VertexArrayObject() = default; - void VertexArrayObject::bindVertexArrayObject(Context& context) { if (!GenVertexArrays || !BindVertexArray) { static bool reported = false; diff --git a/src/mbgl/gl/vao.hpp b/src/mbgl/gl/vao.hpp index 6a5e7d0e60e..826c028d32b 100644 --- a/src/mbgl/gl/vao.hpp +++ b/src/mbgl/gl/vao.hpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -11,11 +10,8 @@ namespace mbgl { namespace gl { -class VertexArrayObject : public util::noncopyable { +class VertexArrayObject { public: - VertexArrayObject(); - ~VertexArrayObject(); - template void bind(Shader& shader, const VertexBuffer& vertexBuffer, diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 1400125dd90..cc8db3ab98b 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -391,7 +391,7 @@ std::unique_ptr SymbolLayout::place(CollisionTile& collisionTile) if (hasText) { collisionTile.insertFeature(symbolInstance.textCollisionFeature, glyphScale, layout.textIgnorePlacement); if (glyphScale < collisionTile.maxScale) { - addSymbols( + addSymbols( bucket->text, symbolInstance.glyphQuads, glyphScale, layout.textKeepUpright, textPlacement, collisionTile.config.angle); } @@ -400,7 +400,7 @@ std::unique_ptr SymbolLayout::place(CollisionTile& collisionTile) if (hasIcon) { collisionTile.insertFeature(symbolInstance.iconCollisionFeature, iconScale, layout.iconIgnorePlacement); if (iconScale < collisionTile.maxScale) { - addSymbols( + addSymbols( bucket->icon, symbolInstance.iconQuads, iconScale, layout.iconKeepUpright, iconPlacement, collisionTile.config.angle); } @@ -414,7 +414,7 @@ std::unique_ptr SymbolLayout::place(CollisionTile& collisionTile) return bucket; } -template +template void SymbolLayout::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float scale, const bool keepUpright, const style::SymbolPlacementType placement, const float placementAngle) { const float placementZoom = ::fmax(std::log(scale) / std::log(2) + zoom, 0); @@ -449,16 +449,15 @@ void SymbolLayout::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float const int glyph_vertex_length = 4; - if (buffer.groups.empty() || (buffer.groups.back()->vertex_length + glyph_vertex_length > 65535)) { + if (buffer.groups.empty() || buffer.groups.back().vertexLength + glyph_vertex_length > 65535) { // Move to a new group because the old one can't hold the geometry. - buffer.groups.emplace_back(std::make_unique()); + buffer.groups.emplace_back(); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. - assert(buffer.groups.back()); - auto &triangleGroup = *buffer.groups.back(); - size_t triangleIndex = triangleGroup.vertex_length; + auto& group = buffer.groups.back(); + size_t index = group.vertexLength; // Encode angle of glyph uint8_t glyphAngle = std::round((symbol.glyphAngle / (M_PI * 2)) * 256); @@ -474,15 +473,15 @@ void SymbolLayout::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float minZoom, maxZoom, placementZoom, glyphAngle); // add the two triangles, referencing the four coordinates we just inserted. - buffer.triangles.emplace_back(static_cast(triangleIndex + 0), - static_cast(triangleIndex + 1), - static_cast(triangleIndex + 2)); - buffer.triangles.emplace_back(static_cast(triangleIndex + 1), - static_cast(triangleIndex + 2), - static_cast(triangleIndex + 3)); - - triangleGroup.vertex_length += glyph_vertex_length; - triangleGroup.elements_length += 2; + buffer.triangles.emplace_back(static_cast(index + 0), + static_cast(index + 1), + static_cast(index + 2)); + buffer.triangles.emplace_back(static_cast(index + 1), + static_cast(index + 2), + static_cast(index + 3)); + + group.vertexLength += glyph_vertex_length; + group.indexLength += 2; } } @@ -518,7 +517,7 @@ void SymbolLayout::addToDebugBuffers(CollisionTile& collisionTile, SymbolBucket& auto& collisionBox = bucket.collisionBox; if (collisionBox.groups.empty()) { // Move to a new group because the old one can't hold the geometry. - collisionBox.groups.emplace_back(std::make_unique()); + collisionBox.groups.emplace_back(); } collisionBox.vertices.emplace_back(anchor.x, anchor.y, tl.x, tl.y, maxZoom, placementZoom); @@ -530,8 +529,8 @@ void SymbolLayout::addToDebugBuffers(CollisionTile& collisionTile, SymbolBucket& collisionBox.vertices.emplace_back(anchor.x, anchor.y, bl.x, bl.y, maxZoom, placementZoom); collisionBox.vertices.emplace_back(anchor.x, anchor.y, tl.x, tl.y, maxZoom, placementZoom); - auto &group= *collisionBox.groups.back(); - group.vertex_length += 8; + auto& group= collisionBox.groups.back(); + group.vertexLength += 8; } } } diff --git a/src/mbgl/layout/symbol_layout.hpp b/src/mbgl/layout/symbol_layout.hpp index c4e6455794e..54acf84aaf5 100644 --- a/src/mbgl/layout/symbol_layout.hpp +++ b/src/mbgl/layout/symbol_layout.hpp @@ -70,7 +70,7 @@ class SymbolLayout { void addToDebugBuffers(CollisionTile&, SymbolBucket&); // Adds placed items to the buffer. - template + template void addSymbols(Buffer&, const SymbolQuads&, float scale, const bool keepUpright, const style::SymbolPlacementType, const float placementAngle); diff --git a/src/mbgl/renderer/circle_bucket.cpp b/src/mbgl/renderer/circle_bucket.cpp index 097410ce3b9..f12139d004f 100644 --- a/src/mbgl/renderer/circle_bucket.cpp +++ b/src/mbgl/renderer/circle_bucket.cpp @@ -31,7 +31,7 @@ void CircleBucket::render(Painter& painter, } bool CircleBucket::hasData() const { - return !triangleGroups.empty(); + return !groups.empty(); } bool CircleBucket::needsClipping() const { @@ -64,13 +64,13 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { vertices.emplace_back(x, y, 1, 1); // 3 vertices.emplace_back(x, y, -1, 1); // 4 - if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + 4 > 65535)) { + if (!groups.size() || groups.back().vertexLength + 4 > 65535) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(std::make_unique()); + groups.emplace_back(); } - TriangleGroup& group = *triangleGroups.back(); - uint16_t index = group.vertex_length; + auto& group = groups.back(); + uint16_t index = group.vertexLength; // 1, 2, 3 // 1, 4, 3 @@ -81,27 +81,25 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { static_cast(index + 3), static_cast(index + 2)); - group.vertex_length += 4; - group.elements_length += 2; + group.vertexLength += 4; + group.indexLength += 2; } } } -void CircleBucket::drawCircles(CircleShader& shader, gl::Context& context) { +void CircleBucket::drawCircles(CircleShader& shader, gl::Context& context, PaintMode paintMode) { GLbyte* vertexIndex = BUFFER_OFFSET(0); GLbyte* elementsIndex = BUFFER_OFFSET(0); - for (auto& group : triangleGroups) { - assert(group); + for (auto& group : groups) { + if (!group.indexLength) continue; - if (!group->elements_length) continue; + group.getVAO(shader, paintMode).bind(shader, *vertexBuffer, *indexBuffer, vertexIndex, context); - group->array[0].bind(shader, *vertexBuffer, *indexBuffer, vertexIndex, context); + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elementsIndex)); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elementsIndex)); - - vertexIndex += group->vertex_length * vertexBuffer->vertexSize; - elementsIndex += group->elements_length * indexBuffer->primitiveSize; + vertexIndex += group.vertexLength * vertexBuffer->vertexSize; + elementsIndex += group.indexLength * indexBuffer->primitiveSize; } } diff --git a/src/mbgl/renderer/circle_bucket.hpp b/src/mbgl/renderer/circle_bucket.hpp index 5f4f357d2fd..2f3faccdec9 100644 --- a/src/mbgl/renderer/circle_bucket.hpp +++ b/src/mbgl/renderer/circle_bucket.hpp @@ -1,11 +1,11 @@ #pragma once #include +#include #include #include #include #include -#include #include namespace mbgl { @@ -24,14 +24,13 @@ class CircleBucket : public Bucket { bool needsClipping() const override; void addGeometry(const GeometryCollection&); - void drawCircles(CircleShader&, gl::Context&); + void drawCircles(CircleShader&, gl::Context&, PaintMode); private: std::vector vertices; std::vector triangles; - using TriangleGroup = gl::ElementGroup<3>; - std::vector> triangleGroups; + std::vector> groups; optional> vertexBuffer; optional> indexBuffer; diff --git a/src/mbgl/renderer/element_group.hpp b/src/mbgl/renderer/element_group.hpp new file mode 100644 index 00000000000..59b5c3068d7 --- /dev/null +++ b/src/mbgl/renderer/element_group.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +namespace mbgl { + +template +struct ElementGroup { + template + struct VAOs { + gl::VertexArrayObject normalVAO; + gl::VertexArrayObject overdrawVAO; + }; + + std::tuple...> vaos; + + template + gl::VertexArrayObject& getVAO(const Shader&, PaintMode paintMode) { + auto& vao = std::get>(vaos); + return paintMode == PaintMode::Overdraw ? vao.overdrawVAO : vao.normalVAO; + } + + std::size_t vertexLength = 0; + std::size_t indexLength = 0; +}; + +} // namespace mbgl diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp index 9213c9a7771..f570d59743e 100644 --- a/src/mbgl/renderer/fill_bucket.cpp +++ b/src/mbgl/renderer/fill_bucket.cpp @@ -54,11 +54,11 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { if (nVertices == 0) continue; - if (lineGroups.empty() || lineGroups.back()->vertex_length + nVertices > 65535) - lineGroups.emplace_back(std::make_unique()); + if (lineGroups.empty() || lineGroups.back().vertexLength + nVertices > 65535) + lineGroups.emplace_back(); - LineGroup& lineGroup = *lineGroups.back(); - uint16_t lineIndex = lineGroup.vertex_length; + auto& lineGroup = lineGroups.back(); + uint16_t lineIndex = lineGroup.vertexLength; vertices.emplace_back(ring[0].x, ring[0].y); lines.emplace_back(static_cast(lineIndex + nVertices - 1), @@ -70,8 +70,8 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { static_cast(lineIndex + i)); } - lineGroup.vertex_length += nVertices; - lineGroup.elements_length += nVertices; + lineGroup.vertexLength += nVertices; + lineGroup.indexLength += nVertices; } std::vector indices = mapbox::earcut(polygon); @@ -79,12 +79,12 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { std::size_t nIndicies = indices.size(); assert(nIndicies % 3 == 0); - if (triangleGroups.empty() || triangleGroups.back()->vertex_length + totalVertices > 65535) { - triangleGroups.emplace_back(std::make_unique()); + if (triangleGroups.empty() || triangleGroups.back().vertexLength + totalVertices > 65535) { + triangleGroups.emplace_back(); } - TriangleGroup& triangleGroup = *triangleGroups.back(); - uint16_t triangleIndex = triangleGroup.vertex_length; + auto& triangleGroup = triangleGroups.back(); + uint16_t triangleIndex = triangleGroup.vertexLength; for (uint32_t i = 0; i < nIndicies; i += 3) { triangles.emplace_back(static_cast(triangleIndex + indices[i]), @@ -92,8 +92,8 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { static_cast(triangleIndex + indices[i + 2])); } - triangleGroup.vertex_length += totalVertices; - triangleGroup.elements_length += nIndicies / 3; + triangleGroup.vertexLength += totalVertices; + triangleGroup.indexLength += nIndicies / 3; } } @@ -127,13 +127,12 @@ void FillBucket::drawElements(PlainShader& shader, GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *triangleIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * triangleIndexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * triangleIndexBuffer->primitiveSize; } } @@ -143,13 +142,12 @@ void FillBucket::drawElements(PatternShader& shader, GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *triangleIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * triangleIndexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * triangleIndexBuffer->primitiveSize; } } @@ -159,13 +157,12 @@ void FillBucket::drawVertices(OutlineShader& shader, GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : lineGroups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *lineIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_LINES, static_cast(group.indexLength * 2), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * lineIndexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * lineIndexBuffer->primitiveSize; } } @@ -175,13 +172,12 @@ void FillBucket::drawVertices(OutlinePatternShader& shader, GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : lineGroups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *lineIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_LINES, static_cast(group.indexLength * 2), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * lineIndexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * lineIndexBuffer->primitiveSize; } } diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp index 9392bb5cf36..2ec9fc0e5b1 100644 --- a/src/mbgl/renderer/fill_bucket.hpp +++ b/src/mbgl/renderer/fill_bucket.hpp @@ -1,8 +1,8 @@ #pragma once #include +#include #include -#include #include #include #include @@ -39,10 +39,8 @@ class FillBucket : public Bucket { std::vector lines; std::vector triangles; - typedef gl::ElementGroup<4> LineGroup; - typedef gl::ElementGroup<4> TriangleGroup; - std::vector> lineGroups; - std::vector> triangleGroups; + std::vector> lineGroups; + std::vector> triangleGroups; optional> vertexBuffer; optional> lineIndexBuffer; diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp index 23c8b449b31..6ec265d7270 100644 --- a/src/mbgl/renderer/line_bucket.cpp +++ b/src/mbgl/renderer/line_bucket.cpp @@ -352,26 +352,22 @@ void LineBucket::addGeometry(const GeometryCoordinates& coordinates) { const std::size_t endVertex = vertices.size(); const std::size_t vertexCount = endVertex - startVertex; - // Store the triangle/line groups. - { - if (triangleGroups.empty() || (triangleGroups.back()->vertex_length + vertexCount > 65535)) { - // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(std::make_unique()); - } + if (groups.empty() || groups.back().vertexLength + vertexCount > 65535) { + // Move to a new group because the old one can't hold the geometry. + groups.emplace_back(); + } - assert(triangleGroups.back()); - auto& group = *triangleGroups.back(); - uint16_t index = group.vertex_length; + auto& group = groups.back(); + uint16_t index = group.vertexLength; - for (const auto& triangle : triangleStore) { - triangles.emplace_back(static_cast(index + triangle.a), - static_cast(index + triangle.b), - static_cast(index + triangle.c)); - } - - group.vertex_length += vertexCount; - group.elements_length += triangleStore.size(); + for (const auto& triangle : triangleStore) { + triangles.emplace_back(static_cast(index + triangle.a), + static_cast(index + triangle.b), + static_cast(index + triangle.c)); } + + group.vertexLength += vertexCount; + group.indexLength += triangleStore.size(); } void LineBucket::addCurrentVertex(const GeometryCoordinate& currentCoordinate, @@ -454,7 +450,7 @@ void LineBucket::render(Painter& painter, } bool LineBucket::hasData() const { - return !triangleGroups.empty(); + return !groups.empty(); } bool LineBucket::needsClipping() const { @@ -466,17 +462,16 @@ void LineBucket::drawLines(LineShader& shader, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : triangleGroups) { - assert(group); - if (!group->elements_length) { + for (auto& group : groups) { + if (!group.indexLength) { continue; } - group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *indexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * indexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * indexBuffer->primitiveSize; } } @@ -485,17 +480,16 @@ void LineBucket::drawLineSDF(LineSDFShader& shader, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : triangleGroups) { - assert(group); - if (!group->elements_length) { + for (auto& group : groups) { + if (!group.indexLength) { continue; } - group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *indexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * indexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * indexBuffer->primitiveSize; } } @@ -504,17 +498,16 @@ void LineBucket::drawLinePatterns(LinepatternShader& shader, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : triangleGroups) { - assert(group); - if (!group->elements_length) { + for (auto& group : groups) { + if (!group.indexLength) { continue; } - group->array[paintMode == PaintMode::Overdraw ? 5 : 4].bind( + group.getVAO(shader, paintMode).bind( shader, *vertexBuffer, *indexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * vertexBuffer->vertexSize; - elements_index += group->elements_length * indexBuffer->primitiveSize; + vertex_index += group.vertexLength * vertexBuffer->vertexSize; + elements_index += group.indexLength * indexBuffer->primitiveSize; } } diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp index 8cb73c1d272..ca07c345da4 100644 --- a/src/mbgl/renderer/line_bucket.hpp +++ b/src/mbgl/renderer/line_bucket.hpp @@ -1,8 +1,8 @@ #pragma once #include +#include #include -#include #include #include #include @@ -53,8 +53,7 @@ class LineBucket : public Bucket { std::vector vertices; std::vector triangles; - using TriangleGroup = gl::ElementGroup<6>; - std::vector> triangleGroups; + std::vector> groups; optional> vertexBuffer; optional> indexBuffer; diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp index 327011d03e7..462ed59ebfe 100644 --- a/src/mbgl/renderer/painter_circle.cpp +++ b/src/mbgl/renderer/painter_circle.cpp @@ -51,7 +51,7 @@ void Painter::renderCircle(PaintParameters& parameters, circleShader.u_blur = properties.circleBlur; circleShader.u_opacity = properties.circleOpacity; - bucket.drawCircles(circleShader, context); + bucket.drawCircles(circleShader, context, paintMode()); } } // namespace mbgl diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 0c41031c93c..ba064e4cc35 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -72,13 +72,12 @@ void SymbolBucket::drawGlyphs(SDFShader& shader, GLbyte* vertex_index = BUFFER_OFFSET_0; GLbyte* elements_index = BUFFER_OFFSET_0; for (auto& group : text.groups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + group.getVAO(shader, paintMode).bind( shader, *text.vertexBuffer, *text.indexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * text.vertexBuffer->vertexSize; - elements_index += group->elements_length * text.indexBuffer->primitiveSize; + vertex_index += group.vertexLength * text.vertexBuffer->vertexSize; + elements_index += group.indexLength * text.indexBuffer->primitiveSize; } } @@ -88,13 +87,12 @@ void SymbolBucket::drawIcons(SDFShader& shader, GLbyte* vertex_index = BUFFER_OFFSET_0; GLbyte* elements_index = BUFFER_OFFSET_0; for (auto& group : icon.groups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + group.getVAO(shader, paintMode).bind( shader, *icon.vertexBuffer, *icon.indexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * icon.vertexBuffer->vertexSize; - elements_index += group->elements_length * icon.indexBuffer->primitiveSize; + vertex_index += group.vertexLength * icon.vertexBuffer->vertexSize; + elements_index += group.indexLength * icon.indexBuffer->primitiveSize; } } @@ -104,13 +102,12 @@ void SymbolBucket::drawIcons(IconShader& shader, GLbyte* vertex_index = BUFFER_OFFSET_0; GLbyte* elements_index = BUFFER_OFFSET_0; for (auto& group : icon.groups) { - assert(group); - group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + group.getVAO(shader, paintMode).bind( shader, *icon.vertexBuffer, *icon.indexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast(group.indexLength * 3), GL_UNSIGNED_SHORT, elements_index)); - vertex_index += group->vertex_length * icon.vertexBuffer->vertexSize; - elements_index += group->elements_length * icon.indexBuffer->primitiveSize; + vertex_index += group.vertexLength * icon.vertexBuffer->vertexSize; + elements_index += group.indexLength * icon.indexBuffer->primitiveSize; } } @@ -118,8 +115,9 @@ void SymbolBucket::drawCollisionBoxes(CollisionBoxShader& shader, gl::Context& context) { GLbyte* vertex_index = BUFFER_OFFSET_0; for (auto& group : collisionBox.groups) { - group->array[0].bind(shader, *collisionBox.vertexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawArrays(GL_LINES, 0, group->vertex_length)); + group.getVAO(shader, PaintMode::Regular).bind( + shader, *collisionBox.vertexBuffer, vertex_index, context); + MBGL_CHECK_ERROR(glDrawArrays(GL_LINES, 0, static_cast(group.vertexLength))); } } diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index 36511e964f7..6fb61f7b009 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -1,8 +1,8 @@ #pragma once #include +#include #include -#include #include #include #include @@ -47,14 +47,10 @@ class SymbolBucket : public Bucket { private: friend class SymbolLayout; - typedef gl::ElementGroup<2> TextElementGroup; - typedef gl::ElementGroup<4> IconElementGroup; - typedef gl::ElementGroup<1> CollisionBoxElementGroup; - struct TextBuffer { std::vector vertices; std::vector triangles; - std::vector> groups; + std::vector> groups; optional> vertexBuffer; optional> indexBuffer; @@ -63,7 +59,7 @@ class SymbolBucket : public Bucket { struct IconBuffer { std::vector vertices; std::vector triangles; - std::vector> groups; + std::vector> groups; optional> vertexBuffer; optional> indexBuffer; @@ -72,7 +68,7 @@ class SymbolBucket : public Bucket { struct CollisionBoxBuffer { std::vector vertices; std::vector lines; - std::vector> groups; + std::vector> groups; optional> vertexBuffer; optional> indexBuffer;