1 #ifndef MSP_GL_BUFFER_H_
2 #define MSP_GL_BUFFER_H_
6 #include <msp/gl/extensions/arb_vertex_buffer_object.h>
7 #include <msp/gl/extensions/arb_uniform_buffer_object.h>
14 ARRAY_BUFFER = GL_ARRAY_BUFFER,
15 ELEMENT_ARRAY_BUFFER = GL_ELEMENT_ARRAY_BUFFER,
16 PIXEL_PACK_BUFFER = GL_PIXEL_PACK_BUFFER,
17 PIXEL_UNPACK_BUFFER = GL_PIXEL_UNPACK_BUFFER,
18 UNIFORM_BUFFER = GL_UNIFORM_BUFFER
23 STREAM_DRAW = GL_STREAM_DRAW,
24 STREAM_READ = GL_STREAM_READ,
25 STREAM_COPY = GL_STREAM_COPY,
26 STATIC_DRAW = GL_STATIC_DRAW,
27 STATIC_READ = GL_STATIC_READ,
28 STATIC_COPY = GL_STATIC_COPY,
29 DYNAMIC_DRAW = GL_DYNAMIC_DRAW,
30 DYNAMIC_READ = GL_DYNAMIC_READ,
31 DYNAMIC_COPY = GL_DYNAMIC_COPY
36 READ_ONLY = GL_READ_ONLY,
37 WRITE_ONLY = GL_WRITE_ONLY,
38 READ_WRITE = GL_READ_WRITE
44 A buffer for storing data in GL memory. Putting vertex and index data in
45 buffers can improve rendering performance. The VertexArray, Mesh and
46 UniformBlock classes contain built-in support for buffers.
50 friend class BufferRange;
58 static const Buffer *bound[5];
65 static void require_buffer_type(BufferType);
68 /** Returns the OpenGL ID of the buffer. For internal use only. */
69 unsigned get_id() const { return id; }
71 /** Returns the default binding type for the buffer. */
72 BufferType get_type() const { return type; }
74 /** Sets the usage hint of the buffer. It will take effect the next time
75 the buffer's contents are defined. */
76 void set_usage(BufferUsage);
78 /** Uploads data into the buffer, completely replacing any previous
80 void data(unsigned, const void *);
82 /** Overwrites part of the buffer data with new data. The buffer size can
83 not be changed with this call. */
84 void sub_data(unsigned, unsigned, const void *);
86 unsigned get_size() const { return size; }
88 BufferRange *create_range(unsigned, unsigned);
90 void *map(BufferAccess);
93 /** Binds the buffer in its default slot. */
94 void bind() const { bind_to(type); }
96 /** Binds the buffer in an alternate slot. */
97 void bind_to(BufferType) const;
99 /** Unbinds the buffer from its default slot. */
100 void unbind() const { unbind_from(type); }
102 static const Buffer *current(BufferType);
103 static void unbind_from(BufferType);
105 static const Buffer *&binding(BufferType);
106 static bool set_current(BufferType, const Buffer *);
111 A proxy for a subset of a buffer. Can be bound for use with uniform blocks.
120 static std::vector<const BufferRange *> bound_uniform;
123 BufferRange(Buffer &, unsigned, unsigned);
126 void data(const void *);
128 void bind_to(BufferType, unsigned);
130 static const BufferRange *current(BufferType t, unsigned i) { return binding(t, i); }
131 static void unbind_from(BufferType, unsigned);
133 static const BufferRange *&binding(BufferType, unsigned);
134 static bool set_current(BufferType, unsigned, const BufferRange *);
137 static unsigned get_n_uniform_buffer_bindings();
138 static unsigned get_uniform_buffer_alignment();