summaryrefslogtreecommitdiff
path: root/include/mbgl/geometry/vao.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/geometry/vao.hpp')
-rw-r--r--include/mbgl/geometry/vao.hpp111
1 files changed, 42 insertions, 69 deletions
diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp
index 71d7ff89fe..87408ddbad 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 <mbgl/shader/shader.hpp>
#include <mbgl/platform/gl.hpp>
#include <stdexcept>
namespace mbgl {
+#if GL_ARB_vertex_array_object
class VertexArrayObject {
public:
template <typename Shader, typename VertexBuffer>
- void bind(Shader& shader, VertexBuffer& vertex_buffer, char *offset) {
-#ifdef 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);
-
-#ifdef 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 <typename Shader, typename VertexBuffer, typename ElementsBuffer>
- void bind(Shader& shader, VertexBuffer& vertex_buffer, ElementsBuffer& elements_buffer, char *offset) {
-#ifdef 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);
-
-#ifdef 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() {
-#ifdef GL_ARB_vertex_array_object
- if (vao) {
- glDeleteVertexArrays(1, &vao);
- }
-#endif
- }
+ ~VertexArrayObject();
private:
-#ifdef 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 <typename Shader, typename Buffers>
+ void bind(Shader& shader, Buffers& buffers, char *offset) {
+ for (auto &buffer : buffers) {
+ buffer.bind();
+ }
+ shader.bind(offset);
+ }
};
+#endif
+
}
#endif