diff --git a/include/mbgl/geometry/buffer.hpp b/include/mbgl/geometry/buffer.hpp index 20489cb33..446177d44 100644 --- a/include/mbgl/geometry/buffer.hpp +++ b/include/mbgl/geometry/buffer.hpp @@ -62,6 +62,10 @@ public: } } + inline GLuint getID() const { + return buffer; + } + protected: // increase the buffer size by at least /required/ bytes. inline void *addElement() { @@ -72,7 +76,7 @@ protected: while (length < pos + itemSize) length += defaultLength; array = realloc(array, length); if (array == nullptr) { - throw std::runtime_error("Buffer reallocation failed¯"); + throw std::runtime_error("Buffer reallocation failed"); } } pos += itemSize; @@ -106,7 +110,7 @@ private: size_t length = 0; // GL buffer ID - uint32_t buffer = 0; + GLuint buffer = 0; }; } diff --git a/include/mbgl/geometry/elements_buffer.hpp b/include/mbgl/geometry/elements_buffer.hpp index ed60338e0..1282beb23 100644 --- a/include/mbgl/geometry/elements_buffer.hpp +++ b/include/mbgl/geometry/elements_buffer.hpp @@ -4,10 +4,13 @@ #include #include +#include + namespace mbgl { +template struct ElementGroup { - VertexArrayObject array; + std::array array; uint32_t vertex_length; uint32_t elements_length; diff --git a/include/mbgl/geometry/static_vertex_buffer.hpp b/include/mbgl/geometry/static_vertex_buffer.hpp new file mode 100644 index 000000000..ce932269f --- /dev/null +++ b/include/mbgl/geometry/static_vertex_buffer.hpp @@ -0,0 +1,26 @@ +#ifndef MBGL_GEOMETRY_STATIC_VERTEX_BUFFER +#define MBGL_GEOMETRY_STATIC_VERTEX_BUFFER + +#include + +#include +#include +#include +#include + +namespace mbgl { + +class StaticVertexBuffer : public Buffer< + 4, // bytes per vertex (2 * signed short == 4 bytes) + GL_ARRAY_BUFFER, + 32 // default length +> { +public: + typedef int16_t vertex_type; + + StaticVertexBuffer(std::initializer_list> init); +}; + +} + +#endif diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp index e27e2c58a..87408ddba 100644 --- a/include/mbgl/geometry/vao.hpp +++ b/include/mbgl/geometry/vao.hpp @@ -1,101 +1,74 @@ #ifndef MBGL_GEOMETRY_VAO #define MBGL_GEOMETRY_VAO +#include #include #include namespace mbgl { +#if GL_ARB_vertex_array_object class VertexArrayObject { public: template - void bind(Shader& shader, VertexBuffer& vertex_buffer, char *offset) { -#if GL_ARB_vertex_array_object - if (!vao) { - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - } else { - // We have been given the correct information. - glBindVertexArray(vao); - } - - if (shader_ptr != &shader) { - if (shader_ptr != nullptr) { - fprintf(stderr, "shader rebind!"); - } -#endif - vertex_buffer.bind(); + inline void bind(Shader& shader, VertexBuffer &vertexBuffer, char *offset) { + bindVertexArrayObject(); + if (bound_shader == 0) { + vertexBuffer.bind(); shader.bind(offset); - -#if GL_ARB_vertex_array_object - shader_ptr = &shader; - vertex_buffer_ptr = &vertex_buffer; - elements_buffer_ptr = nullptr; - offset_ptr = offset; - } else if (vertex_buffer_ptr != &vertex_buffer) { - throw std::runtime_error("trying to bind VAO to another vertex buffer"); - } else if (elements_buffer_ptr != nullptr) { - throw std::runtime_error("trying to bind VAO to another elements buffer"); - } else if (offset_ptr != offset) { - throw std::runtime_error("trying to bind VAO to another offset"); + storeBinding(shader, vertexBuffer.getID(), 0, offset); + } else { + verifyBinding(shader, vertexBuffer.getID(), 0, offset); } -#endif } template - void bind(Shader& shader, VertexBuffer& vertex_buffer, ElementsBuffer& elements_buffer, char *offset) { -#if GL_ARB_vertex_array_object - if (!vao) { - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - } else { - // We have been given the correct information. - glBindVertexArray(vao); - } - - if (shader_ptr != &shader) { -#endif - vertex_buffer.bind(); - elements_buffer.bind(); + inline void bind(Shader& shader, VertexBuffer &vertexBuffer, ElementsBuffer &elementsBuffer, char *offset) { + bindVertexArrayObject(); + if (bound_shader == 0) { + vertexBuffer.bind(); + elementsBuffer.bind(); shader.bind(offset); - -#if GL_ARB_vertex_array_object - shader_ptr = &shader; - vertex_buffer_ptr = &vertex_buffer; - elements_buffer_ptr = &elements_buffer; - offset_ptr = offset; - } else if (vertex_buffer_ptr != &vertex_buffer) { - throw std::runtime_error("trying to bind VAO to another vertex buffer"); - } else if (elements_buffer_ptr != &elements_buffer) { - throw std::runtime_error("trying to bind VAO to another elements buffer"); - } else if (offset_ptr != offset) { - throw std::runtime_error("trying to bind VAO to another offset"); + storeBinding(shader, vertexBuffer.getID(), elementsBuffer.getID(), offset); + } else { + verifyBinding(shader, vertexBuffer.getID(), elementsBuffer.getID(), offset); } -#endif } - ~VertexArrayObject() { -#if GL_ARB_vertex_array_object - if (vao) { - glDeleteVertexArrays(1, &vao); - } -#endif - } + ~VertexArrayObject(); private: -#if GL_ARB_vertex_array_object + void bindVertexArrayObject(); + void storeBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, char *offset); + void verifyBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, char *offset); + GLuint vao = 0; // For debug reasons, we're storing the bind information so that we can // detect errors and report - void *shader_ptr = nullptr; - void *vertex_buffer_ptr = nullptr; - void *elements_buffer_ptr = nullptr; - char *offset_ptr = 0; -#endif + GLuint bound_shader = 0; + const char *bound_shader_name = ""; + GLuint bound_vertex_buffer = 0; + GLuint bound_elements_buffer = 0; + char *bound_offset = 0; }; +#else + +class VertexArrayObject { +public: + template + void bind(Shader& shader, Buffers& buffers, char *offset) { + for (auto &buffer : buffers) { + buffer.bind(); + } + shader.bind(offset); + } +}; + +#endif + } #endif diff --git a/include/mbgl/geometry/vertex_buffer.hpp b/include/mbgl/geometry/vertex_buffer.hpp deleted file mode 100644 index 58fd4a9d0..000000000 --- a/include/mbgl/geometry/vertex_buffer.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef MBGL_GEOMETRY_VERTEX_BUFFER -#define MBGL_GEOMETRY_VERTEX_BUFFER - -#include -#include -#include -#include - -namespace mbgl { - -class VertexBuffer { -public: - typedef int16_t vertex_type; - VertexBuffer(std::initializer_list init); - ~VertexBuffer(); - - /* - * Returns the number of elements in this buffer. This is not the number of - * bytes, but rather the number of coordinates with associated information. - */ - size_t index() const; - - /* - * Transfers this buffer to the GPU and binds the buffer to the GL context. - */ - void bind(); - -private: - const std::vector array; - uint32_t buffer = 0; -}; - -} - -#endif diff --git a/include/mbgl/platform/gl.hpp b/include/mbgl/platform/gl.hpp index a29b230db..cc2a681d4 100644 --- a/include/mbgl/platform/gl.hpp +++ b/include/mbgl/platform/gl.hpp @@ -26,9 +26,12 @@ #elif TARGET_OS_MAC #include #include - #define glGenVertexArrays glGenVertexArraysAPPLE - #define glBindVertexArray glBindVertexArrayAPPLE - #define glDeleteVertexArrays glDeleteVertexArraysAPPLE + #if GL_APPLE_vertex_array_object + #define GL_ARB_vertex_array_object 1 + #define glGenVertexArrays glGenVertexArraysAPPLE + #define glBindVertexArray glBindVertexArrayAPPLE + #define glDeleteVertexArrays glDeleteVertexArraysAPPLE + #endif #else #error Unsupported Apple platform #endif diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp index e9340cce6..e8d6bf99e 100644 --- a/include/mbgl/renderer/fill_bucket.hpp +++ b/include/mbgl/renderer/fill_bucket.hpp @@ -34,9 +34,8 @@ class FillBucket : public Bucket { static void *realloc(void *data, void *ptr, unsigned int size); static void free(void *userData, void *ptr); - - typedef ElementGroup triangle_group_type; - typedef ElementGroup line_group_type; + typedef ElementGroup<2> triangle_group_type; + typedef ElementGroup<1> line_group_type; public: FillBucket(FillVertexBuffer& vertexBuffer, TriangleElementsBuffer& triangleElementsBuffer, diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp index f65ca3560..a33dde34e 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 ElementGroup triangle_group_type; - typedef ElementGroup point_group_type; + typedef ElementGroup<1> triangle_group_type; + typedef ElementGroup<1> point_group_type; public: LineBucket(LineVertexBuffer& vertexBuffer, TriangleElementsBuffer& triangleElementsBuffer, diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index 4cf99f102..1ef5fee83 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include @@ -176,16 +176,16 @@ public: std::unique_ptr gaussianShader; // Set up the stencil quad we're using to generate the stencil mask. - VertexBuffer tileStencilBuffer = { + StaticVertexBuffer tileStencilBuffer = { // top left triangle - 0, 0, - 4096, 0, - 0, 4096, + { 0, 0 }, + { 4096, 0 }, + { 0, 4096 }, // bottom right triangle - 4096, 0, - 0, 4096, - 4096, 4096 + { 4096, 0 }, + { 0, 4096 }, + { 4096, 4096 }, }; VertexArrayObject coveringPlainArray; @@ -197,12 +197,12 @@ public: VertexArrayObject matteArray; // Set up the tile boundary lines we're using to draw the tile outlines. - VertexBuffer tileBorderBuffer = { - 0, 0, - 4096, 0, - 4096, 4096, - 0, 4096, - 0, 0 + StaticVertexBuffer tileBorderBuffer = { + { 0, 0 }, + { 4096, 0 }, + { 4096, 4096 }, + { 0, 4096 }, + { 0, 0 }, }; VertexArrayObject tileBorderArray; diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp index a68475565..66cceac8e 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -11,7 +11,7 @@ namespace mbgl { class RasterShader; -class VertexBuffer; +class StaticVertexBuffer; class VertexArrayObject; class RasterBucket : public Bucket { @@ -26,9 +26,9 @@ public: const StyleBucketRaster &properties; PrerenderedTexture texture; - void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array); + void drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array); - void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture); + void drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array, GLuint texture); Raster raster; diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp index e89027423..fb1678fc8 100644 --- a/include/mbgl/renderer/symbol_bucket.hpp +++ b/include/mbgl/renderer/symbol_bucket.hpp @@ -50,6 +50,9 @@ typedef std::vector Symbols; class SymbolBucket : public Bucket { + typedef ElementGroup<1> TextElementGroup; + typedef ElementGroup<1> IconElementGroup; + public: SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); @@ -94,13 +97,13 @@ private: struct { TextVertexBuffer vertices; TriangleElementsBuffer triangles; - std::vector groups; + std::vector groups; } text; struct { IconVertexBuffer vertices; TriangleElementsBuffer triangles; - std::vector groups; + std::vector groups; } icon; }; diff --git a/include/mbgl/shader/shader.hpp b/include/mbgl/shader/shader.hpp index 2398cb12e..fa2d5a0a8 100644 --- a/include/mbgl/shader/shader.hpp +++ b/include/mbgl/shader/shader.hpp @@ -9,13 +9,18 @@ namespace mbgl { class Shader : private util::noncopyable { public: - Shader(const char *vertex, const char *fragment); + Shader(const char *name, const char *vertex, const char *fragment); ~Shader(); + const char *name; bool valid; uint32_t program; void setMatrix(const std::array& matrix); + inline uint32_t getID() const { + return program; + } + private: bool compileShader(uint32_t *shader, uint32_t type, const char *source); diff --git a/src/geometry/static_vertex_buffer.cpp b/src/geometry/static_vertex_buffer.cpp new file mode 100644 index 000000000..c86211c50 --- /dev/null +++ b/src/geometry/static_vertex_buffer.cpp @@ -0,0 +1,14 @@ +#include +#include + +namespace mbgl { + +StaticVertexBuffer::StaticVertexBuffer(std::initializer_list> init) { + for (const std::pair &vertex : init) { + vertex_type *vertices = static_cast(addElement()); + vertices[0] = vertex.first; + vertices[1] = vertex.second; + } +} + +} diff --git a/src/geometry/vao.cpp b/src/geometry/vao.cpp new file mode 100644 index 000000000..4c459c436 --- /dev/null +++ b/src/geometry/vao.cpp @@ -0,0 +1,46 @@ +#include + +namespace mbgl { + +#if GL_ARB_vertex_array_object + +VertexArrayObject::~VertexArrayObject() { + if (vao) { + glDeleteVertexArrays(1, &vao); + } +} + +void VertexArrayObject::bindVertexArrayObject() { + if (!vao) { + glGenVertexArrays(1, &vao); + } + glBindVertexArray(vao); +} + +void VertexArrayObject::verifyBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, + char *offset) { + if (bound_shader != shader.getID()) { + throw std::runtime_error(std::string("trying to rebind VAO to another shader from " + + std::to_string(bound_shader) + "(" + bound_shader_name + ") to " + + std::to_string(shader.getID()) + "(" + shader.name + ")" )); + } else if (bound_offset != offset) { + throw std::runtime_error("trying to bind VAO to another offset"); + } else if (bound_vertex_buffer != vertexBuffer) { + throw std::runtime_error("trying to bind VAO to another vertex buffer"); + } else if (bound_elements_buffer != elementsBuffer) { + throw std::runtime_error("trying to bind VAO to another elements buffer"); + } +} + +void VertexArrayObject::storeBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, + char *offset) { + bound_shader = shader.getID(); + bound_shader_name = shader.name; + bound_offset = offset; + bound_vertex_buffer = vertexBuffer; + bound_elements_buffer = elementsBuffer; +} + +#endif + +} diff --git a/src/geometry/vertex_buffer.cpp b/src/geometry/vertex_buffer.cpp deleted file mode 100644 index 56072e161..000000000 --- a/src/geometry/vertex_buffer.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -using namespace mbgl; - - -VertexBuffer::VertexBuffer(std::initializer_list init) : array(init) {} - -VertexBuffer::~VertexBuffer() { - if (buffer != 0) { - glDeleteBuffers(1, &buffer); - } -} - -size_t VertexBuffer::index() const { - // We store 2 coordinates per vertex + 1 linesofar + 1 extrude coord pair == 4 (== 8 bytes) - return array.size() / 2; -} - -void VertexBuffer::bind() { - if (buffer == 0) { - glGenBuffers(1, &buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - glBufferData(GL_ARRAY_BUFFER, array.size() * sizeof(vertex_type), array.data(), GL_STATIC_DRAW); - } else { - glBindBuffer(GL_ARRAY_BUFFER, buffer); - } -} diff --git a/src/map/transform.cpp b/src/map/transform.cpp index a68cffdc7..6c5e70cc2 100644 --- a/src/map/transform.cpp +++ b/src/map/transform.cpp @@ -128,9 +128,9 @@ void Transform::getLonLat(double &lon, double &lat) const { } void Transform::getLonLatZoom(double &lon, double &lat, double &zoom) const { - uv::readlock lock(mtx); - getLonLat(lon, lat); + + uv::readlock lock(mtx); zoom = getZoom(); } @@ -192,7 +192,7 @@ void Transform::setZoom(const double zoom, const timestamp duration) { double Transform::getZoom() const { uv::readlock lock(mtx); - return log(final.scale) / M_LN2; + return std::log(final.scale) / M_LN2; } double Transform::getScale() const { diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 4b4000ce9..875cc279b 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -216,7 +216,7 @@ 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.bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + 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,7 +227,7 @@ 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.bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + 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,7 +238,7 @@ 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.bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); + 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 949d71e13..e089d7f61 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -367,7 +367,7 @@ void LineBucket::drawLines(LineShader& shader) { if (!group.elements_length) { continue; } - group.array.bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + 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; @@ -381,7 +381,7 @@ void LineBucket::drawPoints(LinejoinShader& shader) { if (!group.elements_length) { continue; } - group.array.bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); + 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/painter.cpp b/src/renderer/painter.cpp index 9f889fb3f..5aba3b1b8 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -67,17 +67,17 @@ void Painter::setup() { } void Painter::setupShaders() { - plainShader = std::make_unique(); - outlineShader = std::make_unique(); - lineShader = std::make_unique(); - linejoinShader = std::make_unique(); - patternShader = std::make_unique(); - iconShader = std::make_unique(); - rasterShader = std::make_unique(); - textShader = std::make_unique(); - dotShader = std::make_unique(); - compositeShader = std::make_unique(); - gaussianShader = std::make_unique(); + if (!plainShader) plainShader = std::make_unique(); + if (!outlineShader) outlineShader = std::make_unique(); + if (!lineShader) lineShader = std::make_unique(); + if (!linejoinShader) linejoinShader = std::make_unique(); + if (!patternShader) patternShader = std::make_unique(); + if (!iconShader) iconShader = std::make_unique(); + if (!rasterShader) rasterShader = std::make_unique(); + if (!textShader) textShader = std::make_unique(); + if (!dotShader) dotShader = std::make_unique(); + if (!compositeShader) compositeShader = std::make_unique(); + if (!gaussianShader) gaussianShader = std::make_unique(); } void Painter::cleanup() { diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index ddfff119e..10dadc03f 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -17,14 +17,14 @@ bool RasterBucket::setImage(const std::string &data) { return raster.load(data); } -void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array) { +void RasterBucket::drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array) { raster.bind(true); shader.setImage(0); array.bind(shader, vertices, BUFFER_OFFSET(0)); glDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertices.index()); } -void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture) { +void RasterBucket::drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array, GLuint texture) { raster.bind(texture); shader.setImage(0); array.bind(shader, vertices, BUFFER_OFFSET(0)); diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index 459c235da..7f79455a1 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -348,7 +348,7 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float // We're generating triangle fans, so we always start with the first // coordinate in this polygon. - ElementGroup &triangleGroup = buffer.groups.back(); + TextElementGroup &triangleGroup = buffer.groups.back(); uint32_t triangleIndex = triangleGroup.vertex_length; // coordinates (2 triangles) @@ -373,8 +373,8 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float void SymbolBucket::drawGlyphs(TextShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); - for (ElementGroup &group : text.groups) { - group.array.bind(shader, text.vertices, text.triangles, vertex_index); + 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; @@ -384,8 +384,8 @@ void SymbolBucket::drawGlyphs(TextShader &shader) { void SymbolBucket::drawIcons(IconShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); - for (ElementGroup &group : icon.groups) { - group.array.bind(shader, icon.vertices, icon.triangles, vertex_index); + 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; diff --git a/src/shader/composite_shader.cpp b/src/shader/composite_shader.cpp index 07fe0c074..9ed0a1b83 100644 --- a/src/shader/composite_shader.cpp +++ b/src/shader/composite_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; CompositeShader::CompositeShader() : Shader( + "composite", shaders[COMPOSITE_SHADER].vertex, shaders[COMPOSITE_SHADER].fragment ) { diff --git a/src/shader/dot_shader.cpp b/src/shader/dot_shader.cpp index 8e2837f2c..54163d698 100644 --- a/src/shader/dot_shader.cpp +++ b/src/shader/dot_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; DotShader::DotShader() : Shader( + "dot", shaders[DOT_SHADER].vertex, shaders[DOT_SHADER].fragment ) { diff --git a/src/shader/gaussian_shader.cpp b/src/shader/gaussian_shader.cpp index eb8867756..d22006020 100644 --- a/src/shader/gaussian_shader.cpp +++ b/src/shader/gaussian_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; GaussianShader::GaussianShader() : Shader( + "gaussian", shaders[GAUSSIAN_SHADER].vertex, shaders[GAUSSIAN_SHADER].fragment ) { diff --git a/src/shader/icon_shader.cpp b/src/shader/icon_shader.cpp index 6455d870a..4973dc411 100644 --- a/src/shader/icon_shader.cpp +++ b/src/shader/icon_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; IconShader::IconShader() : Shader( + "icon", shaders[ICON_SHADER].vertex, shaders[ICON_SHADER].fragment ) { diff --git a/src/shader/line_shader.cpp b/src/shader/line_shader.cpp index 529ab0d31..1b0527366 100644 --- a/src/shader/line_shader.cpp +++ b/src/shader/line_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; LineShader::LineShader() : Shader( + "line", shaders[LINE_SHADER].vertex, shaders[LINE_SHADER].fragment ) { diff --git a/src/shader/linejoin_shader.cpp b/src/shader/linejoin_shader.cpp index 73b7a1e74..e8ec306ed 100644 --- a/src/shader/linejoin_shader.cpp +++ b/src/shader/linejoin_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; LinejoinShader::LinejoinShader() : Shader( + "linejoin", shaders[LINEJOIN_SHADER].vertex, shaders[LINEJOIN_SHADER].fragment ) { diff --git a/src/shader/outline_shader.cpp b/src/shader/outline_shader.cpp index b1e57bf0f..d9c19fa80 100644 --- a/src/shader/outline_shader.cpp +++ b/src/shader/outline_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; OutlineShader::OutlineShader() : Shader( + "outline", shaders[OUTLINE_SHADER].vertex, shaders[OUTLINE_SHADER].fragment ) { diff --git a/src/shader/pattern_shader.cpp b/src/shader/pattern_shader.cpp index ec604290a..8fe6a34e9 100644 --- a/src/shader/pattern_shader.cpp +++ b/src/shader/pattern_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; PatternShader::PatternShader() : Shader( + "pattern", shaders[PATTERN_SHADER].vertex, shaders[PATTERN_SHADER].fragment ) { diff --git a/src/shader/plain_shader.cpp b/src/shader/plain_shader.cpp index 3abc57eaa..bb0c22899 100644 --- a/src/shader/plain_shader.cpp +++ b/src/shader/plain_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; PlainShader::PlainShader() : Shader( + "plain", shaders[PLAIN_SHADER].vertex, shaders[PLAIN_SHADER].fragment ) { diff --git a/src/shader/raster_shader.cpp b/src/shader/raster_shader.cpp index 51b328fa8..60d81c61b 100644 --- a/src/shader/raster_shader.cpp +++ b/src/shader/raster_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; RasterShader::RasterShader() : Shader( + "raster", shaders[RASTER_SHADER].vertex, shaders[RASTER_SHADER].fragment ) { diff --git a/src/shader/shader.cpp b/src/shader/shader.cpp index fa073c42d..171ce9b7c 100644 --- a/src/shader/shader.cpp +++ b/src/shader/shader.cpp @@ -8,8 +8,9 @@ using namespace mbgl; -Shader::Shader(const GLchar *vertSource, const GLchar *fragSource) - : valid(false), +Shader::Shader(const char *name, const GLchar *vertSource, const GLchar *fragSource) + : name(name), + valid(false), program(0) { util::timer timer("shader compilation", Event::Shader); diff --git a/src/shader/text_shader.cpp b/src/shader/text_shader.cpp index c9e70825c..f6de934e2 100644 --- a/src/shader/text_shader.cpp +++ b/src/shader/text_shader.cpp @@ -8,6 +8,7 @@ using namespace mbgl; TextShader::TextShader() : Shader( + "text", shaders[TEXT_SHADER].vertex, shaders[TEXT_SHADER].fragment ) {