summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/geometry/elements_buffer.hpp5
-rw-r--r--include/mbgl/geometry/vao.hpp10
-rw-r--r--include/mbgl/renderer/fill_bucket.hpp4
-rw-r--r--include/mbgl/renderer/line_bucket.hpp4
-rw-r--r--include/mbgl/renderer/symbol_bucket.hpp4
-rw-r--r--src/renderer/fill_bucket.cpp44
-rw-r--r--src/renderer/line_bucket.cpp46
-rw-r--r--src/renderer/symbol_bucket.cpp26
8 files changed, 79 insertions, 64 deletions
diff --git a/include/mbgl/geometry/elements_buffer.hpp b/include/mbgl/geometry/elements_buffer.hpp
index 44b5c71dd2..56080e29fe 100644
--- a/include/mbgl/geometry/elements_buffer.hpp
+++ b/include/mbgl/geometry/elements_buffer.hpp
@@ -20,6 +20,11 @@ struct ElementGroup : public util::noncopyable {
: vertex_length(vertex_length),
elements_length(elements_length) {
}
+
+ ElementGroup(ElementGroup &&rhs) noexcept
+ : array(std::move(rhs.array)),
+ vertex_length(rhs.vertex_length),
+ elements_length(rhs.elements_length) {};
};
class TriangleElementsBuffer : public Buffer<
diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp
index 3d32ed28a8..bb1f571fff 100644
--- a/include/mbgl/geometry/vao.hpp
+++ b/include/mbgl/geometry/vao.hpp
@@ -12,6 +12,16 @@ namespace mbgl {
#if GL_ARB_vertex_array_object
class VertexArrayObject : public util::noncopyable {
public:
+ inline VertexArrayObject() {};
+
+ inline VertexArrayObject(VertexArrayObject &&rhs) noexcept
+ : vao(rhs.vao),
+ bound_shader(rhs.bound_shader),
+ bound_shader_name(rhs.bound_shader_name),
+ bound_vertex_buffer(rhs.bound_vertex_buffer),
+ bound_elements_buffer(rhs.bound_elements_buffer),
+ bound_offset(rhs.bound_offset) {};
+
template <typename Shader, typename VertexBuffer>
inline void bind(Shader& shader, VertexBuffer &vertexBuffer, char *offset) {
bindVertexArrayObject();
diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp
index 0cd756318c..15868e4092 100644
--- a/include/mbgl/renderer/fill_bucket.hpp
+++ b/include/mbgl/renderer/fill_bucket.hpp
@@ -34,8 +34,8 @@ class FillBucket : public Bucket {
static void *realloc(void *data, void *ptr, unsigned int size);
static void free(void *userData, void *ptr);
- typedef std::unique_ptr<ElementGroup<2>> triangle_group_type;
- typedef std::unique_ptr<ElementGroup<1>> line_group_type;
+ typedef ElementGroup<2> triangle_group_type;
+ typedef ElementGroup<1> line_group_type;
public:
FillBucket(FillVertexBuffer& vertexBuffer,
diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp
index 55fe8c4862..c7e375a0a1 100644
--- a/include/mbgl/renderer/line_bucket.hpp
+++ b/include/mbgl/renderer/line_bucket.hpp
@@ -20,8 +20,8 @@ class LinejoinShader;
struct pbf;
class LineBucket : public Bucket {
- typedef std::unique_ptr<ElementGroup<1>> triangle_group_type;
- typedef std::unique_ptr<ElementGroup<1>> point_group_type;
+ typedef ElementGroup<1> triangle_group_type;
+ typedef ElementGroup<1> point_group_type;
public:
LineBucket(LineVertexBuffer& vertexBuffer,
diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp
index fccb2924da..fb1678fc8b 100644
--- a/include/mbgl/renderer/symbol_bucket.hpp
+++ b/include/mbgl/renderer/symbol_bucket.hpp
@@ -50,8 +50,8 @@ typedef std::vector<Symbol> Symbols;
class SymbolBucket : public Bucket {
- typedef std::unique_ptr<ElementGroup<1>> TextElementGroup;
- typedef std::unique_ptr<ElementGroup<1>> IconElementGroup;
+ typedef ElementGroup<1> TextElementGroup;
+ typedef ElementGroup<1> IconElementGroup;
public:
SymbolBucket(const StyleBucketSymbol &properties, Collision &collision);
diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp
index 37be901133..e057e9faab 100644
--- a/src/renderer/fill_bucket.cpp
+++ b/src/renderer/fill_bucket.cpp
@@ -111,13 +111,13 @@ void FillBucket::tessellate() {
throw geometry_too_long_exception();
}
- if (!lineGroups.size() || (lineGroups.back()->vertex_length + total_vertex_count > 65535)) {
+ if (!lineGroups.size() || (lineGroups.back().vertex_length + total_vertex_count > 65535)) {
// Move to a new group because the old one can't hold the geometry.
- lineGroups.emplace_back(std::make_unique<ElementGroup<1>>());
+ lineGroups.emplace_back();
}
line_group_type& lineGroup = lineGroups.back();
- uint32_t lineIndex = lineGroup->vertex_length;
+ uint32_t lineIndex = lineGroup.vertex_length;
for (const std::vector<ClipperLib::IntPoint>& polygon : polygons) {
const size_t group_count = polygon.size();
@@ -140,7 +140,7 @@ void FillBucket::tessellate() {
tessAddContour(tesselator, vertexSize, line.data(), stride, (int)line.size() / vertexSize);
}
- lineGroup->elements_length += total_vertex_count;
+ lineGroup.elements_length += total_vertex_count;
if (tessTesselate(tesselator, TESS_WINDING_POSITIVE, TESS_POLYGONS, vertices_per_group, vertexSize, 0)) {
const TESSreal *vertices = tessGetVertices(tesselator);
@@ -157,15 +157,15 @@ void FillBucket::tessellate() {
}
}
- if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + total_vertex_count > 65535)) {
+ if (!triangleGroups.size() || (triangleGroups.back().vertex_length + total_vertex_count > 65535)) {
// Move to a new group because the old one can't hold the geometry.
- triangleGroups.emplace_back(std::make_unique<ElementGroup<2>>());
+ triangleGroups.emplace_back();
}
// We're generating triangle fans, so we always start with the first
// coordinate in this polygon.
triangle_group_type& triangleGroup = triangleGroups.back();
- uint32_t triangleIndex = triangleGroup->vertex_length;
+ uint32_t triangleIndex = triangleGroup.vertex_length;
for (int i = 0; i < triangle_count; ++i) {
const TESSindex *element_group = &elements[i * vertices_per_group];
@@ -190,8 +190,8 @@ void FillBucket::tessellate() {
}
}
- triangleGroup->vertex_length += total_vertex_count;
- triangleGroup->elements_length += triangle_count;
+ triangleGroup.vertex_length += total_vertex_count;
+ triangleGroup.elements_length += triangle_count;
} else {
#if defined(DEBUG)
fprintf(stderr, "tessellation failed\n");
@@ -201,7 +201,7 @@ void FillBucket::tessellate() {
// We're adding the total vertex count *after* we added additional vertices
// in the tessellation step. They won't be part of the actual lines, but
// we need to skip over them anyway if we draw the next group.
- lineGroup->vertex_length += total_vertex_count;
+ lineGroup.vertex_length += total_vertex_count;
}
void FillBucket::render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix) {
@@ -216,10 +216,10 @@ void FillBucket::drawElements(PlainShader& shader) {
char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
for (triangle_group_type& group : triangleGroups) {
- group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
- glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * vertexBuffer.itemSize;
- elements_index += group->elements_length * triangleElementsBuffer.itemSize;
+ group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
+ glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * vertexBuffer.itemSize;
+ elements_index += group.elements_length * triangleElementsBuffer.itemSize;
}
}
@@ -227,10 +227,10 @@ void FillBucket::drawElements(PatternShader& shader) {
char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
for (triangle_group_type& group : triangleGroups) {
- group->array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
- glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * vertexBuffer.itemSize;
- elements_index += group->elements_length * triangleElementsBuffer.itemSize;
+ group.array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
+ glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * vertexBuffer.itemSize;
+ elements_index += group.elements_length * triangleElementsBuffer.itemSize;
}
}
@@ -238,9 +238,9 @@ void FillBucket::drawVertices(OutlineShader& shader) {
char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
char *elements_index = BUFFER_OFFSET(line_elements_start * lineElementsBuffer.itemSize);
for (line_group_type& group : lineGroups) {
- group->array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index);
- glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * vertexBuffer.itemSize;
- elements_index += group->elements_length * lineElementsBuffer.itemSize;
+ group.array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index);
+ glDrawElements(GL_LINES, group.elements_length * 2, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * vertexBuffer.itemSize;
+ elements_index += group.elements_length * lineElementsBuffer.itemSize;
}
}
diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp
index d2ebca951e..1b8586c153 100644
--- a/src/renderer/line_bucket.cpp
+++ b/src/renderer/line_bucket.cpp
@@ -307,38 +307,38 @@ void LineBucket::addGeometry(const std::vector<Coordinate>& vertices) {
// Store the triangle/line groups.
{
- if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + vertex_count > 65535)) {
+ if (!triangleGroups.size() || (triangleGroups.back().vertex_length + vertex_count > 65535)) {
// Move to a new group because the old one can't hold the geometry.
- triangleGroups.emplace_back(std::make_unique<ElementGroup<1>>());
+ triangleGroups.emplace_back();
}
triangle_group_type& group = triangleGroups.back();
for (const TriangleElement& triangle : triangle_store) {
triangleElementsBuffer.add(
- group->vertex_length + triangle.a,
- group->vertex_length + triangle.b,
- group->vertex_length + triangle.c
+ group.vertex_length + triangle.a,
+ group.vertex_length + triangle.b,
+ group.vertex_length + triangle.c
);
}
- group->vertex_length += vertex_count;
- group->elements_length += triangle_store.size();
+ group.vertex_length += vertex_count;
+ group.elements_length += triangle_store.size();
}
// Store the line join/cap groups.
{
- if (!pointGroups.size() || (pointGroups.back()->vertex_length + vertex_count > 65535)) {
+ if (!pointGroups.size() || (pointGroups.back().vertex_length + vertex_count > 65535)) {
// Move to a new group because the old one can't hold the geometry.
- pointGroups.emplace_back(std::make_unique<ElementGroup<1>>());
+ pointGroups.emplace_back();
}
point_group_type& group = pointGroups.back();
for (PointElement point : point_store) {
- pointElementsBuffer.add(group->vertex_length + point);
+ pointElementsBuffer.add(group.vertex_length + point);
}
- group->vertex_length += vertex_count;
- group->elements_length += point_store.size();
+ group.vertex_length += vertex_count;
+ group.elements_length += point_store.size();
}
}
@@ -353,7 +353,7 @@ bool LineBucket::hasData() const {
bool LineBucket::hasPoints() const {
if (!pointGroups.empty()) {
for (const point_group_type& group : pointGroups) {
- if (group->elements_length) {
+ if (group.elements_length) {
return true;
}
}
@@ -365,13 +365,13 @@ void LineBucket::drawLines(LineShader& shader) {
char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
for (triangle_group_type& group : triangleGroups) {
- if (!group->elements_length) {
+ if (!group.elements_length) {
continue;
}
- group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
- glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * vertexBuffer.itemSize;
- elements_index += group->elements_length * triangleElementsBuffer.itemSize;
+ group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
+ glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * vertexBuffer.itemSize;
+ elements_index += group.elements_length * triangleElementsBuffer.itemSize;
}
}
@@ -379,12 +379,12 @@ void LineBucket::drawPoints(LinejoinShader& shader) {
char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
char *elements_index = BUFFER_OFFSET(point_elements_start * pointElementsBuffer.itemSize);
for (point_group_type& group : pointGroups) {
- if (!group->elements_length) {
+ if (!group.elements_length) {
continue;
}
- group->array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index);
- glDrawElements(GL_POINTS, group->elements_length, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * vertexBuffer.itemSize;
- elements_index += group->elements_length * pointElementsBuffer.itemSize;
+ group.array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index);
+ glDrawElements(GL_POINTS, group.elements_length, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * vertexBuffer.itemSize;
+ elements_index += group.elements_length * pointElementsBuffer.itemSize;
}
}
diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp
index 6ddf18ee74..db059a43de 100644
--- a/src/renderer/symbol_bucket.cpp
+++ b/src/renderer/symbol_bucket.cpp
@@ -345,15 +345,15 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float
const int glyph_vertex_length = 4;
if (!buffer.groups.size() ||
- (buffer.groups.back()->vertex_length + glyph_vertex_length > 65535)) {
+ (buffer.groups.back().vertex_length + 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<ElementGroup<1>>());
+ buffer.groups.emplace_back();
}
// We're generating triangle fans, so we always start with the first
// coordinate in this polygon.
TextElementGroup &triangleGroup = buffer.groups.back();
- uint32_t triangleIndex = triangleGroup->vertex_length;
+ uint32_t triangleIndex = triangleGroup.vertex_length;
// coordinates (2 triangles)
buffer.vertices.add(glyphAnchor.x, glyphAnchor.y, tl.x, tl.y, tex.x, tex.y, angle, minZoom,
@@ -369,8 +369,8 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float
buffer.triangles.add(triangleIndex + 0, triangleIndex + 1, triangleIndex + 2);
buffer.triangles.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3);
- triangleGroup->vertex_length += glyph_vertex_length;
- triangleGroup->elements_length += 2;
+ triangleGroup.vertex_length += glyph_vertex_length;
+ triangleGroup.elements_length += 2;
}
}
@@ -378,10 +378,10 @@ void SymbolBucket::drawGlyphs(TextShader &shader) {
char *vertex_index = BUFFER_OFFSET(0);
char *elements_index = BUFFER_OFFSET(0);
for (TextElementGroup &group : text.groups) {
- group->array[0].bind(shader, text.vertices, text.triangles, vertex_index);
- glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * text.vertices.itemSize;
- elements_index += group->elements_length * text.triangles.itemSize;
+ group.array[0].bind(shader, text.vertices, text.triangles, vertex_index);
+ glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * text.vertices.itemSize;
+ elements_index += group.elements_length * text.triangles.itemSize;
}
}
@@ -389,10 +389,10 @@ void SymbolBucket::drawIcons(IconShader &shader) {
char *vertex_index = BUFFER_OFFSET(0);
char *elements_index = BUFFER_OFFSET(0);
for (IconElementGroup &group : icon.groups) {
- group->array[0].bind(shader, icon.vertices, icon.triangles, vertex_index);
- glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
- vertex_index += group->vertex_length * icon.vertices.itemSize;
- elements_index += group->elements_length * icon.triangles.itemSize;
+ group.array[0].bind(shader, icon.vertices, icon.triangles, vertex_index);
+ glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index);
+ vertex_index += group.vertex_length * icon.vertices.itemSize;
+ elements_index += group.elements_length * icon.triangles.itemSize;
}
}
}