fix binding to vaos
This commit is contained in:
@@ -6,8 +6,9 @@
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
template <int count>
|
||||
struct ElementGroup {
|
||||
VertexArrayObject array;
|
||||
std::array<VertexArrayObject, count> array;
|
||||
uint32_t vertex_length;
|
||||
uint32_t elements_length;
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
|
||||
if (shader_ptr != &shader) {
|
||||
if (shader_ptr != nullptr) {
|
||||
fprintf(stderr, "shader rebind!");
|
||||
throw std::runtime_error("shader rebind!");
|
||||
}
|
||||
#endif
|
||||
vertex_buffer.bind();
|
||||
@@ -55,6 +55,9 @@ public:
|
||||
}
|
||||
|
||||
if (shader_ptr != &shader) {
|
||||
if (shader_ptr != nullptr) {
|
||||
throw std::runtime_error("shader rebind!");
|
||||
}
|
||||
#endif
|
||||
vertex_buffer.bind();
|
||||
elements_buffer.bind();
|
||||
|
||||
@@ -26,9 +26,12 @@
|
||||
#elif TARGET_OS_MAC
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include <OpenGL/gl.h>
|
||||
#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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -50,6 +50,9 @@ typedef std::vector<Symbol> 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<ElementGroup> groups;
|
||||
std::vector<TextElementGroup> groups;
|
||||
} text;
|
||||
|
||||
struct {
|
||||
IconVertexBuffer vertices;
|
||||
TriangleElementsBuffer triangles;
|
||||
std::vector<ElementGroup> groups;
|
||||
std::vector<IconElementGroup> groups;
|
||||
} icon;
|
||||
|
||||
};
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user