summaryrefslogtreecommitdiff
path: root/src/mbgl/gl/vao.hpp
blob: 826c028d32b041d4d6de1e6506503e7c0f98e944 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#pragma once

#include <mbgl/gl/shader.hpp>
#include <mbgl/gl/context.hpp>
#include <mbgl/gl/vertex_buffer.hpp>
#include <mbgl/util/optional.hpp>

#include <stdexcept>

namespace mbgl {
namespace gl {

class VertexArrayObject {
public:
    template <typename Shader, typename T>
    void bind(Shader& shader,
              const VertexBuffer<T>& vertexBuffer,
              int8_t* offset,
              Context& context) {
        bindVertexArrayObject(context);
        if (bound_shader == 0) {
            context.vertexBuffer = vertexBuffer.buffer;
            context.bindAttributes(shader, vertexBuffer, offset);
            if (vertexArray) {
                storeBinding(shader, vertexBuffer.buffer, 0, offset);
            }
        } else {
            verifyBinding(shader, vertexBuffer.buffer, 0, offset);
        }
    }

    template <typename Shader, typename T, typename P>
    void bind(Shader& shader,
              const VertexBuffer<T>& vertexBuffer,
              const IndexBuffer<P>& indexBuffer,
              int8_t* offset,
              Context& context) {
        bindVertexArrayObject(context);
        if (bound_shader == 0) {
            context.vertexBuffer = vertexBuffer.buffer;
            context.elementBuffer = indexBuffer.buffer;
            context.bindAttributes(shader, vertexBuffer, offset);
            if (vertexArray) {
                storeBinding(shader, vertexBuffer.buffer, indexBuffer.buffer, offset);
            }
        } else {
            verifyBinding(shader, vertexBuffer.buffer, indexBuffer.buffer, offset);
        }
    }

    VertexArrayID getID() const {
        return *vertexArray;
    }

private:
    void bindVertexArrayObject(Context&);
    void storeBinding(Shader& shader,
                      BufferID vertexBuffer,
                      BufferID elementsBuffer,
                      int8_t* offset);
    void verifyBinding(Shader& shader,
                       BufferID vertexBuffer,
                       BufferID elementsBuffer,
                       int8_t* offset);

    optional<UniqueVertexArray> vertexArray;

    // For debug reasons, we're storing the bind information so that we can
    // detect errors and report
    ProgramID bound_shader = 0;
    const char* bound_shader_name = "";
    BufferID bound_vertex_buffer = 0;
    BufferID bound_elements_buffer = 0;
    int8_t *bound_offset = nullptr;
};

} // namespace gl
} // namespace mbgl